hacktricks/pentesting-web/xss-cross-site-scripting/dom-xss.md

22 KiB
Raw Blame History

DOM XSS

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

DOM漏洞

当来自攻击者控制的(如location.searchdocument.referrerdocument.cookie)的数据不安全地传输到接收点就会发生DOM漏洞。接收点是可以执行或呈现有害内容的函数或对象例如eval()document.body.innerHTML)。

  • 是攻击者可以操纵的输入包括URL、cookie和Web消息。
  • 接收点是潜在危险的终点,恶意数据可能导致不良影响,如脚本执行。

当数据从源流向接收点而没有适当的验证或清理时就会产生风险从而可能导致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() 构造函数 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 事件。这意味着您需要使用替代元素如 imgiframe

这种类型的XSS可能是最难发现因为您需要查看JS代码内部查看是否使用了您可以控制的任何对象的,并在这种情况下,查看是否有任何滥用它以执行任意JS的方法。

查找工具

示例

开放重定向

来源:https://portswigger.net/web-security/dom-based/open-redirection

DOM中的开放重定向漏洞 发生在脚本将攻击者可以控制的数据写入能够跨域进行导航的漏洞点时。

重要的是要理解如果您控制重定向发生的URL的起始部分那么执行任意代码例如 javascript:alert(1),是可能的。

漏洞点:

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()

From: https://portswigger.net/web-security/dom-based/cookie-manipulation

DOM-based cookie-manipulation漏洞发生在脚本将可以被攻击者控制的数据合并到cookie的值中时。如果cookie在网站内部使用这种漏洞可能导致网页的意外行为。此外如果cookie用于跟踪用户会话还可以利用它来执行会话固定攻击。与此漏洞相关的主要漏洞点是

漏洞点:

document.cookie

JavaScript注入

From: https://portswigger.net/web-security/dom-based/javascript-injection

DOM-based JavaScript注入漏洞是在脚本运行数据时创建的这些数据可以被攻击者控制为JavaScript代码。

Sinks:

eval()
Function() constructor
setTimeout()
setInterval()
setImmediate()
execCommand()
execScript()
msSetImmediate()
range.createContextualFragment()
crypto.generateCRMFRequest()

文档域操纵

来源:https://portswigger.net/web-security/dom-based/document-domain-manipulation

文档域操纵漏洞发生在脚本使用攻击者可控制的数据设置document.domain属性时。

document.domain属性在浏览器中通过同源策略执行中发挥关键作用。当来自不同源的两个页面将它们的document.domain设置为相同值时,它们可以无限制地进行交互。尽管浏览器对可分配给document.domain的值施加一定的限制,防止将完全不相关的值分配给实际页面源,但也存在例外。通常,浏览器允许使用子域父域

漏洞点:

document.domain

WebSocket-URL毒化

来源:https://portswigger.net/web-security/dom-based/websocket-url-poisoning

WebSocket-URL毒化发生在脚本使用可控数据作为WebSocket连接的目标URL时。

漏洞点:

WebSocket构造函数可能导致WebSocket-URL毒化漏洞。

链接操纵

来源:https://portswigger.net/web-security/dom-based/link-manipulation

基于DOM的链接操纵漏洞发生在脚本将可控数据写入当前页面内的导航目标例如可点击链接或表单的提交URL时。

someDOMElement.href
someDOMElement.src
someDOMElement.action

Ajax请求操纵

From: 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如果被另一个用户访问可能导致用户的浏览器打开或写入任意本地文件

漏洞点:

FileReader.readAsArrayBuffer()
FileReader.readAsBinaryString()
FileReader.readAsDataURL()
FileReader.readAsText()
FileReader.readAsFile()
FileReader.root.getFile()
FileReader.root.getFile()

客户端SQL注入

From: 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 arise when a script stores attacker-controllable data in the web browser's HTML5 storage (localStorage or sessionStorage). While this action is not inherently a security vulnerability, it becomes problematic if the application subsequently reads the stored data and processes it unsafely. This could allow an attacker to leverage the storage mechanism to conduct other DOM-based attacks, such as cross-site scripting and JavaScript injection.

Sinks:

sessionStorage.setItem()
localStorage.setItem()

XPath注入

From: https://portswigger.net/web-security/dom-based/client-side-xpath-injection

DOM-based XPath注入漏洞发生在脚本将可由攻击者控制的数据合并到XPath查询中时。

Sinks:

document.evaluate()
someDOMElement.evaluate()

客户端JSON注入

From: https://portswigger.net/web-security/dom-based/client-side-json-injection

DOM-based JSON注入漏洞发生在脚本将可由攻击者控制的数据合并到一个被解析为JSON数据结构的字符串中然后由应用程序处理时。

Sinks:

JSON.parse()
jQuery.parseJSON()
$.parseJSON()

Web消息操纵

From: https://portswigger.net/web-security/dom-based/web-message-manipulation

Web消息漏洞是指当脚本将可由攻击者控制的数据作为Web消息发送到浏览器中的另一个文档时产生的漏洞。一个易受攻击的Web消息操纵示例可在PortSwigger的Web安全学院找到。

漏洞点:

使用postMessage()方法发送Web消息如果用于接收消息的事件侦听器以不安全的方式处理传入数据可能会导致漏洞。

DOM数据操纵

From: https://portswigger.net/web-security/dom-based/dom-data-manipulation

DOM数据操纵漏洞是指当脚本将可由攻击者控制的数据写入DOM中的字段并在可见UI或客户端逻辑中使用时产生的漏洞。攻击者可以利用这种漏洞构造一个URL如果另一个用户访问该URL可能会改变客户端UI的外观或行为。

漏洞点:

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()

拒绝服务

来源:https://portswigger.net/web-security/dom-based/denial-of-service

基于DOM的拒绝服务漏洞发生在脚本将可由攻击者控制的数据不安全地传递给有问题的平台API时。这包括那些在调用时可能导致用户计算机消耗过多的CPU或磁盘空间的API。这类漏洞可能产生重大副作用例如浏览器通过拒绝尝试将数据存储在localStorage中或终止繁忙脚本来限制网站功能。

漏洞点:

requestFileSystem()
RegExp()

DOM欺骗

{% content-ref url="dom-clobbering.md" %} dom-clobbering.md {% endcontent-ref %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥