Yakit 热加载初探(1)——手把手交你验证码识别
字数 1155 2025-08-19 12:42:18
Yakit 热加载实现验证码识别教学文档
0x00 前言
本教程将详细介绍如何使用Yakit的热加载功能结合ddddocr库实现验证码识别,解决爆破过程中的验证码障碍问题。
0x01 前置知识
Yakit热加载功能
Yakit的热加载功能允许在请求发送前和响应返回后对数据进行处理,主要通过两个魔术方法实现:
beforeRequest: 在每次请求前调用,用于修改请求数据afterRequest: 在每次请求拿到响应后调用,用于修改响应数据
基本函数定义:
beforeRequest = func(req) {
return []byte(req)
}
验证码识别方案
本教程使用基于Python的ddddocr库实现验证码识别,需要以下环境:
- Python 3环境
- 安装依赖库:
pip3 install ddddocr
pip3 install pillow==9.5.0 # 注意:pillow版本过高会导致某些函数不可用
使用ddddocr_xp_CAPTCHA项目中的server.py文件搭建本地验证码识别服务。
0x02 实现步骤
1. 搭建本地验证码识别服务
- 下载server.py文件
- 运行服务(默认端口7788,可修改):
python3 server.py
- 服务接口说明:
- 请求方式:POST
- 接口地址:
http://localhost:7788/base64 - 参数:
base64(验证码图片的base64编码)
2. 分析目标验证码流程
典型验证码流程包含两个请求:
- 获取验证码图片和验证码ID
- 提交登录信息(包含验证码识别结果和验证码ID)
3. Yakit热加载代码实现
完整的热加载代码(beforeRequest方法):
beforeRequest = func(req) {
// 1. 获取验证码图片和验证码ID
img_packet = `GET /api/web/platform/getVerCode HTTP/1.1
Host: xxx.xxx.xxx
[其他请求头...]`
img_packet_rsp, _ = poc.HTTP(img_packet, poc.https(true))~
// 从响应中提取验证码图片(base64)和验证码ID
result = re2.FindGroup(img_packet_rsp, `,"img":"(?P.*)"}}`)
b64_img = str.ParamsGetOr(result, "img_data", "nope")
result = re2.FindGroup(img_packet_rsp, `"vi":"(?P.*)","img"`)
img_id = str.ParamsGetOr(result, "img_id", "nope")
// 2. 发送验证码图片到本地识别服务
ocr_packet = `POST /base64 HTTP/1.1
Host: 127.0.0.1:17788
[其他请求头...]
Content-Type: application/x-www-form-urlencoded
base64=` + b64_img
img_data, _ = poc.HTTP(ocr_packet)~
ocr_result = string(poc.GetHTTPPacketBody(img_data))
// 3. 替换请求中的占位符
req = re.ReplaceAll(req, `__ocr__`, codec.EncodeBase64(ocr_result))
req = re.ReplaceAll(req, `__vi__`, img_id)
return []byte(req)
}
4. 正则表达式调整说明
根据实际响应格式调整正则表达式:
-
验证码图片提取:
- 如果响应格式为:
{"img":"base64数据"}}re2.FindGroup(rsp, `,"img":"(?P.*)"}}`) - 如果响应格式为:
{base64:img_data;username:admin}re2.FindGroup(rsp, `base64:(?P.*);username`)
- 如果响应格式为:
-
验证码ID提取:
- 如果响应格式为:
"CheckCodeId":"id","CheckCodeSrc"re2.FindGroup(rsp, `"CheckCodeId":"(?P.*)","CheckCodeSrc"`)
- 如果响应格式为:
0x03 使用说明
-
在Web Fuzzer中设置爆破数据包,使用占位符标记需要替换的位置:
__ocr__:验证码识别结果__vi__:验证码ID
-
将完整的热加载代码复制到热加载编辑框中
-
重要设置:
- 并发数设置为1(保证验证码识别的准确性)
- 可根据需要设置延时
-
确保本地验证码识别服务正常运行
0x04 注意事项
- 正则表达式需要根据实际响应格式进行调整
- 如果验证码识别结果需要特殊处理(如base64编码),需在热加载代码中相应处理
- 验证码服务端口冲突时可修改server.py中的端口号
- 可替换为其他在线验证码识别服务,只需调整相应的请求代码
0x05 扩展应用
此方法不仅限于验证码识别,还可用于:
- 前端加密处理(参考官方插件文章)
- 请求/响应数据的实时修改
- 其他需要在请求前预处理数据的场景
通过Yakit的热加载功能,可以灵活实现各种复杂场景下的自动化测试和安全评估需求。