hacktricks/pentesting-web/xss-cross-site-scripting/dom-xss.md
2023-08-03 19:12:22 +00:00

23 KiB
Raw Blame History

DOM XSS

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

DOM XSS漏洞

源是一个接受潜在受攻击者控制的数据的JavaScript属性。一个源的例子是location.search属性因为它从查询字符串中读取输入这对攻击者来说相对简单。最终任何可以被攻击者控制的属性都是潜在的源。这包括引用URLdocument.referrer字符串公开、用户的cookiesdocument.cookie字符串公开和Web消息。

汇是一个潜在危险的JavaScript函数或DOM对象如果传递给它的数据受到攻击者控制可能会导致不良影响。例如eval()函数是一个汇因为它将传递给它的参数作为JavaScript进行处理。HTML汇的一个例子是document.body.innerHTML因为它可能允许攻击者注入恶意HTML并执行任意JavaScript。

从根本上讲,当一个网站将数据从源传递到汇然后在客户端会话的上下文中以不安全的方式处理数据时就会出现DOM-based漏洞。

{% 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 事件。这意味着您需要使用替代元素,如 imgiframe

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

用于查找的工具

示例

开放重定向

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

如何

DOM-based 开放重定向漏洞是在脚本将可由攻击者控制的数据写入可以触发跨域导航漏洞点时产生的。

请记住,如果您可以开始 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()

Cookie操纵

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

如何进行

DOM-based cookie操纵漏洞是指脚本将攻击者可控数据写入cookie的值中。
这可能被滥用以使页面以意外的方式行为如果cookie在网页中使用或者用于执行会话固定攻击如果cookie用于跟踪用户的会话

漏洞点

document.cookie

JavaScript注入

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

如何进行

DOM-based JavaScript注入漏洞是指当脚本将攻击者可控数据作为JavaScript代码执行时产生的漏洞。

漏洞点

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请求操纵

来源:https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation

如何进行

当脚本使用XmlHttpRequest对象发出Ajax请求并将可由攻击者控制的数据写入该请求就会出现Ajax请求操纵漏洞。

漏洞点

XMLHttpRequest.setRequestHeader()
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.globalEval()
$.globalEval()

本地文件路径操纵

来源:https://portswigger.net/web-security/dom-based/local-file-path-manipulation

如何进行

当脚本将受攻击者控制的数据作为filename参数传递给文件处理API时就会出现本地文件路径操纵漏洞。攻击者可以利用这个漏洞构造一个URL如果被其他用户访问将导致用户的浏览器打开/写入任意本地文件

漏洞点

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注入漏洞。

漏洞点

executeSql()

HTML5存储操纵

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

如何进行

当脚本将可由攻击者控制的数据存储在Web浏览器的HTML5存储中(无论是localStorage还是sessionStorage就会出现HTML5存储操纵漏洞。
这种行为本身并不构成安全漏洞。然而,如果应用程序稍后从存储中读取数据并以不安全的方式处理攻击者可能利用存储机制来进行其他基于DOM的攻击如跨站脚本和JavaScript注入。

漏洞点

sessionStorage.setItem()
localStorage.setItem()

XPath注入

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

如何进行

DOM-based XPath注入漏洞是指当脚本将攻击者可控数据合并到XPath查询中时产生的漏洞。

漏洞点

document.evaluate()
someDOMElement.evaluate()

客户端JSON注入

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

如何进行

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

漏洞点

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

Web消息操纵

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

如何进行攻击

当脚本将可由攻击者控制的数据作为Web消息发送到浏览器中的另一个文档就会出现Web消息漏洞。
https://portswigger.net/web-security/dom-based/controlling-the-web-message-source中有一个易受攻击的Web消息操纵示例。

漏洞点

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

DOM数据操纵

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

如何进行攻击

当脚本将可由攻击者控制的数据写入DOM中的字段并在可见的用户界面或客户端逻辑中使用时就会出现DOM数据操纵漏洞。攻击者可以利用此漏洞构造一个URL如果被其他用户访问将修改客户端用户界面的外观或行为。

漏洞点

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-based拒绝服务漏洞是指当脚本以不安全的方式将攻击者可控数据传递给有问题的平台API时产生的。这些API的调用可能导致用户计算机消耗过多的CPU或磁盘空间。如果浏览器限制了网站的功能,例如拒绝尝试将数据存储在localStorage中或终止繁忙的脚本,这可能会产生副作用。

漏洞点

requestFileSystem()
RegExp()

Dom Clobbering

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

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