# Captcha Bypass

> 验证码/短信验证码/邮件验证码/滑块/人机验证绕过方法论。当登录、注册、找回密码、短信发送、邮箱验证、支付确认、MFA、评论提交等流程出现 captcha/code/otp/sms/email verify/geetest/TCaptcha 时使用。覆盖验证码重放、泄露、万能码、空值绕过、接收者未绑定、限频绕过、短信轰炸和时间窗口问题。

- Skill: `haibo3434358/captcha-bypass` (Agent Skill)
- Install (CLI): `npx skillmds@latest add haibo3434358/captcha-bypass`
- Raw SKILL.md: https://api.skillmd.com/api/skills/haibo3434358/captcha-bypass/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Product & Planning
- Author: haibo3434358 (https://skillmd.com/u/haibo3434358)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/haibo3434358/captcha-bypass

---


# 验证码绕过方法论

## 🤖 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/场景、是否一次性、是否限频、是否泄露**。

优先顺序：

1. 删除验证码、空值、null、万能码，确认服务端是否强制校验。
2. 成功使用后的验证码再次提交，确认是否一次性失效。
3. A 手机/邮箱收到的验证码能否验证 B 手机/邮箱或 B 账号。
4. 发送接口是否限频，手机号格式变形是否绕过限频。
5. 响应、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 不可见字符，看是否绕过限频（同一号码不同表达式） | - |

---


## 输出格式

```text
[验证码检查]
入口/流程：登录/注册/找回密码/MFA/支付/短信发送/邮箱验证/其他
验证码类型：图形/短信/邮件/滑块/三方token/未知
测试动作：空值/万能码/复用/接收者绑定/限频/泄露/流程跳步/token重放
业务结果：成功/失败/响应差异/未知
结论：confirmed_vuln | suspected_vuln | needs_review | not_vuln
安全边界：仅测试账号/少量发送/禁止轰炸/其他
```

