sparklair/csppscan
GitHub: sparklair/csppscan
基于 Playwright 的客户端原型污染扫描器,自动发现浏览器 gadget 并通过 alert PoC 验证可利用的污染链。
Stars: 0 | Forks: 0
# CSPPSCAN

`csppscan` 是一个基于 Playwright 的客户端原型污染扫描器,专为授权的漏洞赏金和安全研究工作流设计。
它会在真实的 Chromium 浏览器中打开目标,确认客户端原型污染源,从目标页面的脚本中推导出候选的 gadget key,并且只有当它能够验证触发 `alert('polluted')` 的 PoC 时才会报告漏洞。
`csppscan` 特意将范围限定在浏览器/客户端原型污染。它不会测试服务端 JavaScript、Node.js API 处理程序、数据库持久化、后端合并逻辑或非浏览器端的影响。
## 功能
- 查询字符串和 hash payload 测试:
- `__proto__[pp_probe]=__PPSCAN_SOURCE__`
- `constructor[prototype][pp_probe]=__PPSCAN_SOURCE__`
- 点号表示法变体
- 有缺陷的过滤器的绕过变体,例如 `__pro__proto__to__`。
- 同源爬取模式。
- 基于脚本推导的 gadget key 发现。
- 默认验证 alert PoC。
- 为每个 payload 使用独立的浏览器上下文,以减少检查之间污染状态的泄露。
- 针对可利用 gadget 信号的浏览器 sink 插桩:
- `innerHTML`
- `outerHTML`
- `insertAdjacentHTML`
- `setAttribute`
- `document.write`
- `eval`
- `Function`
- `setTimeout`
- `setInterval`
- `HTMLScriptElement.src`
- `HTMLIFrameElement.src`
- `HTMLIFrameElement.srcdoc`
- 在 `findings/` 目录下为每个目标生成单独的发现文件。
- 简单的 CLI,支持单个目标或目标列表。
## 安装
```
git clone https://github.com/your-name/clientpropscanner.git
cd clientpropscanner
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
playwright install chromium
chmod +x csppscan
```
在 Windows PowerShell 中:
```
python -m venv venv
.\venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
python -m playwright install chromium
```
Windows 用户可以运行内置的命令包装器:
```
.\csppscan.cmd -h
```
## 用法
在 Windows PowerShell 中,请将示例中的 `./csppscan` 替换为 `.\csppscan.cmd`。
扫描单个目标:
```
./csppscan -u https://example.com
```
默认模式执行完整的客户端利用链:
```
source detection -> script-derived gadget discovery -> alert PoC verification
```
扫描目标列表:
```
./csppscan -f targets.txt
```
启用同源爬取:
```
./csppscan -u https://example.com --crawl --max-pages 25
```
调整并发和超时:
```
./csppscan -f targets.txt --crawl -c 5 --timeout 20000
```
在调试时显示内部 gadget 候选项和失败的 PoC 尝试:
```
./csppscan -u https://example.com --show-candidates
```
仅确认客户端污染源并跳过 gadget 发现:
```
./csppscan -u https://example.com --no-discover-gadgets
```
打印 PoC 候选 URL,但不打开它们进行 alert 验证:
```
./csppscan -u https://example.com --no-verify-poc
```
你可以将特定于应用程序的额外 key 添加到基于脚本推导的 key 列表中:
```
./csppscan -u https://example.com --gadget-keys keys.txt
```
在手动检查 PoC 时以可见的浏览器窗口运行:
```
./csppscan -u https://example.com --headed
```
`targets.txt` 支持空行和注释:
```
# 程序 scope
https://app.example.com
https://admin.example.com
```
## 输出
控制台输出特意保持保守:
```
[*] Scanning https://example.com/
[+] [SOURCE][query:__proto__[key]] https://example.com/?__proto__[pp_probe]=__PPSCAN_SOURCE__
[+] [VULN][source=query:__proto__[key]][key=transport_url][sink=HTMLScriptElement.src] https://example.com/?__proto__[transport_url]=data%3A%2Calert%28%27polluted%27%29%2F%2F
```
发现结果保存在:
```
findings/
```
每个目标都会生成一个单独的文本文件。`[SOURCE]` 发现意味着在浏览器中确认了客户端原型污染源。`[VULN]` 发现意味着扫描器找到了具体的浏览器 gadget key,并验证了打印的 URL 会触发 `alert('polluted')`。除非使用 `--show-candidates`,否则内部候选项将被隐藏。
## 检测示例
已验证的 `script.src` gadget:
```
[*] Scanning https://example.com/
[+] [SOURCE][query:__proto__[key]] https://example.com/?__proto__[pp_probe]=__PPSCAN_SOURCE__
[+] [VULN][source=query:__proto__[key]][key=transport_url][sink=HTMLScriptElement.src] https://example.com/?__proto__[transport_url]=data%3A%2Calert%28%27polluted%27%29%2F%2F
[+] Scan summary for https://example.com/: sources=1, verified_alert_pocs=1
```
这意味着页面读取了被污染的 `transport_url` 属性,将其分配给
script 的 `src`,并且打印的 URL 被确认会触发 `alert('polluted')`。
已验证的 HTML sink gadget:
```
[+] [VULN][source=query:__proto__[key]][key=html][sink=innerHTML] https://example.com/?__proto__[html]=%3Cimg%20src%3Dx%20onerror%3Dalert%28%27polluted%27%29%3E
```
这意味着页面读取了被污染的 `html` 属性,并将其写入到如
`innerHTML` 之类的 HTML sink 中。
已验证的嵌套浏览器 API gadget:
```
[+] [VULN][source=query:__proto__[key]][key=headers.x-username][sink=innerHTML] https://example.com/?__proto__[headers][x-username]=%3Cimg%20src%3Dx%20onerror%3Dalert%28%27polluted%27%29%3E
```
这意味着页面读取了 `Object.prototype.headers["x-username"]`,将其
通过浏览器/API 流传递,并且返回的值到达了 HTML sink。
已确认污染源但没有验证的 alert PoC:
```
[+] [SOURCE][query:__proto__[key]] https://example.com/?__proto__[pp_probe]=__PPSCAN_SOURCE__
[!] Scan summary for https://example.com/: sources=1, gadget_candidates=0, verified_alert_pocs=0
```
这本身并不是一个可以直接报告的漏洞。它意味着客户端原型污染
已被确认,但在测试的页面状态下,`csppscan` 没有找到能够
产生 alert PoC 的可利用浏览器 gadget。
调试输出:
```
./csppscan -u https://example.com --show-candidates
```
当你想查看内部候选 key 和失败的 PoC
尝试时,请使用调试模式。正常模式会隐藏这些内容,以避免产生嘈杂、具有误导性的输出。
## CLI 选项
```
-u, --url Single target URL
-f, --file File with target URLs
--crawl Crawl same-origin links before scanning
--max-pages Maximum crawled pages per target, default: 10
-c, --concurrency Concurrent browser checks, default: 3
--timeout Navigation timeout in milliseconds, default: 15000
--no-verify-poc Print PoC candidates without confirming alert dialogs
--no-discover-gadgets
Only confirm prototype pollution sources
--show-candidates Show internal candidates and failed PoC attempts
--try-all-sources Run gadget discovery for every confirmed source vector
--gadget-keys File with extra polluted property names for discovery
--max-gadget-keys Maximum script-derived gadget keys to test per URL, default: 50
--headed Run Chromium with a visible browser window
```
## 工作原理
`csppscan` 通过 Playwright 启动 Chromium,收集同源脚本,提取可能的 gadget key,然后在全新的浏览器上下文中测试每个源向量。
对于源 payload,它会将 payload 附加到查询字符串或 URL fragment 中,并检查是否:
```
Object.prototype.pp_probe === '__PPSCAN_SOURCE__'
```
在确认了源之后,它会用唯一的标记去污染脚本推导出的 key。浏览器 hook 会监控可利用的 sink。如果一个 key 到达了 sink,`csppscan` 会构建一个 `alert('polluted')` 的 PoC URL,并在没有插桩的情况下再次打开它。只有真正的弹窗对话框才会被报告为 `[VULN]`。
## 扩展 Payload
在 `payloads.py` 中添加新的源向量或后备 key:
```
DEFAULT_GADGET_KEYS = [
"transport_url",
"sequence",
"value",
]
```
推荐添加的下一组 payload 家族:
- 框架特定的 key
- 过滤器配置 key
- 客户端路由状态 key
- 库特定的合并解析器绕过
- 在侦查阶段发现的特定于应用程序的功能标志
## 漏洞赏金工作流
一个实际的工作流通常如下所示:
```
subdomain discovery -> HTTP probing -> crawling -> csppscan -> manual gadget analysis -> proof of impact
```
当你能够展示出超出污染本身的影响时(例如 DOM XSS、过滤器绕过,或对安全敏感的浏览器端配置值的控制),客户端原型污染报告才最具说服力。
## 适用范围
`csppscan` 检查浏览器执行的 JavaScript 和浏览器可观察到的影响。
在范围内:
- 源自查询字符串或 URL fragment 的客户端原型污染。
- 来自内联和同源脚本的浏览器 gadget 发现。
- 可以产生浏览器 alert PoC 的 DOM/代码/URL sink。
- 用于发现额外客户端路由的同源爬取。
不在范围内:
- Node.js 或其他后端运行时中的服务端原型污染。
- 仅影响后端状态的 JSON API 污染。
- 跨请求的存储型/持久化污染。
- 没有浏览器 gadget 的授权、SSRF、RCE 或业务逻辑影响。
- 除非你自己添加了会话处理,否则不包含已认证的流程。
## 局限性
- 这是一个客户端扫描器,而不是一个完整的原型污染利用框架。
- 在 gadget 可达之前,动态行为可能需要点击、登录状态或特定于应用程序的导航。
- 某些 gadget 需要超越通用 `alert('polluted')` payload 的自定义 payload 塑造。
- Headless 浏览器行为可能与真实用户会话有所不同。
- 已认证区域需要你添加自己的会话处理或代理工作流。
## 本地冒烟测试
运行涵盖常见客户端模式的合成实验环境:
```
python tests/smoke_local_labs.py
```
## 法律声明
`csppscan` 旨在用于授权测试、漏洞赏研究和防御性验证。请勿在没有测试权限的系统上运行它。
标签:Go语言工具, Maven, Playwright, Web安全, 原型链污染, 客户端漏洞扫描, 漏洞验证, 特征检测, 蓝队分析, 逆向工具