Files
security-book/02.WEB安全/14.逻辑漏洞.md
2025-08-27 14:13:17 +08:00

375 lines
17 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 14.逻辑漏洞
## 1. 业务逻辑漏洞
#### 1.1 漏洞成因
逻辑错误漏洞是指由于程序逻辑不严谨或逻辑太复杂,导致一些逻辑分支不能够正常处理或处理错误。通俗地讲,一个系统的功能太多后,程序开发人员难以思考全面,对某些地方可能有遗漏,或者未能正确处理,从而导致逻辑漏洞。逻辑漏洞也可以说是程序开发人员的思路错误、程序开发人员的逻辑存在漏洞。
#### 1.2 特性
逻辑漏洞非常隐蔽,危害巨大,且无法被 WAF 等安全设备拦截。逻辑漏洞覆盖面很广,一直以来对于逻辑漏洞尚未产生明确的分类。其大致包括了:绕过功能限制、遍历、越权、弱口令、信息泄漏、任意用户密码重置、竞争性问题等。在一些场景下,由于功能本身设计复杂、易于出现纰漏,导致针对特定场景下的特定逻辑漏,如支付漏洞、验证码绕过漏洞等。
## 2. 账户
### 2.1 注册账户
#### 2.1.1 注册覆盖
注册重复用户名对用户数据进行覆盖
#### 2.1.2 注册遍历
进行注册的时候注册重复的用户名会提示用户名已被注册,我们可以利用该方法猜测用户名。如果可以批量提交,将会产生严重问题。
### 2.2 登陆账户
#### 2.2.1 登陆认证绕过
##### 2.2.1.1 直接访问登陆后的界面
一般登陆界面登陆成功后会进行跳转到主页面例如main.php。但是如果没有对其进行校验的话可以直接访问主页面绕过了登陆认证。
##### 2.2.1.2 前端认证
登陆状态如果只以登陆状态码进行判断登陆成功标识,那么修改登陆状态码就能进行登录。
##### 2.2.1.3 暴力破解
暴力破解,又叫撞库、穷举,使用大量的字典逐个在认证接口尝试登录,理论上,只要字典足够强大,破解总是会成功的。
撞库:黑客从别的站点获取到用户名和密码,然后用于爆破别的系统。
阻止暴力破解的最有效方式是设置复杂度高的密码(英文字母大小写、数字、符号混合)并且同时设置验证码使其无法批量提交数据。
靶场地址dvwa
打开 burpsuite 抓包
输入任意用户名和密码,点击 login
![image-20240420171416733](14.逻辑漏洞/image-20240420171416733.png)
将抓到的包发送到 Intruder 模块
![image-20240420171422339](14.逻辑漏洞/image-20240420171422339.png)
Clear 原来的 tag选择 Cluster bomb 模式
![image-20240420171427218](14.逻辑漏洞/image-20240420171427218.png)
为 username 和 password 添加 tag
![image-20240420171433746](14.逻辑漏洞/image-20240420171433746.png)
设置 payload加载字典设置完成后点击 Start Attack
![image-20240420171438669](14.逻辑漏洞/image-20240420171438669.png)
根据长度判断用户名密码应该是 admin/password
![image-20240420171444655](14.逻辑漏洞/image-20240420171444655.png)
##### 2.2.1.4 身份凭证可伪造
当用户登录后在服务器就会创建一个会话session叫做会话控制接着访问页面的时候就不用登录只需要携带对应的 cookie 去访问。如果 cookie、session 等代表用户身份的凭证被设置的过于简单,或者有一定规律,就可以被黑客猜测出来,从而修改、伪造身份。
靶场地址DVWA
Lowcookie 里面有一个 dvwaSession 的字段,点一下 Generate value 就 +1
![image-20240420171449462](14.逻辑漏洞/image-20240420171449462.png)
MediumdvwaSession 是个时间戳
![image-20240420171454112](14.逻辑漏洞/image-20240420171454112.png)
HighdvwaSession 是经过 md5 加密的,但是过于简单可被破解
![image-20240420171458368](14.逻辑漏洞/image-20240420171458368.png)
![image-20240420171503877](14.逻辑漏洞/image-20240420171503877.png)
#### 2.2.2 验证码
##### 2.2.2.1 图形验证码
###### 2.2.2.1.1 前端可以获取验证码
验证码直接出现在 html 源码中或者隐藏在 Cookie 中,或者验证码使用前端校验
靶场地址pikachu
查看前端 JS 源码,发现验证码是使用的前端 JS 校验,**前端校验等于没有校验**,解法有如下几种:
- 因为验证码是前端校验的,可以抓包删除掉验证码
抓取登录包,发送到 Repeater 模块
![image-20240420171509538](14.逻辑漏洞/image-20240420171509538.png)
删除掉验证码,重放,发现返回包的长度和删除验证码之前是一样的
![image-20240420171514123](14.逻辑漏洞/image-20240420171514123.png)
删除掉验证码,重放
![image-20240420171518931](14.逻辑漏洞/image-20240420171518931.png)
- 直接删除掉 JS 代码或者禁用 JS
-
###### 2.2.2.1.2 **图形验证码可识别**
这种验证码由于没有对其做模糊处理,导致可以利用脚本直接识别
1. OCR 识别
2. xp_CAPTCHA 4.2 - Burp验证码识别插件
免费版:[https://github.com/smxiazi/NEW_xp_CAPTCHA](https://github.com/smxiazi/NEW_xp_CAPTCHA)
收费版:[https://github.com/smxiazi/xp_CAPTCHA](https://github.com/smxiazi/xp_CAPTCHA)
###### 2.2.2.1.3 验证码重复利用
有的网页只要不刷新,验证码就能重复被利用。通常情况下,系统会比对 session 和用户输入的验证码值,当服务器端受理请求后,没有将上一次保存的 session 及时清空,将会导致验证码可重复使用
修复建议:当服务器端处理完一次用户提交的请求之后,及时将 session 域中的验证码清除,并生成新的验证码。
靶场地址pikachu
使用 burpsuite 抓包,开启 Intercept
![image-20240420171523440](14.逻辑漏洞/image-20240420171523440.png)
将抓到的包发送到 Repeater 模块,反复重放,发现返回包长度并没有变化,页面提示也是用户名或密码不存在,猜测验证码可以反复使用
![image-20240420171527313](14.逻辑漏洞/image-20240420171527313.png)
![image-20240420171530979](14.逻辑漏洞/image-20240420171530979.png)
将抓到的包发送到 Intruder 模块进行爆破
![image-20240420171535749](14.逻辑漏洞/image-20240420171535749.png)
跑出密码为 123456
![image-20240420171540106](14.逻辑漏洞/image-20240420171540106.png)
##### 2.2.2.2 短信验证码
1. 短信验证码可重复利用
如果服务端未对短信验证码的验证时间/次数进行限制,那么我们就可以利用其进行爆破。
此处测试方法等同图片验证码的测试
2. 短信验证码与用户未绑定
一般来说短信验证码仅能供自己使用一次,如果验证码和手机号未绑定,那么就可能出现如张三的手机的验证码,李四可以拿来用的情况。
修复建议:
作为一个安全的短信验证码,他的设计要求应该满足如下几点:
用户获取的短信验证码只能够供自己使用
用户短时间内获取的多条短信只有最新的一条能使用
短信验证码设置为6位数有效期30分钟甚至更短当验证码失败3次后失效。
### 2.3 密码找回/修改
找回密码的验证码为四位数字可爆破真实验证码;
采用本地验证,可以先尝试修改自己的帐号密码,保存正确的返回包,然后修改他人密码的时候替换返回包;
最终修改密码的数据包以另外的ID作为身份判断例如userid而该ID在别处可以获取到
接受验证码的手机号修改为自己的号码,然后输入自己的号码接收到的验证码去进行密码重置;
获取验证码的时候会生成一个身份标识例如cookie值那么我们就替换他人账号的身份标识重置他人的密码
#### 2.3.1 找回密码
##### 2.3.1.1 短信找回密码
类似短信验证码可以重复使用,攻击者就可以修改用户的密码。短信验证码未与用户绑定,攻击者可以利用其他用户的包来修改本用户的密码。
##### 2.3.1.2 用户名找回密码
随便输入一个用户他有一个包检验用户是否存在,这里回显了用户全部信息。
这里的问题在于查询用户处,回显了多余的个人信息。
##### 2.3.1.3 邮箱找回密码
如果邮件中的重置密码链接未使用 token参数让链接具有唯一性或者是 token 可预测,会导致链接可以直接被猜解访问。重置时验证码过于简单,如纯 4 位数字,则容易遭受验证码被穷举风险。
###### 2.3.1.3.1 cms 实战
靶场地址semcms
源码分析
lnlq_Admin/index.html 文件
从代码可以看到,当点击登录按钮旁边的链接"如果忘记账号与密码,试试找回?",时,会执行 js 的 views() 函数该函数是弹出一个对话框并向SEMCMS_Remail.php?type=find 发送请求,让用户填写要接收重置后密码的邮箱地址
![image-20240420171550365](14.逻辑漏洞/image-20240420171550365.png)
![image-20240420171554600](14.逻辑漏洞/image-20240420171554600.png)
点击确认找回,提交到了这个 URL
```php
../Include/web_email.php?type=fintpassword
```
查看找回密码的代码,代码会根据用户输入的 E-mail 地址,查找 sc_user 表,看是否存在使用该 E-mail 地址的用户,如果存在,则随机生成 4 位数的认证码,并将其拼接到一个密码重置链接中,最后以邮件的形式发送给用户。用户点击邮件中的密码重置链接即可;但如果不存在,则弹出对话框,提示“此邮箱不存在!”
![image-20240420171558530](14.逻辑漏洞/image-20240420171558530.png)
认证码是随机的四位纯数字,很容易联想到爆破,但是每次重新进入到这里的时候认证码就会随机生成,难以利用。再回到 index.html 中
![image-20240420171602965](14.逻辑漏洞/image-20240420171602965.png)
当请求参数 type=ok 时SEMCMS_Remail.php 后面跟的参数 type 也是ok而前面提到这种情况下SEMCMS_Remail.php 会构造另外一个表单,如下:
![image-20240420171606841](14.逻辑漏洞/image-20240420171606841.png)
点击确认找回按钮,数据提交到
```php
../Include/web_email.php?type=findok
```
web_email 部分密码找回部分的代码如下
![image-20240420171613007](14.逻辑漏洞/image-20240420171613007.png)
密码是经过 md5 加密后才存入数据库的,但是如果认证码正确就能将密码改掉。尝试使用 burpsuite 爆破这里的认证码从而修改掉密码
查看数据库,原先的密码是 1234
![image-20240420171622305](14.逻辑漏洞/image-20240420171622305.png)
![image-20240420171628137](14.逻辑漏洞/image-20240420171628137.png)
使用 burpsuite 跑包,抓取重置密码的包,验证码处添加 tag进行爆破
![image-20240420171632421](14.逻辑漏洞/image-20240420171632421.png)
验证码正确与否,返回包长度和状态码都是一样的
![image-20240420171637829](14.逻辑漏洞/image-20240420171637829.png)
查看数据库,密码已经变成了我们改的数据 11111
![image.png](https://cdn.nlark.com/yuque/0/2023/png/35303923/1691291620874-b1ef8812-0a41-4729-94ed-c3fbb4f32863.png#averageHue=%23ebe6e5&clientId=u360bff62-327d-4&from=paste&height=60&id=u5ae09c58&originHeight=90&originWidth=1519&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=26989&status=done&style=none&taskId=u511f84bb-170b-4309-9ff8-ccd444bac01&title=&width=1012.6666666666666)
![image-20240420171642623](14.逻辑漏洞/image-20240420171642623.png)
##### 2.3.1.4 越权修改密码
有时候开发再写代码时,会直接用到某一参数直接调取该参数对应的数据,而再调用时并不考虑当前登陆用户是否有权限调用。这就导致了,可以利用抓该包工具,将传递给后台的数据进行修改,修改后可以查看原本自己没有权限看到内容。
##### 2.3.1.5 修改密码未验证旧密码
修改密码前应该先对用户身份进行再次校验,如验证旧密码。
## 3. 交易
### 3.1 购买
#### 3.1.1 支付逻辑漏洞
##### 3.1.1.1 靶场练习
靶场地址:
访问 niushop登录。选择任意一件商品购买提交订单。
![image-20240420171647789](14.逻辑漏洞/image-20240420171647789.png)
打开 burpsuite再选择一件商品开启 intercept 拦截数据包,点击立即购买,将数量改为 0.001
![image-20240420171654898](14.逻辑漏洞/image-20240420171654898.png)
数量真的变成了 0.001,相应价格也变成了 0.1 元
![image-20240420171700237](14.逻辑漏洞/image-20240420171700237.png)
点击提交订单,生成一个价格为 0.1 的订单。点击去支付
![image-20240420171706628](14.逻辑漏洞/image-20240420171706628.png)
记下支付流水号
![image-20240420171710920](14.逻辑漏洞/image-20240420171710920.png)
回到刚刚第一个数量正常的订单,开启 intercept 拦截数据包,点击去支付
![image-20240420171716977](14.逻辑漏洞/image-20240420171716977.png)
将此处的支付流水号改为刚刚我们记录下来的流水号
![image-20240420171720892](14.逻辑漏洞/image-20240420171720892.png)
放包,发现支付流水号变成了刚刚的,订单金额也变成了 0.1
![image-20240420171725159](14.逻辑漏洞/image-20240420171725159.png)
## 4. 越权
### 4.1 未授权访问
### 4.2 越权访问
该漏洞是指应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定。越权访问漏洞主要分为水平越权访问和垂直越权访问。
#### 4.2.1 水平越权
定义:水平越权就是相同级别(权限)的用户或者同一角色的不同用户之间,可以越权访问、修改或者删除的非法操作。
危害:如果出现此类漏洞,那么可能会造成大批量数据泄漏,严重的甚至会造成用户信息被恶意篡改
挖掘思路:替换鉴权参数,定位出鉴权参数,然后替换为其他账户鉴权参数的方法来发现越权漏洞
假设用户A和用户B属于同一角色拥有相同的权限等级他们能获取自己的私有数据数据A和数据B但如果系统只验证了能访问数据的角色而没有对数据做细分或者校验导致用户A能访问到用户B的数据数据B那么用户A访问数据B的这种行为就叫做水平越权访问。
##### 4.2.1.1 靶场练习
靶场地址pikachu
先登录,点击提示有用户名和密码
![image-20240420171731803](14.逻辑漏洞/image-20240420171731803.png)
登录了 lucy 的号,查看个人信息
![image-20240420171736303](14.逻辑漏洞/image-20240420171736303.png)
将名字改成 lili个人信息也变成 lili 的了
![image-20240420171740888](14.逻辑漏洞/image-20240420171740888.png)
#### 4.2.2 垂直越权
垂直越权是一种“基于URL的访问控制”设计缺陷引起的漏洞又叫做权限提升攻击。
由于后台应用没有做权限控制或仅仅在菜单、按钮上做了权限控制导致恶意用户只要猜测其他管理页面的URL或者敏感的参数信息就可以访问或控制其他角色拥有的数据或页面达到权限提升的目的。
##### 4.2.2.1 靶场练习
登录管理员用户
![image-20240420171745378](14.逻辑漏洞/image-20240420171745378.png)
管理员有添加用户功能
![image-20240420171749969](14.逻辑漏洞/image-20240420171749969.png)
尝试添加一个用户
![image-20240420171753827](14.逻辑漏洞/image-20240420171753827.png)
用 burpsuite 抓取添加用户的包并且发送到 repeater
![image-20240420171757804](14.逻辑漏洞/image-20240420171757804.png)
退出管理员用户,登录普通用户,抓取普通用户的 cookie并且替换刚刚抓取的修改密码的包的对应 cookie 位置
![image-20240420171801890](14.逻辑漏洞/image-20240420171801890.png)
重放
![image-20240420171806743](14.逻辑漏洞/image-20240420171806743.png)
以普通用户身份添加用户成功
![image-20240420171811328](14.逻辑漏洞/image-20240420171811328.png)
##### 4.2.2.2 cms 实战
靶场地址:熊海 cms
[http://d22.s.iproute.cn/admin/?r=login](http://d22.s.iproute.cn/admin/?r=login)
源码分析,如果 cookie 为空,则跳转到登录页面
![image-20240420171815533](14.逻辑漏洞/image-20240420171815533.png)
访问靶场,右键检查,查看 cookie此处 cookie 为空,尝试伪造任意一个 cookie
![image-20240420171819588](14.逻辑漏洞/image-20240420171819588.png)
可以直接访问 [http://d22.s.iproute.cn/admin/?r=index](http://d22.s.iproute.cn/admin/?r=index) 读取后台内容
![image-20240420171824110](14.逻辑漏洞/image-20240420171824110.png)
如果将 cookie value 改成 admin能够以管理员身份访问
![image-20250619150207776](14.逻辑漏洞/image-20250619150207776.png)