总字符数: 4.20K
代码: 0.14K, 文本: 2.74K
预计阅读时间: 13 分钟
逻辑漏洞的本质
所有Web应用程序都通过逻辑实现各种功能.每个阶段都会执行数目庞大的逻辑操作.
这些逻辑代表着一个复杂的受攻击面. SQL注入和XSS类漏洞,它们具有容易辨别的签名,人们对它们的利用方法也进行了广泛的研究.
但逻辑程序的逻辑缺陷更难以识别:每一种缺陷似乎都是唯一的.
程序开发者会认为,如果出现A,一定就会有B,因此我执行C. 但实际上,攻击者会制造出X. 所以简单来讲,逻辑漏洞可以理解为不按套路出牌.
为此在逻辑漏洞的学习时候,并不推荐按照注入类漏洞的方法学习,而更建议通过案例类的方案进行学习.
逻辑漏洞的案例
验证码相关
验证码正确逻辑:
验证码可能存在的漏洞
验证码机制主要用于用户身份识别,这里主要指短信验证码和邮箱验证码等.
短信轰炸绕过
注册、忘记密码、修改密码处,均存在发送短信验证,可能会设置参数值的不同,来判断是执行什么样的功能.比如type=1是注册,type=2是忘记密码,type=3是修改密码等.我们可以通过修改参数值,来绕过一分钟内只发送一次限制,达到短信轰炸的目的
防护手段:
- 验证码(图形验证码、滑行验证码)
- 限制单一手机号一定时间内的发送次数上限(比如有效期30分钟内只允许获取一次)
- 设置对同一手机号发送短信的最小时间间隔(比如间隔为3分钟)
验证码爆破
验证码在响应包中明文返回
验证码绕过
参数污染
在获取短信验证码的功能点出进行参数污染.比如重放参数为mobile,重放的时候可以:mobile=1772&mobile=1343两个手机号可同时收到验证码,且验证码一致,挖到这个洞即可造成任意用户登录
参数污染的方式:- mobile=177******2&mobile=134******3
- mobile=177*******2,134*******3
- mobile=177*******2%09134*******3 //%09是tab,这里用换行、tab、null都可以测试
暴力破解
漏洞原理
利用大量猜测和穷举的方式来尝试获取用户口令的攻击方式,身份验证模块设计的不好,攻击者可以利用自动化攻击进行暴力破解,大大增加了密码被破解的风险
攻击场景
- 无任何防护情况下,可利用密码字典针对单个用户进行密码的暴力破解
- 对单个用户有密码错误次数上限,可利用用户名字典暴力破解出弱口令账号
防御方法
锁定机制
如限制单位时间内执行某项操作的次数(如果次数超过则对账号或IP进行一段时间的锁定,锁定时间内不得使用相关功能,应对限制方式、次数和计算方法、锁定时间等进行明确的说明)
人机识别措施
如图片验证码、重力感应、短信验证码、语音验证码等,为了提升用户体验,对于一些低风险的操作,可以设定单位时间内执行操作次数的阈值,超过阈值后再进行人机识别措施.
任意密码重置
抓包改包类
在某次的安全测试中,我们遇到了一个非常典型的任意密码重置类漏洞.在网站的忘记密码
能分析出来网站的工作过程如下:
- 用户通过输入手机号来请求短信验证码。
- 接着,用户在网站上输入接收到的验证码。
- 如果输入的验证码与服务器保存的值匹配,用户则被允许设置新密码。
网站的安全假设是,用户能够提供一个独特的信息——短信验证码,这被用来验证操作者的身份,然而,存在一个漏洞。
当一个真正的用户完成上述流程,接收验证码并输入它来设置新密码时,我们发现攻击者可以通过拦截网络请求(抓包)来篡改提交的数据。
具体地:攻击者可以在最终提交修改密码的请求中更改mobile
字段的值,将其设置为目标受害者的手机号。
这样一来,攻击者就能在受害者完全不知情的情况下,更改其账户密码。这表明网站没有恰当地验证密码重置请求的真实性,因而容易遭受攻击
修改返回包状态
上面的案例,是通过修改发送包,而下面的案例来自于过去线下班学生的实践,是一个典型的通过修改返回包的逻辑漏洞.
- 使用网站的正确流程修改帐号 A 的密码,抓包保存正确的返回包.
- 修改返回包的状态码等内容.
- 而当我们想修改账户B的密码,由于没有正确的验证码,从而失败
- 使用burpsuite,将正确的返回包,替换错误的返回包后,即可修改账户B的口令并成功登录.
- 案例:wooyun-2015-0165235
在实际的漏洞挖掘中,类似的场景会出现变形,例如在登录界面,随意输入用户密码后,将false修改为true,亦或者status=0修改为status=1.
敏感信息泄露
在一些逻辑漏洞的场景中,很多时候我们连抓包改包都不需要,某些网站会出现将短信验证码放置于返回包中.
只需要将手机号输入到页面上,返回包中会出现用户的全部注册信息,这会包括手机号、姓名、邮箱、身份证号等等.
修复建议
- 用户操作个人信息(读取、修改)时,服务端要对当前用户身份进行验证,防止越权操作;
- 用来标识用户身份的名称或ID可以使用自定义加密,也可以隐藏这些参数,直接从cookie中获取用户信息;
- 用户修改密码时应该先对旧密码进行验证,或者使用手机短信验证;
- 用户修改手机号时需要先对原手机号进行验证.
- 修改整个密码重置流程,不要将用户进行直接在返回包中明文展示
支付漏洞
根据实现的方式,支付漏洞可以分为如下几类:
- 修改购买数量
- 修改支付价格
- 修改商品id|订单id
- 修改支付的状态
- 重复支付&&条件竞争
- 修改附属优惠、领取优惠
- 签约漏洞
一元
网站的业务版块中,很常见的功能为在线购买及支付.而在其中典型的逻辑漏洞方式为修改支付金额,从而造成极低的价格购买高价值产品.
那么此时我们可以思考为什么会产生这个问题?而又该如何进行修复?
负数
在网站的支付功能模块中,往往也会出现类似于钱包的功能,用户可以通过提前充值,而购买时使用钱包中的金额进行支付,而无需在线支付.
那么此时我们可以思考为什么会产生这个问题?而又该如何进行修复?
修改购买数量
修改购买数量的方式有很多种,这里提供几个常见的思路.
- 修改购买数量为负数
购买商品正负相抵
直接购买负数商品造成余额增加
- 修改购买数量为大数
- 这里有个整数溢出的概念,int的范围为
-2147483648~2147483647
,可以把他理解为一个循环,也就是2147483647=-2147483647,但是有时支付里没有负数就从0开始计算了,这里我们只需把购买的数量改为2147483647/[单件价格]+1即可。
- 这里有个整数溢出的概念,int的范围为
- 修改购买数量为小数
- 这里有个四舍五入的概念,例如买1.5件商品会变为2件商品,而价格还是1.5件商品的价格。
条件竞争(并发)
条件竞争的原理说到底是高并发状态下对同一资源的读取写入问题.
BURP插件:Turbo Intruder
签约漏洞
比如一个会员,正常价格是30,首月只需15元,那我们一个号先登录手机A,进入首充界面,跳转到支付宝支付界面,别支付,停在此处。
此时换另一个手机B登录该账号(此时A手机上的该账号可能会被顶下,但是无所请,因为已经进入支付宝的支付界面了),手机B一样进入首充,跳转到支付宝界面,此时A和B者支付,可能就能张得两个月的会员。
如下图,正常逻辑是以新用户身份创建订单,支付,再创订单时后台判断你不是新用户,无法成功,绕过逻针就是以新用户身份同时下单两次不支付
正常逻辑:
绕过逻辑:
越权漏洞
- 越权漏洞的核心是用户提交的参数中包含身份辨别参数,可篡改,且后端没有针对这个鉴权
- 相对水平越权,垂直越权实现的方式除了改参数可能还有未授权(比如后给管理员操作的接口)
- 未授权的挖掘在于接口的发现以及fuzz参数,附带一些可能可以绕过鉴权的小操作。
- 碰见加密传输莫慌,js中慢慢寻找总能有答案。
垂直越权
java绕过鉴权路由后加:**..;或;或/**
如果A用户的权限高于B用户,B用户越权操作A用户的权限的情况称为垂直越权.
那么此时我们可以思考为什么会产生这个问题?而又该如何进行修复?
水平越权
如果A用户的权限等于B用户,B用户越权操作A用户的权限的情况称为水平越权.
前后文越权
在很多国内所制作的逻辑漏洞脑图中,往往将越权类的逻辑漏洞分为垂直与水平越权两类.
而第三种前后文越权
的类型由于比较少见,往往会被人们忽略.
很多时候,网站往往会存在基于顺序的逻辑,前后文越权的漏洞逻辑在于攻击此顺序,尝试跳过一些关键步骤.
JS逆向
**网站注册发现了密码加密,f12打开调试器,审查一下有无可疑文件,发现了register.js
打开,浏览一遍,找可疑字段,在93行发现了对password
二次赋值,下个断点,点击注册
发现了一个可疑变量,控制台打印一下
可以发现是一个类似于加密用的东西,并且下面的函数也传入了这个变量,鼠标点击encryptedString
,跟进查看一下,鼠标悬停在函数名上,点击小箭头
可以发现第一个参数传入的是key,第二个参数传入的是string
我们在控制台里调用此函数并把可疑变量publicKey
当做参数key传入进去,即可得到秘钥,返回控制台,继续跟进下一步,查看他返回的密文和我们自己控制台生成的密文是否一样
在对比器中可以发现字符一模一样,逆向成功
逻辑漏洞的总结
逻辑漏洞的挖掘确实依赖于对应用程序逻辑深入的理解和分析,因为这类漏洞往往不会有明显的指纹,而是隐藏在正常功能的误用或设计缺陷中。
使用Burp Suite等工具手动测试应用程序是检测逻辑漏洞的有效方法,这允许测试者审查和修改HTTP请求,以揭示潜在的逻辑错误。
下面是逻辑漏洞挖掘的大致流程:
- 功能模块分析:理解应用程序的功能模块和它们如何交互。
- 正常用户使用流程分析:以正常用户的行为模式使用应用程序,同时抓取网络数据包。
- 参数与逻辑分析:分析网络请求中的每个参数,以及它们关联的后端逻辑如何响应这些输入。
- 测试方案设计与尝试:基于上述分析,设计测试场景以尝试不同的输入和用户行为,查看应用程序如何响应非预期的行为。