ワンクリックで
user-enum-data-leak
用户枚举与敏感数据遍历方法论。当目标有注册、登录、找回密码、搜索用户等功能时使用。覆盖用户名/手机号/邮箱枚举(通过注册/登录/密码重置接口的差异响应)、批量数据导出越权、订单号/发票号等业务ID遍历。SRC 常见中危漏洞。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
用户枚举与敏感数据遍历方法论。当目标有注册、登录、找回密码、搜索用户等功能时使用。覆盖用户名/手机号/邮箱枚举(通过注册/登录/密码重置接口的差异响应)、批量数据导出越权、订单号/发票号等业务ID遍历。SRC 常见中危漏洞。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
攻击面发现总控方法论。在爬取、抓包、JS 分析、API 文档分析、登录后探索、多角色对比阶段使用。用于把页面、接口、参数、Header、Cookie、WebSocket、GraphQL、上传、导入导出、支付、回调、对象存储等所有外部输入点系统性枚举出来,并把每个入口映射到后续漏洞 discovery skill。
认证绕过完整方法论 — 基于 300+ HackerOne/Bugcrowd 真实报告提炼。覆盖未授权访问、登录逻辑缺陷、MFA 绕过、Session 管理攻击、认证降级、默认/泄露凭据、注册逻辑漏洞、API 认证缺失、Response 篡改、Race Condition 认证绕过。任何出现 login/session/token/cookie/Authorization/MFA/2FA/验证码/注册验证/受保护 API 的场景都必须使用此 skill。
Session cookie 分析与伪造方法论。当发现 Web 应用使用 cookie 进行认证、需要判断 cookie 类型并选择伪造方法时使用。覆盖 unsigned base64 cookie 直接伪造、Flask 签名 cookie(flask-unsign 爆破密钥)、加密/二进制 cookie 的识别。本技能负责 cookie 类型判断和分流:如果判断为 JWT(三段式 eyJ 开头),应转至 jwt-attack-methodology;如果判断为加密 cookie 需要 Padding Oracle,应转至 crypto-web-attack
通用漏洞发现方法论 — 当遇到不在已有SKILL覆盖范围内的场景时,教LLM如何系统性地发现漏洞。覆盖:输入点穷举、响应差异分析、边界条件探测、未知技术栈适应、容易被忽略的攻击面。
入口点 → 漏洞类型 → SKILL 映射表。Agent 在 Phase 2 测试功能点时,根据此表判断该入口点最可能存在什么漏洞,精准加载对应 SKILL。这是 Agent 渗透决策的核心路由表 — 定义'至少测什么',但不限制你的推理。
Web 应用敏感信息泄露检测与利用。当发现 .git/.svn 目录、备份文件路径(.bak/.zip/.tar.gz)、.env 配置文件、Swagger/OpenAPI 文档、debug 页面等信息泄露点时使用。也适用于发现源码泄露后的深入利用:git 历史审计(git log -p -S 搜索已删除的密码和 flag)、svn wc.db 文件列表提取、.DS_Store 目录枚举。优先于漏洞利用——信息泄露可直接提供凭据和攻击路径,往往比直接挖漏洞更快进入系统
| name | user-enum-data-leak |
| description | 用户枚举与敏感数据遍历方法论。当目标有注册、登录、找回密码、搜索用户等功能时使用。覆盖用户名/手机号/邮箱枚举(通过注册/登录/密码重置接口的差异响应)、批量数据导出越权、订单号/发票号等业务ID遍历。SRC 常见中危漏洞。 |
| priority | 10 |
| vuln_types | ["用户枚举","信息泄露","敏感数据泄露","数据遍历","批量导出越权","ID遍历"] |
| triggers | ["register","registration","login","forgot","reset","username","user_id","phone","email","exists","check","search","export","page_size","limit","order_id","invoice","password_hash","api_token","用户枚举","信息泄露"] |
| synonyms | ["user enumeration","account enumeration","data leak","information disclosure","sensitive data exposure","id enumeration"] |
| metadata | {"tags":"user enumeration,用户枚举,手机号遍历,邮箱枚举,信息泄露,批量导出,数据遍历,订单遍历,ID遍历,registration,注册检测","category":"discovery","authority":"reference"} |
| 场景 | 优先使用的 Agent 工具 |
|---|---|
| 对注册、登录、找回密码、检查账号、搜索用户接口发送存在/不存在账号对照样本 | proxy_send_request |
| 比较状态码、响应体长度、错误码、Cookie/Header、字段数量和响应时间差异 | proxy_diff_responses + proxy_get_flow_detail |
修改 username/email/phone/user_id/order_id/invoice/limit/page_size 验证枚举、遍历和批量返回 | proxy_replay / proxy_send_request |
| 用低权限、匿名、普通用户和更高权限账号对同一接口做字段和数据边界对比 | browser_get_cookies + proxy_send_request |
| 对列表、搜索、导出、GraphQL 接口测试空关键词、大分页、超大 limit 和过滤条件缺失 | proxy_send_request |
| 故意发送畸形参数,检查错误响应是否泄露堆栈、SQL、内部 IP、文件路径或追踪头 | proxy_send_request + proxy_get_flow_detail |
| 批量生成少量安全样本 ID、订单号、发票号和手机号/邮箱格式变体,避免大规模遍历真实数据 | python3 |
| 命中后记录至少两个枚举差异证据,或记录越权字段/导出数据、角色边界和影响范围 | checklist_mark + note_add |
执行要点:手机号/邮箱等字段是否构成泄露取决于当前角色是否业务必要;不要用“业务正常”泛化跳过,必须说明角色边界和字段必要性,且禁止大规模遍历真实用户。
注册时输入已存在的用户名/手机号/邮箱:
- 已存在: "该手机号已注册" / "用户名已被占用"
- 不存在: "注册成功" 或进入下一步
→ 差异响应 = 可枚举用户是否存在
→ proxy_send_request 分别提交存在和不存在的用户,对比响应
- 存在的用户 + 错误密码: "密码错误"
- 不存在的用户 + 任意密码: "用户不存在" / "账号或密码错误"
即使提示相同,也检查:
1. 响应时间差异(存在的用户需要查库比对密码,更慢)
2. 响应长度差异(多几个字节也是差异)
3. HTTP 状态码差异
4. Cookie/Header 差异
- 存在的手机号: "验证码已发送"
- 不存在的手机号: "该手机号未注册"
→ 密码重置接口是用户枚举的最常见入口
搜索用户接口:
GET /api/user/search?phone=13800138000
→ 返回用户信息 = 可通过手机号查任意用户
检查用户是否存在:
GET /api/user/check?username=admin
→ 返回 {"exists": true}
自己的订单: GET /api/order/10086
改 ID: GET /api/order/10087, 10088, 10089...
如果返回其他用户的订单 → IDOR + 数据泄露
如果返回 404/403 但响应不同 → 可判断订单是否存在
发票下载: GET /api/invoice/INV-2024-0001
遍历: INV-2024-0002, INV-2024-0003...
→ 泄露其他用户/公司的发票信息
个人资料: GET /api/user/profile/1001
遍历: 1002, 1003, 1004...
→ 批量获取用户个人信息
注意遍历策略:
- 数字 ID: 1, 2, 3... 或 1001, 1002, 1003...
- UUID: 不可遍历,但可能从其他接口泄露
- 自增序列: 试 ID ± 1, ± 10, ± 100 判断规律
检查以下接口:
1. 导出功能: GET /api/export/users?format=csv
→ 不传过滤条件 = 导出全量数据?
→ 修改分页参数: page_size=999999
2. 搜索接口: GET /api/search?keyword=&page_size=1000
→ 空关键词 + 大分页 = 全量查询
3. 列表接口: GET /api/users?limit=999999&offset=0
→ 直接拉全量
4. GraphQL: { users(first: 99999) { id, name, email, phone } }
→ 批量查询
检查 API 响应是否包含不该返回的字段:
用户接口:
- 密码 hash(password_hash, encrypted_password)
- 身份证号(id_card, identity)
- 完整手机号(phone 未脱敏)
- 完整邮箱
- 家庭住址
- 银行卡号
订单接口:
- 其他用户的收货信息
- 支付流水号
- 第三方账户信息
系统接口:
- 数据库连接信息
- 内部 IP
- API Key/Secret
微妙的枚举指标(肉眼不易察觉):
1. 响应时间: 存在用户 200ms vs 不存在 50ms
2. 响应大小: 差 10-20 字节
3. Cookie 数量: 存在用户多设置一个 Cookie
4. 错误码: 同样 400 但 error_code 不同
5. JSON 字段: 存在用户多返回一个 user_id 字段
→ proxy_diff_responses 自动发现差异
1. 证明可以判断用户是否存在(至少 2 个差异证据)
2. 或证明可以获取其他用户的数据
3. 评估影响范围(可遍历多少用户/订单)
4. vuln_verify + note_add(type="result")
⚠️ 关键:响应中含手机号/邮箱不一定是漏洞——必须判断"该角色应不应该看到这些字段"。
| # | 必测项 | 跳过的合法理由 |
|---|---|---|
| 1 | 响应字段普查:列出该接口响应中所有字段名,标注哪些是"业务必要"(用户主动展示),哪些是"敏感字段"(IP、internal_note、private_field、creator_email、phone、id_number、salt、hash) | - |
| 2 | 角色边界判断:当前角色(代理/普通用户/匿名)正常业务流程应该看到哪些字段?响应中是否含有"超出当前角色应见范围"的字段? | - |
| 3 | 跨角色对比:如果有多个测试账号,用低权限账号请求同一接口,看是否仍返回敏感字段?低权限能看到 → 越权信息泄露 | 仅一个账号 |
| 4 | 错误响应泄露:故意发畸形请求(无效参数、'、'A'*1000),看错误响应是否含堆栈、SQL 语句、内部 IP、文件路径? | 该接口响应稳定,错误处理统一 |
| 5 | 响应头泄露:检查 Server、X-Powered-By、X-Backend、X-Aspnet-Version、X-Runtime、X-Trace-Id、内部 host 名是否泄露 | 已检查响应头无内部信息 |
| 6 | 批量返回放大:接口支持分页/limit 吗?试 ?page_size=10000、?limit=99999 看能否一次性拉取超大量数据 | 接口非列表型 |
| 7 | 管理类敏感字段:/users 类接口返回的字段中是否包含 password_hash、salt、secret_key、api_token、session_token、reset_token、mfa_secret? | 接口非用户/账户类 |
X-Backend-Server: prod-db-3.internal.lan 也是标准吗?要看具体值