sparklair/csppscan

GitHub: sparklair/csppscan

基于 Playwright 的客户端原型污染扫描器,自动发现浏览器 gadget 并通过 alert PoC 验证可利用的污染链。

Stars: 0 | Forks: 0

# CSPPSCAN ![csppscan logo](https://raw.githubusercontent.com/sparklair/csppscan/main/assets/csppscan-logo.png) `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安全, 原型链污染, 客户端漏洞扫描, 漏洞验证, 特征检测, 蓝队分析, 逆向工具