【那些年-有趣的开发兄弟】如此验证?
字数 1101 2025-08-23 18:31:34
图形验证码绕过技术分析
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 攻击步骤示例
// 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. 漏洞利用场景
- 短信轰炸攻击:绕过验证码限制大量发送短信
- 暴力破解:针对账号的暴力破解尝试
- 自动化注册:批量注册账号
6. 防御建议
-
后端验证加强:
- 验证时间戳的有效期(如只接受最近2秒内的请求)
- 使用服务端生成的验证码而非客户端生成
- 增加加密算法的复杂度(如使用动态salt)
-
前端改进:
- 混淆关键JavaScript代码
- 使用WebAssembly等更安全的验证方式
- 避免将验证逻辑暴露在前端
-
监控措施:
- 实施请求频率限制
- 监控异常请求模式
- 记录验证失败的日志
7. 总结
该漏洞展示了客户端验证机制的根本弱点,当验证逻辑和关键参数生成过程暴露在前端时,攻击者可以通过逆向工程完全绕过验证机制。开发人员应将关键验证逻辑完全放在服务端实现,并确保所有验证参数不可预测和不可伪造。