| name | captcha-bypass |
| description | 验证码/短信验证码/邮件验证码/滑块/人机验证绕过方法论。当登录、注册、找回密码、短信发送、邮箱验证、支付确认、MFA、评论提交等流程出现 captcha/code/otp/sms/email verify/geetest/TCaptcha 时使用。覆盖验证码重放、泄露、万能码、空值绕过、接收者未绑定、限频绕过、短信轰炸和时间窗口问题。 |
| priority | 10 |
| vuln_types | ["验证码绕过","短信轰炸","OTP绕过","验证码重放","限频绕过"] |
| triggers | ["captcha","code","verify_code","otp","sms","email_code","geetest","TCaptcha","slider","验证码","短信验证码","邮箱验证码","人机验证","发送验证码"] |
| synonyms | ["captcha bypass","otp bypass","sms bombing","verification code bypass","rate limit bypass","验证码复用","万能验证码"] |
| metadata | {"tags":"captcha,验证码,短信验证码,图形验证码,滑动验证码,重放,bypass,sms,邮箱验证码,爆破,频率限制,轰炸","category":"discovery","authority":"reference"} |
验证码绕过方法论
🤖 Agent 工具映射
| 场景 | 优先使用的 Agent 工具 |
|---|
| 捕获登录、注册、找回密码、MFA、支付确认、短信/邮件发送等验证码流程 | browser_* + proxy_get_traffic |
删除验证码字段、传空字符串、null、万能码,验证服务端是否强制校验 | proxy_replay / proxy_send_request |
| 重放已成功使用的验证码、短信码、邮件码或滑块 token,验证是否一次性失效 | proxy_replay |
| 用 A 手机/邮箱收到的验证码验证 B 手机/邮箱或 B 账号,检查接收者绑定 | proxy_send_request / proxy_diff_responses |
| 少量重复调用发送接口,测试同号限频、IP/session 限频和手机号格式变形绕过 | proxy_send_request / proxy_batch_send |
| 检查响应 body/header/Cookie/JS/localStorage 是否泄露验证码或验证 token | proxy_get_flow_detail + browser_evaluate + browser_get_cookies |
| 对比正确码、错误码、空值、复用、跨账号、流程跳步的业务结果 | proxy_diff_responses |
| 固化绕过、复用、泄露、未绑定、限频缺失或短信轰炸证据 | checklist_mark + note_add |
执行要点:验证码安全要验证“绑定、一次性、限频、服务端校验、泄露”五件事;短信轰炸只做少量验证,不能进行真实大规模发送。
0. 立即执行摘要:验证码要验证“绑定、一次性、限频、服务端校验”
看到登录、注册、找回密码、短信/邮件发送、MFA、支付确认、敏感操作确认中的 captcha、code、otp、verify_code、sms、email_code、滑块 token 时,必须进入本 skill。验证码安全不是“有没有验证码”,而是 是否服务端校验、是否绑定账号/手机号/session/场景、是否一次性、是否限频、是否泄露。
优先顺序:
- 删除验证码、空值、null、万能码,确认服务端是否强制校验。
- 成功使用后的验证码再次提交,确认是否一次性失效。
- A 手机/邮箱收到的验证码能否验证 B 手机/邮箱或 B 账号。
- 发送接口是否限频,手机号格式变形是否绕过限频。
- 响应、Cookie、JS、localStorage 是否泄露验证码或验证 token。
1. 数据包特征触发矩阵
| 特征 | 漏洞假设 | 立即测试 |
|---|
code/otp/captcha | 空值/万能码绕过 | 删除、空、null、0000、123456 |
| 发送验证码接口 | 短信轰炸/限频绕过 | 同号少量重复、格式变形、IP/session 对照 |
| 验证接口含手机号/邮箱 | 接收者未绑定 | A 收码验证 B 账号/手机号 |
响应返回 code/token | 验证码泄露 | 检查 body/header/cookie/localStorage |
| 滑块/三方验证 token | token 重放 | 复用 token、跨 session、过期时间 |
| MFA/支付确认验证码 | 流程跳步 | 未验证直接调业务 API |
Phase 1: 识别验证码类型
验证码类型:
├─ 图形验证码(CAPTCHA 图片)
├─ 短信验证码(4-6 位数字)
├─ 邮件验证码
├─ 滑动/拼图验证(极验 geetest、腾讯 TCaptcha)
├─ 点击验证(点选文字/图标)
└─ 计算题验证(1+2=?)
Phase 2: 通用绕过手法
2.1 验证码重放(最常见!)
1. 正常获取验证码,填写正确提交(抓包)
2. 重放同一请求 → 如果仍然成功 → 验证码可重用
3. 说明服务端没有在验证后使验证码失效
→ 可用同一验证码无限次提交(配合爆破密码等)
2.2 响应中泄露验证码
检查以下位置:
1. 发送验证码的接口响应 body — 直接返回验证码明文
2. 响应 header — 偶尔在 X-Verify-Code 等自定义头中
3. Cookie — 验证码 MD5/Base64 编码存在 Cookie 中
4. 前端 JS — 验证码生成逻辑在前端
→ proxy_get_flow_detail 查看完整响应
→ browser_evaluate 检查页面变量和 Cookie
2.3 空值/万能验证码
尝试以下值:
- 空字符串: ""
- null: null
- 删除验证码参数(整个字段不传)
- 常见万能码: 0000, 1234, 6666, 8888, 9999
- -1, 000000
→ proxy_replay 逐个尝试
2.4 前端校验绕过
如果验证码只在前端校验:
1. 直接改包删除验证码字段 → proxy_replay
2. 或随便填一个值,看服务端是否再次校验
3. browser_evaluate 检查是否有前端 JS 校验逻辑
2.5 修改接收者
短信/邮件验证码场景:
1. 发送验证码到自己手机 A
2. 改包修改验证接口的手机号为目标手机 B
3. 用发到 A 的验证码去验证 B → 验证码与手机号未绑定
Phase 3: 短信验证码专项
爆破 4-6 位数字
4 位数字: 0000-9999(10000 种)
6 位数字: 000000-999999(100 万种,通常不可行)
判断是否可爆破:
1. 验证码有效期多长?(通常 5-15 分钟)
2. 有无频率限制?(连续错误 N 次后锁定)
3. 有无 IP 限制?
如果 4 位 + 无限制 → 直接爆破
如果有频率限制 → 尝试 proxy_batch_send 并发绕过
短信轰炸
发送验证码接口无频率限制:
1. 连续调用发送接口 → 目标手机收到大量短信
2. 改手机号遍历 → 批量轰炸
测试方法:
- 同一手机号连续请求 5 次发送接口
- 如果都返回成功 → 存在短信轰炸
- 注意:只需证明无频率限制即可,不要真的大量发送
验证码时间窗口
1. 请求发送新验证码
2. 用旧验证码提交 → 如果仍有效 → 旧码未失效
3. 说明可以无限获取新码同时旧码仍可用
Phase 4: 图形验证码专项
1. 不带验证码参数直接提交 → 服务端是否强制校验
2. 同一验证码重复提交多次 → 是否一次性
3. 验证码图片 URL 是否包含答案(如 /captcha?text=A3Bx)
4. 验证码图片是否有规律(固定几张轮换)
5. OCR 识别简单验证码(Agent 无此能力,记录为建议)
Phase 5: 滑动/智能验证码
这类验证码通常较难绕过,但可以尝试:
1. 抓包分析验证参数,是否有固定值可重放
2. 验证结果 token 是否过期(获取后多久失效)
3. 验证是否绑定 session(换 session 是否需重新验证)
4. 删除验证相关参数,看业务接口是否仍可调用
验证与记录
验证码绕过需要证明:
1. 可以在不正确输入验证码的情况下完成操作
2. 或验证码可被重用/预测
3. 截图完整的绕过过程
4. vuln_verify + note_add(type="result")
结果判定与误报排除
confirmed_vuln:无需正确验证码即可完成受保护动作,或验证码可重放/泄露/跨账号使用/无限发送造成实际绕过。
suspected_vuln:存在响应差异、限频弱、token 可复用迹象,但缺少最终业务动作成功证据。
needs_review:缺少接收短信/邮件条件、三方验证码环境或测试账号。
not_vuln:完成空值、复用、绑定、泄露、限频、格式变形、流程跳步检查后无异常。
误报排除:
- 发送接口返回成功不代表短信真的发送,需要结合实际接收或服务端计数。
- 前端提示验证码错误不够,要看业务接口是否仍执行。
- 图形验证码 OCR 难不代表安全,服务端绑定和一次性仍必须测。
⛔ 「最低必测自检」— 标 not_vuln/skipped 前必答(验证码绕过/短信轰炸)
| # | 必测项 | 跳过的合法理由 |
|---|
| 1 | 空值绕过:把 captcha/code 字段去掉、传空字符串、传 null,看是否仍能继续 | 接口无验证码字段 |
| 2 | 复用绕过:用过的验证码再次提交,看是否仍接受(一次性验证码失效检查) | - |
| 3 | OCR 识别:图形验证码用 OCR 自动识别(如简单数字/英文) | 是滑块/三方验证 |
| 4 | 客户端绕过:检查响应 JS 是否泄露验证码(变量、cookie、localStorage) | - |
| 5 | 短信轰炸:连发同一手机号 10 次,看后端是否限频(应该只发 1-2 次后限制) | 接口非短信发送 |
| 6 | 手机号枚举:发送验证码接口,输入存在的手机号 vs 不存在的,响应是否不同 | - |
| 7 | 限频参数篡改:在 phone/mobile 字段中加空格、+86 前缀、unicode 不可见字符,看是否绕过限频(同一号码不同表达式) | - |
输出格式
[验证码检查]
入口/流程:登录/注册/找回密码/MFA/支付/短信发送/邮箱验证/其他
验证码类型:图形/短信/邮件/滑块/三方token/未知
测试动作:空值/万能码/复用/接收者绑定/限频/泄露/流程跳步/token重放
业务结果:成功/失败/响应差异/未知
结论:confirmed_vuln | suspected_vuln | needs_review | not_vuln
安全边界:仅测试账号/少量发送/禁止轰炸/其他