漏洞分类#
验证码安全漏洞在权威安全标准中的分类:
| 标准 | 编号 | 名称 | 说明 |
|---|---|---|---|
| CWE | CWE-804 | Guessable CAPTCHA | 可被猜测/绕过的验证码 |
| CWE | CWE-307 | Improper Restriction of Excessive Authentication Attempts | 未正确限制过多认证尝试 |
| CWE | CWE-1390 | Weak Authentication | 弱身份验证(父类) |
| OWASP | OAT-009 | CAPTCHA Defeat | 验证码破解自动化威胁 |
| OWASP Top 10 | A07:2025 | Authentication Failures | 认证失败 |
攻击方式#
1. 验证码暴力破解#
原理: 穷举尝试所有可能的验证码组合。
攻击条件:
- 4-6位纯数字验证码
- 无请求频率限制
- 无尝试次数限制
- 验证码长时间有效
利用方式:
# Burp Intruder 暴力破解示例
POST /api/verify HTTP/1.1
code=§0000§ # 设置 0000-9999 的 payloadplaintext2. 短信轰炸#
原理: 滥用短信发送接口,向目标手机号发送大量验证短信。
攻击条件:
- 发送接口无频率限制
- 无图形验证码前置
- 接口未做身份验证
利用方式:
# 批量发送脚本示例
import requests
for i in range(1000):
requests.post('/api/send-sms', data={'phone': '13800138000'})python3. 验证码绕过#
原理: 通过篡改请求/响应来绕过验证。
常见手法:
| 手法 | 说明 |
|---|---|
| 删除参数 | 删除请求中的 captcha 参数 |
| 修改响应 | 将响应中的 false 改为 true |
| 空值绕过 | 发送空的验证码值 |
| 替换手机号 | 在验证步骤替换为攻击者手机号 |
| 复用验证码 | 重放已使用的有效验证码 |
4. 验证码识别#
原理: 使用 OCR/AI 自动识别图形验证码。
工具:
- Tesseract OCR
- ddddocr (针对国内验证码)
- 打码平台 API
5. 客户端泄露#
原理: 验证码答案在前端暴露。
检查点:
- 响应 JSON 中包含答案
- 图片文件名包含答案
- 前端 JS 变量中存储答案
- Console 日志输出答案
CVE 案例#
| CVE 编号 | 产品 | 漏洞类型 |
|---|---|---|
| CVE-2025-24628 | WordPress Google Captcha 插件 | 验证码绕过 (CWE-290) |
| CVE-2025-26312 | SendQuick Entera | 删除参数绕过 |
| CVE-2023-48745 | WordPress Captcha Code 插件 | 验证码绕过 |
| CVE-2023-44235 | WP Captcha | 暴力破解 |
| CVE-2023-3897 | SureMDM | 用户枚举 |
防御措施#
验证码设计#
- 长度 ≥ 6 位
- 混合数字+字母
- 有效期 ≤ 5 分钟
- 使用后立即失效
- 足够的图像扭曲/干扰
接口防护#
- 请求频率限制 (Rate Limiting)
- 错误次数限制 + 账户锁定
- 图形验证码前置
- IP 级别限制
- 服务端严格校验
监控告警#
- 异常请求日志记录
- 短信发送量监控
- 验证失败率告警
测试方法#
- 暴力破解测试: 使用 Burp Intruder 测试是否有频率限制
- 绕过测试: 删除/修改验证码参数观察响应
- 重放测试: 重复提交同一验证码
- 客户端检查: F12 检查响应和 JS 变量