【那些年-有趣的开发兄弟】如此验证?
字数 1101 2025-08-23 18:31:34

图形验证码绕过技术分析

1. 漏洞发现背景

在渗透测试过程中发现一个带有图形验证码的短信发送页面,初步观察发现:

  • 页面存在图形验证码机制
  • 发送短信验证码时未发现获取图形验证码的独立请求
  • 请求参数中包含keyts等可疑字段

2. 验证机制分析

2.1 请求参数结构

发送短信验证码的请求包含以下关键参数:

  • verifyCode: 用户输入的图形验证码
  • key: 疑似加密后的验证码值
  • ts: 时间戳
  • mobile: 手机号码

2.2 验证逻辑推测

通过分析推测验证流程:

  1. 前端生成图形验证码值
  2. 使用特定算法将验证码值与时间戳结合加密生成key
  3. 后端收到请求后,用相同算法验证verifyCodekey的匹配性

3. JavaScript逆向分析

3.1 定位关键函数

  1. 全局搜索verifyCode定位到相关代码
  2. 发现key的生成方式:key = oe(string + timestamp + 验证码值)
  3. oe函数实际上是MD5加密的别名

3.2 函数追踪过程

  1. 初始发现oe函数难以定位
  2. 通过搜索发现oem的别名
  3. 进一步发现mmd5函数的别名
  4. 最终确认加密函数为标准的MD5算法

3.3 提取加密算法

  1. 将MD5相关的JS代码美化后提取
  2. 删除不必要的导出语句
  3. 保留核心加密功能

4. 验证码绕过技术实现

4.1 构造有效请求

需要满足以下条件:

  1. ts参数与加密时使用的时间戳一致
  2. verifyCode与加密时使用的验证码值相同
  3. key固定字符串 + ts + verifyCode的MD5值

4.2 自动化攻击实现

  1. 使用Burp Suite插件或自定义脚本
  2. 动态生成时间戳
  3. 计算对应的MD5值
  4. 构造完整请求

4.3 攻击步骤示例

// 1. 获取当前时间戳
let ts = new Date().getTime();

// 2. 设置固定验证码值
let verifyCode = "1234";

// 3. 计算key值
let fixedString = "some_constant_string"; // 需要从JS中获取的实际值
let key = md5(fixedString + ts + verifyCode);

// 4. 构造请求
let payload = {
    mobile: "13800138000",
    verifyCode: verifyCode,
    key: key,
    ts: ts
};

5. 漏洞利用场景

  1. 短信轰炸攻击:绕过验证码限制大量发送短信
  2. 暴力破解:针对账号的暴力破解尝试
  3. 自动化注册:批量注册账号

6. 防御建议

  1. 后端验证加强

    • 验证时间戳的有效期(如只接受最近2秒内的请求)
    • 使用服务端生成的验证码而非客户端生成
    • 增加加密算法的复杂度(如使用动态salt)
  2. 前端改进

    • 混淆关键JavaScript代码
    • 使用WebAssembly等更安全的验证方式
    • 避免将验证逻辑暴露在前端
  3. 监控措施

    • 实施请求频率限制
    • 监控异常请求模式
    • 记录验证失败的日志

7. 总结

该漏洞展示了客户端验证机制的根本弱点,当验证逻辑和关键参数生成过程暴露在前端时,攻击者可以通过逆向工程完全绕过验证机制。开发人员应将关键验证逻辑完全放在服务端实现,并确保所有验证参数不可预测和不可伪造。

图形验证码绕过技术分析 1. 漏洞发现背景 在渗透测试过程中发现一个带有图形验证码的短信发送页面,初步观察发现: 页面存在图形验证码机制 发送短信验证码时未发现获取图形验证码的独立请求 请求参数中包含 key 和 ts 等可疑字段 2. 验证机制分析 2.1 请求参数结构 发送短信验证码的请求包含以下关键参数: verifyCode : 用户输入的图形验证码 key : 疑似加密后的验证码值 ts : 时间戳 mobile : 手机号码 2.2 验证逻辑推测 通过分析推测验证流程: 前端生成图形验证码值 使用特定算法将验证码值与时间戳结合加密生成 key 后端收到请求后,用相同算法验证 verifyCode 与 key 的匹配性 3. JavaScript逆向分析 3.1 定位关键函数 全局搜索 verifyCode 定位到相关代码 发现 key 的生成方式: key = oe(string + timestamp + 验证码值) oe 函数实际上是MD5加密的别名 3.2 函数追踪过程 初始发现 oe 函数难以定位 通过搜索发现 oe 是 m 的别名 进一步发现 m 是 md5 函数的别名 最终确认加密函数为标准的MD5算法 3.3 提取加密算法 将MD5相关的JS代码美化后提取 删除不必要的导出语句 保留核心加密功能 4. 验证码绕过技术实现 4.1 构造有效请求 需要满足以下条件: ts 参数与加密时使用的时间戳一致 verifyCode 与加密时使用的验证码值相同 key 为 固定字符串 + ts + verifyCode 的MD5值 4.2 自动化攻击实现 使用Burp Suite插件或自定义脚本 动态生成时间戳 计算对应的MD5值 构造完整请求 4.3 攻击步骤示例 5. 漏洞利用场景 短信轰炸攻击 :绕过验证码限制大量发送短信 暴力破解 :针对账号的暴力破解尝试 自动化注册 :批量注册账号 6. 防御建议 后端验证加强 : 验证时间戳的有效期(如只接受最近2秒内的请求) 使用服务端生成的验证码而非客户端生成 增加加密算法的复杂度(如使用动态salt) 前端改进 : 混淆关键JavaScript代码 使用WebAssembly等更安全的验证方式 避免将验证逻辑暴露在前端 监控措施 : 实施请求频率限制 监控异常请求模式 记录验证失败的日志 7. 总结 该漏洞展示了客户端验证机制的根本弱点,当验证逻辑和关键参数生成过程暴露在前端时,攻击者可以通过逆向工程完全绕过验证机制。开发人员应将关键验证逻辑完全放在服务端实现,并确保所有验证参数不可预测和不可伪造。