| name | recognize-attack-surface |
| description | 渗透测试的攻击面识别与研判总线:拿到一个目标或功能点时,先用它判断"这里可能是哪类漏洞、该用哪个 hunt skill",并覆盖没有专用 hunt skill 的横切类别——跨组件攻击链、业务逻辑漏洞、安全配置错误、信息泄露。当用户说"从哪下手""这个功能可能有什么问题""帮我看看攻击面""该测哪类漏洞""怎么把几个小问题串成大的"时使用;也在每次渗透开局做侦察分诊时使用。输出:识别出的可疑信号 + 路由到的 hunt skill 清单 + 横切类别的研判结论。 |
| allowed-tools | Read, Grep, Glob |
recognize-attack-surface · 攻击面识别与研判
这是渗透 skill 库的分诊总线:不直接挖某一类漏洞,而是看清目标后判断"该往哪个 hunt skill 走",并亲自处理四类不适合做成单点猎杀的横切问题——跨组件攻击链、业务逻辑、配置错误、信息泄露。
用法心智:先侦察→按信号路由到具体 hunt skill→对横切类别用本文的研判清单→把散点串成链。深度案例与信号目录见 references/patterns.md(渐进披露,判定某类时再读对应段)。
何时用哪个 hunt skill(路由表)
看到左边信号,转右边 skill:
| 观察到的信号 | 路由到 |
|---|
| 服务端按用户 URL 发出站请求(预览/抓取/webhook/导入) | hunt-ssrf |
| 前面有 CDN/反代 + keep-alive,怀疑前后端解析不一致 | hunt-request-smuggling |
| 输入进 shell / 传给 git/tar/ffmpeg/ImageMagick 参数 | hunt-command-injection |
| 文件名/路径/下载/解压吃用户输入 | hunt-path-traversal |
| 依赖 Node.js 权限模型做隔离 | hunt-nodejs-permission-bypass |
| cookie/token/viewstate 是序列化对象;导入触发对象还原 | hunt-deserialization |
递归 merge/JSON 深合并/__proto__ 可控 | hunt-prototype-pollution |
| 登录/SSO/SAML/OAuth/2FA/重置/邮箱验证环节 | hunt-auth-bypass |
| 用户输入回显到 HTML/JS/属性,或前端 sink 消费 URL | hunt-xss |
| 解析用户 XML(SOAP/SVG/SAML/DOCX/RSS) | hunt-xxe |
| 输入拼进 SQL/NoSQL 查询 | hunt-sqli |
| 状态变更操作的 CSRF 防护可疑 | hunt-csrf |
| 前有缓存层 + unkeyed 输入影响响应 | hunt-cache-poisoning |
| 按用户参数跳转(next/return/redirect_uri) | hunt-open-redirect |
一个入口常命中多个——按"最高影响 + 最省条件"排序逐个试。找不到匹配就落到下面四类横切研判。
横切类别研判(无专用 hunt skill,本文直接处理)
A. 跨组件攻击链(把散点串成大的)★
单看每个点都是中低危,价值在组合跨越信任边界。研判方法:
- 列出已发现的所有"半成品":一个信息泄露、一个弱 IDOR、一个自 XSS、一个开放重定向…
- 找信任边界的接缝:前端↔后端、Web↔移动 App↔API、用户态↔管理态、租户 A↔租户 B、服务↔云元数据。
- 沿"信息→凭据→身份→权限→执行"的方向拼:泄露拿线索 → 绕认证 → 越权 → 提权 → 执行/读密。
- 每跨一层都留证据;链条整体影响 = 终点影响,即使每一环都不高危。
- 完成标准:能画出"入口→…→影响"的完整链,每环可复现。
B. 业务逻辑漏洞(没有"payload",靠流程推理)
判定靠违反业务规则的状态,不是特殊字符。研判方法:
- 明确这条业务"应有的不变量"(钱守恒、每人限一次、只能改自己的、状态机单向)。
- 逐个尝试打破:数量/价格改负、并发/竞态(见下)、跳过步骤、重放、越权对象、时序错乱。
- 关注多步流程:把中间步骤替换/乱序/省略,看后端是否仍信任前置状态。
- 完成标准:构造出一个违反不变量的稳定结果(如少付/多得/占用他人资源)。
C. 安全配置错误
判定靠**"本不该开/本不该默认"的设置**。研判清单:
- 云资源:可接管的悬空 DNS/S3、开放的元数据、过宽 IAM/SG、默认凭据。
- 服务:调试端点、管理面暴露、默认账号、目录列举、
.git/.env/备份可访问。
- 传输/协议:不安全默认(明文回退、证书不校验)、危险 CORS、缺失安全头。
- 完成标准:指出具体错误配置 + 可达的越权/泄露后果。
D. 信息泄露
判定靠拿到本不该给的信息。研判清单:
- 直接:报错栈/调试信息/源码/
.git/密钥/备份/日志、CSP report-uri 侧信道。
- 侧信道:响应时间差、长度差、错误 vs 正常差异、CSP/Referer 外泄。
- 越权读:他人对象、跨租户、缓存里别人的数据、ContentProvider/深链读私有。
- 完成标准:拿到具体敏感数据,并说明它能喂给链条的哪一环(回到 A)。
研判纪律(7 问,任一 NO 则降级/搁置)
- 目标在授权 scope 内?
- 观察到的是真实信号(可复现的差异/泄露/越权),非猜测?
- 能指到具体 skill 或横切类别,而非泛泛"感觉有问题"?
- 若路由到 hunt skill,是否满足它的触发前提?
- 横切类别是否违反了明确的不变量/边界?
- 有证据支撑(响应/时序/泄露内容)?
- 影响可陈述,且验证未越权触碰真实用户/数据?
输出格式
## 攻击面研判:<目标/功能>
- 命中信号:<清单>
- 路由 hunt skill:<hunt-xxx(原因)...>
- 横切研判:
- 跨组件链:<能否串起来 + 草图>
- 业务逻辑:<被打破的不变量>
- 配置错误:<具体项>
- 信息泄露:<拿到什么>
- 下一步:<按影响排序的行动>
参考
各横切类别的信号目录与真实 HackerOne 案例见 references/patterns.md——研判某一类时再读对应段。