From 950f13a43c3d16e5acad03e787630f98779ed4d3 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 5 Aug 2025 00:33:35 +0000 Subject: [PATCH] Translated ['src/pentesting-web/xss-cross-site-scripting/dom-invader.md' --- .../xss-cross-site-scripting/dom-invader.md | 133 ++++++++++++------ 1 file changed, 91 insertions(+), 42 deletions(-) diff --git a/src/pentesting-web/xss-cross-site-scripting/dom-invader.md b/src/pentesting-web/xss-cross-site-scripting/dom-invader.md index 6e3450026..97e307f5d 100644 --- a/src/pentesting-web/xss-cross-site-scripting/dom-invader.md +++ b/src/pentesting-web/xss-cross-site-scripting/dom-invader.md @@ -4,80 +4,127 @@ ## DOM Invader -DOM Invader 是一个安装在 Burp 内置浏览器中的浏览器工具。它通过各种源和接收器,包括网络消息和原型污染,帮助**检测 DOM XSS 漏洞**。该工具作为扩展预安装。 +DOM Invader 是一个安装在 **Burp Suite 内置 Chromium 浏览器** 中的浏览器工具。它通过自动 **插桩 JavaScript 源和接收器** 来帮助 **检测 DOM XSS 和其他客户端漏洞**(原型污染、DOM 覆盖等)。该扩展随 Burp 一起提供,只需启用即可。 -DOM Invader 在浏览器的 DevTools 面板中集成了一个选项卡,支持以下功能: +DOM Invader 在浏览器的 DevTools 面板中添加了一个选项卡,让您可以: -1. **识别网页上可控的接收器**以进行 DOM XSS 测试,提供上下文和清理细节。 -2. **记录、编辑和重新发送通过 `postMessage()` 方法发送的网络消息**以进行 DOM XSS 测试。DOM Invader 还可以使用特别构造的网络消息自动检测漏洞。 -3. 检测 **客户端原型污染** 源并扫描发送到风险接收器的可控小工具。 -4. 识别 **DOM clobbering 漏洞**。 +1. **实时识别可控接收器**,包括上下文(属性、HTML、URL、JS)和应用的清理。 +2. **记录、编辑和重新发送 `postMessage()` 网络消息**,或让扩展自动变更它们。 +3. **检测客户端原型污染源并扫描 gadget→sink 链**,实时生成 PoC。 +4. **查找 DOM 覆盖向量**(例如 `id` / `name` 冲突,覆盖全局变量)。 +5. 通过丰富的设置 UI **微调行为**(自定义 canary、自动注入、重定向阻止、源/接收器列表等)。 -### 启用它 +--- -在 Burp 的内置浏览器中,转到 **Burp 扩展** 并启用它: +### 1. 启用它
-现在刷新页面,在 **Dev Tools** 中你会找到 **DOM Invader 选项卡:** +1. 打开 **Proxy ➜ Intercept ➜ Open Browser**(Burp 的嵌入式浏览器)。 +2. 点击 **Burp Suite** 徽标(右上角)。如果它被隐藏,先点击拼图块。 +3. 在 **DOM Invader** 选项卡中,将 **Enable DOM Invader** 切换为开启并按 **Reload**。 +4. 打开 DevTools( `F12` / 右键 ➜ 检查)并停靠。一个新的 **DOM Invader** 面板出现。 -
+> Burp 会根据配置文件记住状态。如有需要,在 *Settings ➜ Tools ➜ Burp’s browser ➜ Store settings...* 下禁用它。 -### 注入金丝雀 +### 2. 注入一个 Canary -在前面的图像中,你可以看到一个 **随机字符组,即金丝雀**。你现在应该开始在网页的不同部分(参数、表单、URL...)中 **注入** 它,并每次点击搜索。DOM Invader 将检查 **金丝雀是否结束于任何有趣的接收器**,可能被利用。 +一个 **canary** 是一个随机标记字符串(例如 `xh9XKYlV`),DOM Invader 会跟踪它。您可以: -此外,选项 **Inject URL params** 和 Inject forms 将自动打开一个 **新选项卡**,**注入** 每个找到的 **URL** 参数和 **表单** 中的 **金丝雀**。 +* **复制** 它并手动注入到参数、表单、Web-Socket 帧、网络消息等中。 +* 使用 **Inject URL params / Inject forms** 按钮打开一个新选项卡,canary 会自动附加到每个查询键/值或表单字段。 +* 搜索 **空 canary** 以揭示所有接收器,无论其可利用性如何(非常适合侦察)。 -### 注入空金丝雀 +#### 自定义 canary (2025+) -如果你只是想找到页面可能存在的潜在接收器,即使它们不可利用,你可以 **搜索一个空金丝雀**。 +Burp 2024.12 引入了 **Canary settings**(Burp 徽标 ➜ DOM Invader ➜ Canary)。您可以: -### 发送消息 +* **随机化** 或设置 **自定义字符串**(对多选项卡测试或默认值自然出现在页面上的情况很有帮助)。 +* **复制** 值到剪贴板。 +* 更改需要 **Reload**。 -DOM Invader 允许使用网络消息测试 DOM XSS,具有以下功能: +--- -1. **记录通过 `postMessage()` 发送的网络消息**,类似于 Burp Proxy 的 HTTP 请求/响应历史记录日志。 -2. **修改** 和 **重新发送** 网络消息以手动测试 DOM XSS,类似于 Burp Repeater 的功能。 -3. **自动更改** 和发送网络消息以探测 DOM XSS。 +### 3. 网络消息 (`postMessage`) -#### 消息详情 +**Messages** 子选项卡记录每个 `window.postMessage()` 调用,显示 `origin`、`source` 和 `data` 的使用情况。 -通过点击每条消息,可以查看详细信息,包括客户端 JavaScript 是否访问了消息的 `origin`、`data` 或 `source` 属性。 +• **修改并重新发送**:双击一条消息,编辑 `data`,然后按 **Send**(类似 Burp Repeater)。 -- **`origin`** : 如果 **消息的来源信息未检查**,你可能能够从 **任意外部域** 向事件处理程序发送跨域消息。但如果进行了检查,仍然可能不安全。 -- **`data`**: 这是发送有效负载的地方。如果此数据未使用,则接收器无用。 -- **`source`**: 评估源属性,通常引用一个 iframe,是否经过验证而不是来源。即使进行了检查,也不能保证验证无法被绕过。 +• **自动模糊**:在设置中启用 **Postmessage interception ➜ Auto-mutate**,让 DOM Invader 生成基于 canary 的有效负载并重放给处理程序。 -#### 回复消息 +字段含义回顾: -1. 从 **Messages** 视图中,点击任何消息以打开消息详情对话框。 -2. 根据需要编辑 **Data** 字段。 -3. 点击 **Send**。 +* **origin** – 处理程序是否验证 `event.origin`。 +* **data** – 有效负载位置。如果未使用,则接收器无关紧要。 +* **source** – iframe / window 引用验证;通常比严格的源检查弱。 -### 原型污染 +--- -DOM Invader 还可以搜索 **原型污染漏洞**。首先,你需要启用它: +### 4. 原型污染 -
+在 **Settings ➜ Attack types ➜ Prototype pollution** 下启用。 -然后,它将 **搜索源**,使你能够向 **`Object.prototype`** 添加任意属性。 +工作流程: + +1. **浏览** – DOM Invader 标记在 URL/query/hash 或 JSON 网络消息中找到的污染 **源**(`__proto__`、`constructor`、`prototype`)。 +2. **测试** – 点击 *Test* 打开一个 PoC 选项卡,其中应该存在 `Object.prototype.testproperty`: -如果找到任何内容,将出现一个 **Test** 按钮以 **测试找到的源**。点击它,将出现一个新选项卡,在控制台中创建一个对象并检查 `testproperty` 是否存在: ```javascript -let b = {} -b.testproperty +let obj = {}; +console.log(obj.testproperty); // ➜ 'DOM_INVADER_PP_POC' ``` -一旦你找到一个源,你可以**扫描小工具**: +3. **扫描小工具** – DOM Invader 暴力破解属性名称并跟踪是否有任何最终进入危险接收器(例如 `innerHTML`)。 +4. **利用** – 当找到小工具-接收器链时,会出现一个 *Exploit* 按钮,将源 + 小工具 + 接收器链在一起以触发警报。 -1. 当点击**扫描小工具**按钮时,DOM Invader会在**DOM**视图中任何已识别的原型污染源旁边打开一个新标签。然后开始扫描合适的小工具。 -2. 与此同时,在同一标签中,**DOM Invader**标签应在DevTools面板中打开。扫描完成后,通过已识别的小工具访问的任何接收点将在**DOM**视图中显示。例如,下面的示例中显示了一个名为`html`的小工具属性被传递到`innerHTML`接收点。 +高级设置(齿轮图标): -## DOM污染 +* **移除 CSP / X-Frame-Options** 以保持 iframe 在小工具扫描期间可用。 +* **在单独的帧中扫描技术** 以避免 `__proto__` 与 `constructor` 的干扰。 +* **单独禁用技术** 以适应脆弱的应用。 -在前面的图像中,可以看到可以开启DOM污染扫描。一旦完成,**DOM Invader将开始搜索DOM污染漏洞**。 +--- -## 参考 +### 5. DOM 覆盖 + +切换 **Attack types ➜ DOM clobbering**。DOM Invader 监控动态创建的元素,其 `id`/`name` 属性与全局变量或表单对象冲突(`` → 覆盖 `window.location`)。每当用户控制的标记导致变量替换时,会生成一个条目。 + +--- + +## 6. 设置概述 (2025) + +DOM Invader 现在分为 **Main / Attack Types / Misc / Canary** 类别。 + +1. **Main** +* **Enable DOM Invader** – 全局开关。 +* **Postmessage interception** – 开启/关闭消息记录;子开关用于自动变更。 +* **Custom Sources/Sinks** – *齿轮图标* ➜ 启用/禁用特定接收器(例如 `eval`、`setAttribute`),可能会破坏应用。 + +2. **Attack Types** +* **Prototype pollution**(具有每种技术的设置)。 +* **DOM clobbering**。 + +3. **Misc** +* **Redirect prevention** – 阻止客户端重定向,以免接收器列表丢失。 +* **Breakpoint before redirect** – 在重定向前暂停 JS 以进行调用栈检查。 +* **Inject canary into all sources** – 自动在所有地方注入 canary;可配置的源/参数允许列表。 + +4. **Canary** +* 查看 / 随机化 / 设置自定义 canary;复制到剪贴板。更改需要浏览器重载。 + +--- + +### 7. 提示与良好实践 + +* **使用不同的 canary** – 避免使用常见字符串如 `test`,否则会出现误报。 +* **暂时禁用重型接收器**(`eval`、`innerHTML`),如果它们在导航期间破坏页面功能。 +* **与 Burp Repeater & Proxy 结合使用** – 复制产生脆弱状态的浏览器请求/响应,并制作最终的利用 URL。 +* **记住框架范围** – 源/接收器按浏览上下文显示;iframe 内的漏洞可能需要手动关注。 +* **导出证据** – 右键点击 DOM Invader 面板 ➜ *保存截图* 以包含在报告中。 + +--- + +## References - [https://portswigger.net/burp/documentation/desktop/tools/dom-invader](https://portswigger.net/burp/documentation/desktop/tools/dom-invader) - [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/enabling](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/enabling) @@ -85,5 +132,7 @@ b.testproperty - [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/web-messages](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/web-messages) - [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/prototype-pollution](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/prototype-pollution) - [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/dom-clobbering](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/dom-clobbering) +- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/settings/canary](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/settings/canary) +- [https://portswigger.net/burp/documentation/desktop/tools/dom-invader/settings/misc](https://portswigger.net/burp/documentation/desktop/tools/dom-invader/settings/misc) {{#include ../../banners/hacktricks-training.md}}