hunt-prototype-pollution · git:20260806.1b94651 · 2026-08-06 · sha256 2a831ff5e187e367

hunt-prototype-pollution git:20260806.1b94651A

Immutable. This exact content is served forever at /api/v1/blob/2a831ff5e187e367.

---
name: hunt-prototype-pollution
description: 在授权渗透测试中挖掘 JavaScript 原型污染(prototype pollution,服务端 Node.js 与客户端)。当目标把用户可控的键名递归合并进对象(merge/extend/set/clone、JSON body、query 解析)时使用——典型场景:用 `__proto__`/`constructor.prototype` 注入属性,污染全局原型,进而 DoS、改逻辑、配合 gadget 提权到 XSS/RCE。适用目标类型 Web / REST API(Node.js) / 前端。触发场景包括用户说"测下原型污染""这个 merge 能不能 __proto__""污染原型打 RCE/XSS""lodash/jquery 有没有污染点"。输出:污染点 + 可用 gadget 判定 + 反射证据的 finding(含 killed 记录)。
allowed-tools: Read, Grep, Glob, Bash
---

# 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)

1. 目标在**授权 scope** 内?
2. 键名确实进入**递归合并/属性赋值**?
3. 有**客观信号**(注入属性被反射 / 默认值被改 / 已知 gadget 触发),非猜测?
4. 达成了**全局原型污染**(影响其他对象),而非局部覆盖?
5. **可复现**(考虑污染残留,验证新连接仍受影响)?
6. 已留存**证据**?
7. 影响可陈述,且未做破坏性/持久化污染?

## 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`。