1. 关于逻辑漏洞
简单说,就是让程序按照非预期执行所导致的漏洞,就是逻辑漏洞, 这里直接理解比较抽象,这里用最近比较火的一个小游戏举例子, 游戏内容很简单,就是有两关的三消游戏,其中第一关很简单,第二关难度飙升。 这里我们使用burpsuit
抓取数据包
那么他的底层逻辑是如何实现的呢?我们可以抓数据包,这时候就会发现小程序在开始游戏的时候主要是请求了两个数据包, 一个是 80001
, 一个是 90018
, 看参数名我们可以知道,这就是第一关和第二关的地图ID , 在我们通关后,就会发送请求数据。
因此我们有一个设想,这破游戏主要是第二关比较难 , 那么如果我们替换了第二关的地图ID,那么会不会就会变得简单呢? 两个数据包之间有时间显示,手动修改数据时间来不及,这里我们采用burpsuit
设置中的正则替换功能:
让https
流量进过 burpsuit
. ,开始游戏 ,这时候发现第二关地图变成了第一关,轻松通关
当写出这篇文章的时候,这招已经不灵了。所以也不用再实验了(狗头) , 但是其实在更新为最新版本后,还是可以绕过的,逻辑还是修改地图, 当然,除了这种方式,还有很多其他方式来进行“开挂”: 修改内存达到任意三消,无限道具,修改本地缓存文件达到任意通关,抓通过数据包,无限刷关等等, 这些方式的大多中情况,都可以归根到逻辑漏洞中。
通过上面的案例,相信我们对逻辑漏洞的成因和影响已经有了一定的了解,那么下面我们介绍一些常见的逻辑漏洞类型。
2.越权类
在一个系统中,我们往往会预设一些不同权限的账号,用于不同功能,但是在一些情况下,我们往往只是在登陆进行了校验,然后就在前端编写接口信息,但是在后端没有任何校验,这就导致了权限的问题。或者是组之间的权限没有做好校验,总之就是权限校验失误所导致的问题。
2.1 未授权漏洞
指的是未经过登陆等验证过程,获取了相应的资源的行为,我们可以称之为未授权问题。常见的未授权功能如下:
- 资源下载: 任意文件读取 , 敏感信息泄漏 , 数据库的CURD功能等等
- 接口访问: 测试/操作功能 , 需要修改的功能
【案例一】 蓝凌OA未授权访问 - 路由设置问题导致的代码执行漏洞
这里比较有趣的是绕过的某品牌的VPN,后来是发现这个VPN吧payload识别为JS所以没拦截, 后续看代码大致是后台的一个反序列化内容被未授权利用导致的问题(后续有时间详细写下),这里也体现了蜜罐和HIDS设备的重要性了。
【案例二】权限设置失效导致的问题 - 某系统使用Authorization(OAuth2)
来进行验证,但是只是在登陆系统进行了验证,导致可以未授权获取管理员密码,重置任意账号密码
POST /xxxxxxx/user/queryLikeUserList HTTP/1.1
Host:xxxtest.xxxxxx.com
Connection:keep-alive
Content-Length:74
sec-ch-ua:" Not A;Brand";v="99", "Chromium";v="98", "Google Chrome";v="98"
Pragma:no-cache
sec-ch-ua-mobile:?0
Authorization: 注意这里直接为空,也不会进行验证
Content-Type:application/json;charset=UTF-8
Accept:application/json, text/plain, */*
Cache-Control:no-cache
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36
NK-Channel:ClientTestCenter
sec-ch-ua-platform:"Windows"
Origin:https://xxxx.xxxxxxx.com
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9
{"userChnName":"","loginNo":"admin","status":"","pageNum":1,"pageSize":10}
在没有Authorization验证 ,的情况下,直接访问后台接口获取数据(貌似是直接判断Authorization不为空就放过所导致的问题)
【案例三】常见于测试环境,测试代码, 由于开发或者运维等等问题导致的测试隐藏代码未删除,引用到生产环境导致的问题 , 比如某SRC平台测试套餐可以正常使用:
【案例四】常见组件系统未授权 ,还有很多就没列出来
SpringBoot Actuator 未授权访问
SwaggerUI未授权访问漏洞
Harbor未授权添加管理员漏洞
druid 未授权访问
LDAP 未授权访问(389)
ZooKeeper 未授权访问(2181)
Docker 未授权访问(2375)(5000)
Kibana 未授权访问(5601)
Redis 未授权访问(6379)
Weblogic 未授权访问(7001)
JBoss Jenkins 未授权访问(8080)
Kubernetes Api Server 未授权(8080、10250)
Elasticsearch 未授权访问(9200、9300)
这里以 SpringBoot Actuator 未授权访问 作为案例 , 下载内存堆栈文件,使用MemoryAnalyzer工具成功恢复出明文密码,执行下面语句,获得信息如下:
select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("password"))
2.2 垂直越权
指的是使用低权限账号,获取了更高权限的功能的操作行为 , 常见于OA,管理系统,路由器中,往往会对权限没有一定的控制,导致了问题的存在, 垂直越权案例都不咋好展示,我在乌云找到了一些。
【案例一】(乌云案例) 中国电信天翼宽带政企网关A8-B垂直越权 , 使用默认用户名和密码(普通权限,仅读),修改参数id,获得telecomadmin权限(超级管理员权限,可读写)
- 依次点击“对象管理——>用户管理——>编辑‘useradmin’——>得到URL:101.231.147.81/cgi-bin/webif/Objset-users.sh?edituser=edituser&id=5”
- 修改参数id为:id=4,成功垂直越权telecomadmin
- 查看源码,可读取telecomadmin密码:telecomadmin34224223,至此已获得最高管理员权限,可以完全对该设备进行操作
2.3 水平越权
水平越权是最为常见的,往往可以和遍历漏洞结合运用 , 水平越权产生往往是做了用户组的权限验证,但是对同一个组的用户权限没有进行验证,导致了问题的存在。
【案例一】 某平台,在登陆账号后,点击查看资料的界面,是根据用户ID来显示相应的用户资料, 修改用户ID可以看到其他用户信息,同时,我们利用修改密码功能,和修改验证问题漏洞,就可以达到任意用户登陆的目的。
某SRC同类型漏洞,可以越权修改密码保护问题,从而达到登陆账号的目的(图找不到了), 同时,这一类漏洞也可以用于攻击行为,比如在银行业务,越权多次测试APP账号密码,从而达到封禁他人银行卡的目的。旅游看信息,用户脱裤信息泄漏等等,尤其是政府。
3. 遍历 && 并发(条件竞争)
遍历 涉及参数ID, 且有返回信息的情况下,都可以进行遍历测试(数字,字母,有规律的账号信息等都可以进行遍历)。比如常见的测试功能点如下:
- 遍历优惠卷 , 获取隐藏优惠卷
- 遍历用户ID , 获取敏感信息
- 遍历服务套餐, 获取隐藏套餐或者历史套餐
- 薅羊毛活动,在未限制手机号的情况下,遍历获取优惠
这里是某SRC,通过遍历公司ID获取公司信息,从而判断公司是否注册,在根据获取的 compayID
进行进一步操作获取敏感信息
关于并发(条件竞争)
- 指多个线程或者进程在读写一个共享数据时结果依赖于它们执行的相对时间的情形。
- 在Web中沿用这个概念,当多个进程对同一数据进行数据库读写操作时,可能会由于时序问题,造成一些逻辑错误的异常情况。
这里用某SRC会员业务做介绍, 简单说就是第一次购买会员是三个月免费的,但是第二次就需要花费了,这里使用fiddler
获取第一次免费三个月的数据包进行并发,这时候就会有多个免费三个月的数据被相应,导致可以重复刷好几年的会员。还有一种刷会员的方式,就是使用不同端的手机进行刷取。
4. 溢出漏洞
我们都知道,变量在内存中是有存储上限的,针对数量,我们首先要判断是否可以带入正负,再就是是否可以进行溢出操作。
【案例一】王者荣耀符文正数溢出(月神)
在游戏里面通常最大数值就是2147483649,那么正溢出就是假如商品单价为2,那么我要做到的就是2*数量>2147483647,假如买1073741825个*2就是2147483650,在游戏中由于超出了最大值,总价格就会变成了3(超出后从0开始计算),于是去尝试了一下,果然是这样,经过计算后,成功刷到了符文箱。
同理,这种方式也可以使用在支付交易环节 , 2147483647 = 1
是微信支持最大的支付额度,超过就会产生溢出问题。
【案例二】整数校验
使用低于服务器能识别的最小单位,比如服务器只能识别到 0.01 元,你支付了 0.019 元,有可能就四舍五入给你充了 0.02 元,那么恭喜你成功白嫖了 0.001 元的巨款:
5. 返回包修改
在burpsuit
中,我们还可以修改返回包内容,通过修改返回包内容从而达到欺骗客户端的目的,这样我们可能会绕过一些复杂的签名完整性校验,或者是查看后台接口和登录信息(不用费劲的看JS)操作,在burpsuit
中操作如下:
在一些前端页面中,我们可以修改返回包来返回一些前端信息(比如登陆后的界面功能,获取敏感信息接口,寻找未授权问题等等) ,在burpsuit中设置如下:访问目标网页,在代理的拦截选项中右键选择”Respense to this requests“
这一点在VPN, 客户端小游戏中比较常见。
当然逻辑漏洞其实很难用几个类型来概括,这里也只能让大家有一个大致的了解,其实方法和类型还有很多很多,希望大家多多挖掘吧。
6. 参开文章
- 版权声明: 本博客所有文章除特别声明外,均采用「 知识共享署名4.0 」创作共享协议,转载请注明作者及原网址。