验证码不失效
造成原因:找回密码的时候获取的验证码缺少时间限制,只判断了是否正确,未判断验证码是否过期,也就是说验证码的时效性很长(在很长一段时间里不会改变)
测试方法:通过枚举找到真正的验证码输入验证码完成验证
案例:以下案例在点击获取手机验证码后,Response包里直接抓取到了手机验证码。
这种验证码不失效而且验证码是4位数的情况下, 直接爆破 看包的返回长度或者内容来找到正确的验证码。这里返回包是0,代表正确
总结
这种验证码不失效的情况现在已经是非常少见的了,而且验证码的位数也很少有简单的4位验证码了。现在绝大多数是这样的:6位数的验证码而且15分钟内有效,这样子的话爆破的可能性就非常的低了。
验证码直接返回
在Response(返回包)里直接拿到验证码
验证码未绑定用户
案例:
另一个案例:
此案例的用户名是加密的。
其实大部分这种情况我们都不需要知道加密算法,比如这里例子,得到liuyy的加密后的值是80e688602c4b11e66320c421e3b71ef2,那么我们就可以直接利用这个keyCode参数了。
步骤是一样的,输入我们的用户名和收到的验证码,然后把我们的keycode替换为liuyy的那个keycode,这样就可以重置liuyy的密码了。(漏洞原因还是是判断了验证码是否正确,而没有判断该验证码是否跟该用户匹配。)
总结
这种情况没有遇到过,学习了,以后在找回密码的时候会这么测试的。现在看来对于白帽子来说有 2 个手机号是多么的方便了。
案例二中如何获取到其他用户的keyCode呢?这里的话正常走一遍找回密码的流程,然后抓包就会在数据包中找到加密后的keyCode了,这样就可以重置任意用户的密码了。
修改接收的手机或邮箱
案例:
点击找回密码,首先我们输入zhangwei(我们不知道zhangwei的手机号码),然后点击获取验证码,这个时候把手机号改为我们自己的号码,输入我们自己的号码和验证码,成功跳到重置密码的页面,密码重置成功。
本地验证的绕过
案例:
这里我们所做的就是把0修改为1,可以借工具修改返回包,我们把0改为1,Forward防包,然后查看页面,成功跳转到修改密码的页面,输入新密码即可修改用户13888888888的密码
总结
who_jeff曾经分享给过这样一个类似的案例,他是在一个安卓app上进行抓包测试的,当时就直接修改返回包 来欺骗本地的app客户端的,成功重置任意用户的密码。
跳过验证步骤
案例:
总结
这个漏洞不用按照正常的流程来走,这里的话直接补齐设置新密码的链接,然后利用这里链接可以直接重置任意用户的密码。
未校验用户字段的值
案例:
总结
这里的话关键是在最后一步重置密码的时候替换目标手机号,这种其实也是比较暴力的,拿到这个链接的话 可以无条件批量重置任意用户的密码,这里面利用burp可以批量枚举手机号码的mphone参数。
修改密码处id可替换
案例:
总结
这种也比较暴力流氓,可以通过枚举id的值 ,来大批量重置任意用户密码的漏洞,因为不需要用户名了,只需要知道id值即可,危害比较大。
cookie值的替换
案例:
总结
关键点:cookie
可指定用户获取, 尝试用他人账号来找回密码的时候,抓取数据包,可以从中提取出cookie
值,然后就可以利用这个cookie
值,就可以重置指定用户的密码了。
修改信息时替换字段值
案例:
总结
最后一种要稍微复杂一点,得去找到隐藏参数:loginId 然后再修改数据包,以后挖洞的时候,多留意这些。