web基础漏洞-验证码爆破
1、介绍
验证码爆破,服务端未限制验证码的有效时间和可试次数,导致攻击者可以持续请求验证,从而获取正确验证码。
2、简单测试
如果假设存在验证码爆破漏洞,直接对所有可能的验证码爆破,直到响应发生变化以获取登录凭证。
这是真实需要获取验证码时所必须的操作,但一般来说渗透测试更多的是偏向于验证漏洞存在,要求尽可能减少请求以降低对目标站点的干扰。即使是真实攻击,那么基于优化操作可以平衡整体的投入和产出,并不能预期的确定其就存在验证码爆破漏洞。
3、优化测试
3.1 确定有效次数
如果有效次数被限制,一般是直接放弃,除非存在其它逻辑问题
测试方法:
- 对于开发者来说,要么准确设置了验证码次数限制,要么直接未设置限制。
- 次数限制一般在20以内,那么一般以22为界限,第23次测试时使用真实验证码,如果有效,基本说明开发时为限制
- 同时测试验证码,在有效次数内和外是否存在变化
3.2 确定有效时间
如果验证码的有效时间是紧迫的,那么要么提高爆破单位时间的测试个数,要么直接放弃。
测试方法:
- 假定有效时间是n分钟,那么请求服务端发送验证码,n分钟后测试真实验证码是否有效。
- 一般依次测试5分10秒,15分10秒和30分10秒
- 同时测试验证码,有效时间内和外是否存在变化。
3.3 确定平均网络延迟
如果验证码的有效时间虽然限制但相对充裕,有效次数未限制,那么网络延迟会成为重要的影响因素,决定是否进行测试以及切换网络、多线程等操作。
3.4 确定是否存在逻辑漏洞
(1)验证码覆盖
如果对同一手机号或邮箱,前面请求的验证码仍然有效,那么相当于一个手机号或邮箱可以匹配多个验证码的任意一个即可,大大降低爆破难度
(2)获取验证码频率
(3)验证码未刷新
某些场景中,攻击者短时间重复获取验证码,服务端前后发送一致的验证码。
如果重复请求时刷新上一验证码的测试次数和时间,那么可以低频爆破,然后间隔刷新。
4、防护
- 使用较长的验证码,6位优于4位
- 设置验证码爆破次数和有效时间
- 限制每天或者每小时可以获取的验证码次数
- 超出有效时间或有效次数、使用过的验证码进行删除或者标记无效处理
- 请求获取验证码时,必须重新生成,以及对上一个获取的验证码进行删除或者标记无效处理