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库实现验证码识别,需要以下环境:

  1. Python 3环境
  2. 安装依赖库:
pip3 install ddddocr
pip3 install pillow==9.5.0  # 注意:pillow版本过高会导致某些函数不可用

使用ddddocr_xp_CAPTCHA项目中的server.py文件搭建本地验证码识别服务。

0x02 实现步骤

1. 搭建本地验证码识别服务

  1. 下载server.py文件
  2. 运行服务(默认端口7788,可修改):
python3 server.py
  1. 服务接口说明:
    • 请求方式:POST
    • 接口地址:http://localhost:7788/base64
    • 参数:base64(验证码图片的base64编码)

2. 分析目标验证码流程

典型验证码流程包含两个请求:

  1. 获取验证码图片和验证码ID
  2. 提交登录信息(包含验证码识别结果和验证码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. 正则表达式调整说明

根据实际响应格式调整正则表达式:

  1. 验证码图片提取:

    • 如果响应格式为:{"img":"base64数据"}}
      re2.FindGroup(rsp, `,"img":"(?P.*)"}}`)
      
    • 如果响应格式为:{base64:img_data;username:admin}
      re2.FindGroup(rsp, `base64:(?P.*);username`)
      
  2. 验证码ID提取:

    • 如果响应格式为:"CheckCodeId":"id","CheckCodeSrc"
      re2.FindGroup(rsp, `"CheckCodeId":"(?P.*)","CheckCodeSrc"`)
      

0x03 使用说明

  1. 在Web Fuzzer中设置爆破数据包,使用占位符标记需要替换的位置:

    • __ocr__:验证码识别结果
    • __vi__:验证码ID
  2. 将完整的热加载代码复制到热加载编辑框中

  3. 重要设置:

    • 并发数设置为1(保证验证码识别的准确性)
    • 可根据需要设置延时
  4. 确保本地验证码识别服务正常运行

0x04 注意事项

  1. 正则表达式需要根据实际响应格式进行调整
  2. 如果验证码识别结果需要特殊处理(如base64编码),需在热加载代码中相应处理
  3. 验证码服务端口冲突时可修改server.py中的端口号
  4. 可替换为其他在线验证码识别服务,只需调整相应的请求代码

0x05 扩展应用

此方法不仅限于验证码识别,还可用于:

  • 前端加密处理(参考官方插件文章)
  • 请求/响应数据的实时修改
  • 其他需要在请求前预处理数据的场景

通过Yakit的热加载功能,可以灵活实现各种复杂场景下的自动化测试和安全评估需求。

Yakit 热加载实现验证码识别教学文档 0x00 前言 本教程将详细介绍如何使用Yakit的热加载功能结合ddddocr库实现验证码识别,解决爆破过程中的验证码障碍问题。 0x01 前置知识 Yakit热加载功能 Yakit的热加载功能允许在请求发送前和响应返回后对数据进行处理,主要通过两个魔术方法实现: beforeRequest : 在每次请求前调用,用于修改请求数据 afterRequest : 在每次请求拿到响应后调用,用于修改响应数据 基本函数定义: 验证码识别方案 本教程使用基于Python的ddddocr库实现验证码识别,需要以下环境: Python 3环境 安装依赖库: 使用 ddddocr_ xp_ CAPTCHA 项目中的server.py文件搭建本地验证码识别服务。 0x02 实现步骤 1. 搭建本地验证码识别服务 下载server.py文件 运行服务(默认端口7788,可修改): 服务接口说明: 请求方式:POST 接口地址: http://localhost:7788/base64 参数: base64 (验证码图片的base64编码) 2. 分析目标验证码流程 典型验证码流程包含两个请求: 获取验证码图片和验证码ID 提交登录信息(包含验证码识别结果和验证码ID) 3. Yakit热加载代码实现 完整的热加载代码(beforeRequest方法): 4. 正则表达式调整说明 根据实际响应格式调整正则表达式: 验证码图片提取: 如果响应格式为: {"img":"base64数据"}} 如果响应格式为: {base64:img_data;username:admin} 验证码ID提取: 如果响应格式为: "CheckCodeId":"id","CheckCodeSrc" 0x03 使用说明 在Web Fuzzer中设置爆破数据包,使用占位符标记需要替换的位置: __ocr__ :验证码识别结果 __vi__ :验证码ID 将完整的热加载代码复制到热加载编辑框中 重要设置: 并发数设置为1(保证验证码识别的准确性) 可根据需要设置延时 确保本地验证码识别服务正常运行 0x04 注意事项 正则表达式需要根据实际响应格式进行调整 如果验证码识别结果需要特殊处理(如base64编码),需在热加载代码中相应处理 验证码服务端口冲突时可修改server.py中的端口号 可替换为其他在线验证码识别服务,只需调整相应的请求代码 0x05 扩展应用 此方法不仅限于验证码识别,还可用于: 前端加密处理(参考官方插件文章) 请求/响应数据的实时修改 其他需要在请求前预处理数据的场景 通过Yakit的热加载功能,可以灵活实现各种复杂场景下的自动化测试和安全评估需求。