hunt-prototype-pollution · 原型污染猎杀
只解决原型污染一类:找到"用户可控键名进入递归合并/属性赋值"的点,用 __proto__/constructor.prototype 往 Object.prototype 注入属性,再看能否被下游 gadget 放大(模板/HTML sink→XSS、spawn/sourceURL→RCE、逻辑标志→提权)。判定靠注入的属性在响应/行为中被观测到。
污染是全局副作用,可能影响其他用户请求。默认注入无害探针属性(如 huntpp),确认污染后再评估 gadget,破坏性/持久化操作需授权。污染向量、常见 gadget、真实报告见 reference.md。
Scope(授权范围)
先确认授权。 全局原型污染可能影响并发请求与后续行为。
落实:授权目标、测试窗口(污染可能残留到进程重启)、允许深度(仅探针 / 允许 gadget PoC)。任一不清楚就停下问。
Goal
判定用户可控键名能否污染 Object.prototype,并评估可达 gadget 与影响(DoS / 逻辑绕过 / XSS / RCE),留存注入属性被反射或行为改变的证据。
Workflow
scope-check → recon → hunt → validate → report。
1. scope-check
- 动作:写
evidence/scope.txt。 - 命令:
bash tools/recon.sh <target> --scope-only。 - 终止条件:scope 明确,否则 KILL。
2. recon
- 动作:枚举吃 JSON body / 深合并 / query 的入口(配置、设置、批量更新、
merge/extend风格 API)。 - 输出:
recon/endpoints.json。 - 命令:
bash tools/recon.sh <target>。 - 终止条件:至少 1 个候选入口。
3. hunt
- 动作:对每个入口发多种污染向量(
__proto__[huntpp]、constructor[prototype][huntpp]、JSON 嵌套__proto__),再请求一个回显对象属性的端点或复用同接口,看huntpp是否出现在返回/默认值里。 - 输出:
candidates.json。 - 命令:
python tools/hunt_protopollution.py --input recon/endpoints.json --output candidates.json [--probe-url <回显端点>]。 - 终止条件:
candidates.json生成。
4. validate → report
- 动作:过 7-Question Gate,通过的评估 gadget(是否有 sink 放大)取证。任一 NO → killed。
- 命令:
bash tools/validate.sh candidates.json。 - 终止条件:每条 confirmed/killed。
7-Question Gate(任一 NO 则 KILL)
- 目标在授权 scope 内?
- 键名确实进入递归合并/属性赋值?
- 有客观信号(注入属性被反射 / 默认值被改 / 已知 gadget 触发),非猜测?
- 达成了全局原型污染(影响其他对象),而非局部覆盖?
- 可复现(考虑污染残留,验证新连接仍受影响)?
- 已留存证据?
- 影响可陈述,且未做破坏性/持久化污染?
Finding 输出格式
### <Title>
- Severity: Critical | High | Medium | Low | Info
- Asset: <入口 + 参数/JSON 路径>
- Reproduction: <污染向量 payload + 观测到 huntpp 的请求>
- Impact: <DoS / 逻辑绕过 / XSS / RCE(gadget)>
- Evidence: <evidence/ 原始 payload + 反射证据>
- Status: confirmed | killed(<第几问 NO>)
参考
污染向量、服务端/客户端 gadget、检测特征、真实报告见 reference.md。