DOMDig 是一个运行在 Chromium 浏览器内部的 DOM XSS 扫描器,可以递归地扫描单页应用(SPA)。
与其他扫描器不同,DOMDig 通过跟踪 DOM 修改和 XHR/fetch/websocket 请求来爬取任何 Web 应用(包括 Gmail),并通过触发事件来模拟真实用户交互。在此过程中,输入字段中会注入 XSS 载荷,并跟踪其执行情况,以发现注入点及相关的 URL 变更。
它基于 htcrawl 构建,这是一个功能强大的 Node 库,足以轻松爬取 Gmail 账户。
git clone https://github.com/fcavallarin/domdig.git
cd domdig && npm i && cd ..
node domdig/domdig.js
node domdig.js -c 'foo=bar' -p http:127.0.0.1:8080 https://fcvl.net/htcap/scanme/domxss.php
DOMDig 可以执行三种不同的检测:
DOM XSS 检测可配置不同模式,启用不同行为。默认情况下,所有模式均启用。
模式包括:
爬取 DOM,搜寻用户可注入 JavaScript 代码的位置(例如文本框)。它能发现扫描器无法猜测的注入点。例如,某个搜索功能获取输入框的文本,并将其作为 JSON 字符串放入 URL 的哈希中以触发搜索。
对 URL(查询参数和哈希)进行模糊测试,观察我们的代码是否在页面加载时执行。如果没有代码执行,则爬取 DOM 并触发 HTML 事件,希望找到能执行我们载荷的地方。
它还能发现经典的反射型 XSS。
在执行 DOM XSS 检测后,DOMDig 爬取同一页面,等待之前使用的载荷被执行。如果发现某个载荷仍在执行,则意味着它能在页面刷新后仍然存在。
搜索模板占位符(例如 {var1})可能被作为 JavaScript 代码执行的位置。
每个报告的漏洞包含以下字段:
domxss、stored 或 templateinjDOMDig 使用 htcrawl 作为爬取引擎。
下图展示了递归爬取的过程。

下面的视频展示了该引擎爬取 Gmail 的过程。爬取持续了数小时,捕获了约 3000 个 XHR 请求。
登录序列(或称初始序列)是一个 JSON 对象,包含扫描开始前要执行的一系列操作。列表中的每个元素是一个数组,其中第一个元素是操作名称,其余元素是这些操作的"参数"。
操作包括:
[
["navigate", "https://target.local/login-page"],
["write", "#username", "demo"],
["write", "#password", "demo"],
["sleep", 2],
["clickToNavigate", "#btn-login"]
]
载荷可以从 JSON 文件(-P 选项)加载,格式为字符串数组。要构建自定义载荷,必须使用字符串 window.___xssSink({0}) 作为要执行的函数(而不是经典的 alert(1))。
[
';window.___xssSink({0});',
'<img src="https://raw.githubusercontent.com/fcavallarin/domdig/master/a" onerror="window.___xssSink({0})">'
]