23 KiB
DOM XSS
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 你在一个网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载HackTricks的PDF吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品The PEASS Family
- 获得官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组或关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。
DOM XSS漏洞
源
源是一个接受潜在受攻击者控制的数据的JavaScript属性。一个源的例子是
location.search
属性,因为它从查询字符串中读取输入,这对攻击者来说相对简单。最终,任何可以被攻击者控制的属性都是潜在的源。这包括引用URL(由document.referrer
字符串公开)、用户的cookies(由document.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
事件。这意味着您需要使用替代元素,如 img
或 iframe
。
这种类型的 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 🎥
- 你在一家网络安全公司工作吗?想要在HackTricks中看到你的公司广告吗?或者你想要获取PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品——The PEASS Family
- 获得官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组,或者关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。