验证码生成原理
首先根据标题来看这题的重点在于验证码,并且验证码是在服务端的,所以先来分析一下验证码的生成原理
点击验证码刷新,并抓包
可以看到网站向/inc/showvcode.php
这个路径请求了验证码,发送数据包后,页面中的验证码就会被刷新
访问/inc/showvcode.php
路径,发现刷新一次就会产生一个验证码图片
那整个验证码的请求逻辑就变得清晰了,在正常情况下,填入用户名、密码、验证码后
无论登录成功还是失败,都向/inc/showvcode.php
请求新的验证码
最优解法
这里的常规解法是基于验证码可被复用实现的,但在实际情况下,不是每个验证码功能都存在复用漏洞,故我们在下面会介绍一些通用方法
我们先依然对登录页面抓包,填写正确的验证码
将请求包发送到重放器(Ctrl+R),多次发送发现 HTTP 响应码始终返回 200 ,正常来说,验证码只能发送一组数据,发送后即失效,但此时多次发送服务器仍然正常响应,因此,根据上述条件可判断出此页面存在验证码复用漏洞
HTTP 响应码:信息响应(100–199),成功响应(200–299),重定向(300–399),客户端错误(400–499)和服务器错误 (500–599)
直接发送到 Intruder 模块进行爆破即可,将用户名和密码区域作为 Payload,验证码因为存在复用漏洞不变即可,具体过程不再赘述
通用解法 —— OCR识别验证码
使用工具:
-
ddddocr -
captcha-killer-modified
配置环境
-
下载 captcha-killer-modified.jar 包并导入 Burp Suite(JDK 8) -
导入 Python pip库
Pillow==9.5.0
aiohttp==3.8.3
argparse==1.1
-
搭建验证码识别服务 ddddocr(Python 版本不能高于 3.11
)
pip install ddddocr
-
运行 codereg.py
脚本(Python 3)
python codereg.py
出现======== Running on http://0.0.0.0:8888 ========
即为成功配置 ddddocr
Pikachu 靶场实践
打开 Burp Suite 开始抓包
将用户登录页面的数据包发送到captcha-killer-modified
插件
将 POST 请求的 URL 地址改为验证码的请求路径/inc/showvcode.php
这样才能正确的请求到验证码图片,在实战中需要根据具体情况具体判断,Pikachu 靶场需要这样去请求验证码图片
接口 URL 配置为http://127.0.0.1:8888
,点击识别,检查环境和功能是否正常,若正常则右侧会出现验证码图片和识别结果
Pikachu 靶场默认的验证码均为 6 位,插件默认的识别位数为 4 位,在实战中可以将codereg.py
中的验证码长度改为实际值,这里我们将0:4
改为0:6
将此数据包发送到 Intruder 模块进行爆破,在包含验证码识别时,只能使用Pitchfork(交叉)
功能,使用Clusterbomb(集束炸弹)
会出现验证码多次使用导致爆破失败的情况,Paload-1
和Payload-2
正常填入字典即可,Payload-3
需要使用 Extension-generated Payload 类型
并使用captcha-killer-modified
作为生成器
同时需要注意的是,资源池中最大并发数要设置为 1,请求间隔建议设定为 1000 毫秒
Intruder 模块和captcha-killer-modified
中的 Cookie 需要保持一致
最终进行攻击即可,结果如下,这里展示的是多次测试中的最优结果
总结
验证码 OCR 识别方法成本较低、工具化较为成熟,劣势在于 ddddocr 本地验证码识别成功率不高(65%),且无法使用Clusterbomb(集束炸弹)
功能,仅能在已知用户名或密码的情况下使用,验证码准确度方面可针对网站验证码进行针对性机器学习或采用付费第三方验证码识别接口,可大幅提高准确率,本次仅为方法演示,不再过多优化
原文始发于微信公众号(天禧信安):【Pikachu 靶场精讲】验证码绕过(on server)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论