22 KiB
DOM XSS
{% hint style="success" %}
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 关注 我们的 Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 分享黑客技巧。
DOM 漏洞
DOM 漏洞发生在来自攻击者控制的 源(如 location.search
、document.referrer
或 document.cookie
)的数据不安全地传输到 接收点。接收点是可以执行或渲染有害内容的函数或对象(例如 eval()
、document.body.innerHTML
),如果给定恶意数据。
- 源 是可以被攻击者操控的输入,包括 URL、cookie 和网页消息。
- 接收点 是潜在危险的端点,恶意数据可能导致不良后果,例如脚本执行。
当数据从源流向接收点而没有适当的验证或清理时,风险就会出现,从而使攻击如 XSS 成为可能。
{% hint style="info" %} 您可以在 https://github.com/wisec/domxsswiki/wiki 找到更更新的源和接收点列表 {% endhint %}
常见源:
document.URL
document.documentURI
document.URLUnencoded
document.baseURI
location
document.cookie
document.referrer
window.name
history.pushState
history.replaceState
localStorage
sessionStorage
IndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB)
Database
常见的接收点:
开放重定向 | Javascript 注入 | DOM 数据操作 | jQuery |
---|---|---|---|
location |
eval() |
scriptElement.src |
add() |
location.host |
Function() constructor |
scriptElement.text |
after() |
location.hostname |
setTimeout() |
scriptElement.textContent |
append() |
location.href |
setInterval() |
scriptElement.innerText |
animate() |
location.pathname |
setImmediate() |
someDOMElement.setAttribute() |
insertAfter() |
location.search |
execCommand() |
someDOMElement.search |
insertBefore() |
location.protocol |
execScript() |
someDOMElement.text |
before() |
location.assign() |
msSetImmediate() |
someDOMElement.textContent |
html() |
location.replace() |
range.createContextualFragment() |
someDOMElement.innerText |
prepend() |
open() |
crypto.generateCRMFRequest() |
someDOMElement.outerText |
replaceAll() |
domElem.srcdoc |
``本地文件路径操作 | someDOMElement.value |
replaceWith() |
XMLHttpRequest.open() |
FileReader.readAsArrayBuffer() |
someDOMElement.name |
wrap() |
XMLHttpRequest.send() |
FileReader.readAsBinaryString() |
someDOMElement.target |
wrapInner() |
jQuery.ajax() |
FileReader.readAsDataURL() |
someDOMElement.method |
wrapAll() |
$.ajax() |
FileReader.readAsText() |
someDOMElement.type |
has() |
``Ajax 请求操作 | FileReader.readAsFile() |
someDOMElement.backgroundImage |
constructor() |
XMLHttpRequest.setRequestHeader() |
FileReader.root.getFile() |
someDOMElement.cssText |
init() |
XMLHttpRequest.open() |
FileReader.root.getFile() |
someDOMElement.codebase |
index() |
XMLHttpRequest.send() |
链接操作 | someDOMElement.innerHTML |
jQuery.parseHTML() |
jQuery.globalEval() |
someDOMElement.href |
someDOMElement.outerHTML |
$.parseHTML() |
$.globalEval() |
someDOMElement.src |
someDOMElement.insertAdjacentHTML |
客户端 JSON 注入 |
``HTML5 存储操作 | someDOMElement.action |
someDOMElement.onevent |
JSON.parse() |
sessionStorage.setItem() |
XPath 注入 | document.write() |
jQuery.parseJSON() |
localStorage.setItem() |
document.evaluate() |
document.writeln() |
$.parseJSON() |
**[**拒绝服务**](dom-xss.md#denial-of-service)** |
someDOMElement.evaluate() |
document.title |
``Cookie 操作 |
requestFileSystem() |
``文档域操作 | document.implementation.createHTMLDocument() |
document.cookie |
RegExp() |
document.domain |
history.pushState() |
WebSocket-URL 中毒 |
客户端 SQL 注入 | Web 消息操作 | history.replaceState() |
WebSocket |
executeSql() |
postMessage() |
`` | `` |
innerHTML
接收点在任何现代浏览器中都不接受 script
元素,也不会触发 svg onload
事件。这意味着您需要使用替代元素,如 img
或 iframe
。
这种类型的 XSS 可能是 最难发现的,因为您需要查看 JS 代码,看看它是否 使用 任何您 控制 的对象的 值,并在这种情况下,查看是否有 任何方法可以滥用 它来执行任意 JS。
查找工具
- https://github.com/mozilla/eslint-plugin-no-unsanitized
- 检查每个到达潜在接收点的数据的浏览器扩展:https://github.com/kevin-mizu/domloggerpp
示例
开放重定向
来自:https://portswigger.net/web-security/dom-based/open-redirection
DOM 中的开放重定向漏洞 发生在脚本将攻击者可以控制的数据写入能够跨域导航的接收点时。
理解执行任意代码(例如 javascript:alert(1)
)是可能的,如果您控制重定向发生的 URL 开头,这是至关重要的。
接收点:
location
location.host
location.hostname
location.href
location.pathname
location.search
location.protocol
location.assign()
location.replace()
open()
domElem.srcdoc
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.ajax()
$.ajax()
Cookie manipulation
来自: https://portswigger.net/web-security/dom-based/cookie-manipulation
基于DOM的cookie操控漏洞发生在脚本将攻击者可以控制的数据纳入cookie的值时。如果cookie在网站内被使用,这种漏洞可能导致网页出现意外行为。此外,如果cookie涉及用户会话跟踪,它可以被利用来进行会话固定攻击。与此漏洞相关的主要接收点是:
Sinks:
document.cookie
JavaScript 注入
来自: https://portswigger.net/web-security/dom-based/javascript-injection
基于 DOM 的 JavaScript 注入漏洞是在脚本将可以被攻击者控制的数据作为 JavaScript 代码运行时产生的。
Sinks:
eval()
Function() constructor
setTimeout()
setInterval()
setImmediate()
execCommand()
execScript()
msSetImmediate()
range.createContextualFragment()
crypto.generateCRMFRequest()
Document-domain manipulation
From: https://portswigger.net/web-security/dom-based/document-domain-manipulation
文档域操控漏洞发生在脚本使用攻击者可以控制的数据设置document.domain
属性时。
document.domain
属性在浏览器的同源策略的执行中发挥着关键作用。当来自不同源的两个页面将其document.domain
设置为相同的值时,它们可以不受限制地进行交互。尽管浏览器对可分配给document.domain
的值施加了某些限制,防止将完全不相关的值分配给实际页面源,但仍然存在例外。通常,浏览器允许使用子域或父域。
Sinks:
document.domain
WebSocket-URL poisoning
来自: https://portswigger.net/web-security/dom-based/websocket-url-poisoning
WebSocket-URL poisoning 发生在脚本将 可控数据作为 WebSocket 连接的目标 URL 使用时。
Sinks:
WebSocket
构造函数可能导致 WebSocket-URL poisoning 漏洞。
Link manipulation
来自: https://portswigger.net/web-security/dom-based/link-manipulation
DOM-based link-manipulation 漏洞 出现于脚本将 攻击者可控的数据写入当前页面的导航目标,例如可点击的链接或表单的提交 URL。
Sinks:
someDOMElement.href
someDOMElement.src
someDOMElement.action
Ajax 请求操控
来自: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation
Ajax 请求操控漏洞 出现于脚本将 攻击者可控的数据写入使用 XmlHttpRequest
对象发出的 Ajax 请求 时。
Sinks:
XMLHttpRequest.setRequestHeader()
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.globalEval()
$.globalEval()
本地文件路径操控
来自: https://portswigger.net/web-security/dom-based/local-file-path-manipulation
本地文件路径操控漏洞 出现于脚本将 攻击者可控的数据传递给文件处理API 作为 filename
参数。攻击者可以利用此漏洞构造一个URL,如果另一个用户访问该URL,可能导致 用户的浏览器打开或写入任意本地文件。
Sinks:
FileReader.readAsArrayBuffer()
FileReader.readAsBinaryString()
FileReader.readAsDataURL()
FileReader.readAsText()
FileReader.readAsFile()
FileReader.root.getFile()
FileReader.root.getFile()
客户端 SQL 注入
来自: https://portswigger.net/web-security/dom-based/client-side-sql-injection
客户端 SQL 注入漏洞 发生在脚本以 不安全的方式将攻击者可控的数据纳入客户端 SQL 查询 时。
Sinks:
executeSql()
HTML5-storage manipulation
From: https://portswigger.net/web-security/dom-based/html5-storage-manipulation
HTML5-storage manipulation vulnerabilities 出现于脚本 将攻击者可控的数据存储在网页浏览器的 HTML5 存储中 (localStorage
或 sessionStorage
)。虽然此操作本身并不是安全漏洞,但如果应用程序随后 读取存储的数据并不安全地处理它,则会变得有问题。这可能允许攻击者利用存储机制进行其他基于 DOM 的攻击,例如跨站脚本和 JavaScript 注入。
Sinks:
sessionStorage.setItem()
localStorage.setItem()
XPath 注入
来自: https://portswigger.net/web-security/dom-based/client-side-xpath-injection
基于 DOM 的 XPath 注入漏洞 发生在脚本将 攻击者可控的数据纳入 XPath 查询 时。
Sinks:
document.evaluate()
someDOMElement.evaluate()
客户端 JSON 注入
来自: https://portswigger.net/web-security/dom-based/client-side-json-injection
基于 DOM 的 JSON 注入漏洞 发生在脚本将 攻击者可控的数据纳入一个被解析为 JSON 数据结构的字符串中,然后由应用程序处理。
Sinks:
JSON.parse()
jQuery.parseJSON()
$.parseJSON()
Web-message manipulation
From: https://portswigger.net/web-security/dom-based/web-message-manipulation
Web-message vulnerabilities 在脚本将 攻击者可控的数据作为网络消息发送到浏览器内的另一个文档 时产生。一个 示例 的脆弱Web消息操控可以在 PortSwigger的Web安全学院 找到。
Sinks:
postMessage()
方法用于发送网络消息,如果接收消息的事件监听器以不安全的方式处理传入数据,则可能导致漏洞。
DOM-data manipulation
From: https://portswigger.net/web-security/dom-based/dom-data-manipulation
DOM-data manipulation vulnerabilities 在脚本将 攻击者可控的数据写入DOM中的一个字段 时产生,该字段在可见的UI或客户端逻辑中被使用。攻击者可以利用此漏洞构造一个URL,如果另一个用户访问该URL,可以改变客户端UI的外观或行为。
Sinks:
scriptElement.src
scriptElement.text
scriptElement.textContent
scriptElement.innerText
someDOMElement.setAttribute()
someDOMElement.search
someDOMElement.text
someDOMElement.textContent
someDOMElement.innerText
someDOMElement.outerText
someDOMElement.value
someDOMElement.name
someDOMElement.target
someDOMElement.method
someDOMElement.type
someDOMElement.backgroundImage
someDOMElement.cssText
someDOMElement.codebase
document.title
document.implementation.createHTMLDocument()
history.pushState()
history.replaceState()
Denial of Service
From: https://portswigger.net/web-security/dom-based/denial-of-service
基于DOM的拒绝服务漏洞发生在脚本将攻击者可控的数据不安全地传递给有问题的平台API时。这包括在调用时可能导致用户计算机消耗过多的CPU或磁盘空间的API。这类漏洞可能会产生显著的副作用,例如浏览器通过拒绝尝试在localStorage
中存储数据或终止繁忙的脚本来限制网站的功能。
Sinks:
requestFileSystem()
RegExp()
Dom Clobbering
{% content-ref url="dom-clobbering.md" %} dom-clobbering.md {% endcontent-ref %}
{% hint style="success" %}
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 关注 我们的 Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。