DOM XSS
DOM漏洞
当来自攻击者控制的源(如location.search
、document.referrer
或document.cookie
)的数据不安全地传输到接收端时,就会发生DOM漏洞。接收端是可以执行或呈现有害内容的函数或对象(例如eval()
、document.body.innerHTML
)。
源是攻击者可以操纵的输入,包括URL、Cookie和Web消息。
接收端是潜在危险的终点,恶意数据可能导致不良影响,如脚本执行。
当数据从源流向接收端时,如果没有适当的验证或清理,就会产生风险,从而可能导致XSS等攻击。
您可以在 https://github.com/wisec/domxsswiki/wiki 中找到更多更新的源和接收端列表。
常见源:
常见漏洞:
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()
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
someDOMElement.action
someDOMElement.onevent
JSON.parse()
sessionStorage.setItem()
document.write()
jQuery.parseJSON()
localStorage.setItem()
document.evaluate()
document.writeln()
$.parseJSON()
**[**`拒绝服务`**](dom-xss.md#denial-of-service)**
someDOMElement.evaluate()
document.title
requestFileSystem()
document.implementation.createHTMLDocument()
document.cookie
RegExp()
document.domain
history.pushState()
history.replaceState()
WebSocket
executeSql()
postMessage()
``
``
innerHTML
漏洞在任何现代浏览器上不接受 script
元素,也不会触发 svg onload
事件。这意味着您需要使用替代元素如 img
或 iframe
。
这种类型的XSS可能是最难发现的,因为您需要查看JS代码内部,查看是否使用了您可以控制的任何对象的值,并在这种情况下,查看是否有任何滥用它以执行任意JS的方法。
查找工具
示例
开放重定向
来源:https://portswigger.net/web-security/dom-based/open-redirection
DOM中的开放重定向漏洞 发生在脚本将攻击者可以控制的数据写入能够跨域进行导航的漏洞点时。
重要的是要理解,如果您控制重定向发生的URL起始部分,那么执行任意代码,如 javascript:alert(1)
,是可能的。
漏洞点:
Cookie manipulation
From: https://portswigger.net/web-security/dom-based/cookie-manipulation
DOM-based cookie-manipulation漏洞发生在脚本将攻击者可控制的数据合并到cookie的值中时。如果cookie在网站内部使用,此漏洞可能导致网页的意外行为。此外,如果cookie用于跟踪用户会话,则可以利用它来执行会话固定攻击。与此漏洞相关的主要漏洞点是:
Sinks:
JavaScript注入
From: https://portswigger.net/web-security/dom-based/javascript-injection
DOM-based JavaScript注入漏洞是在脚本运行数据时创建的,这些数据可以被攻击者控制为JavaScript代码。
Sinks:
文档域操纵
来源:https://portswigger.net/web-security/dom-based/document-domain-manipulation
文档域操纵漏洞发生在脚本使用攻击者可控制的数据设置document.domain
属性时。
document.domain
属性在浏览器中对同源策略的执行起着关键作用。当来自不同源的两个页面将它们的document.domain
设置为相同值时,它们可以无限制地进行交互。尽管浏览器对可分配给document.domain
的值施加一定的限制,防止将完全不相关的值分配给实际页面源,但也存在例外情况。通常,浏览器允许使用子域或父域。
漏洞点:
WebSocket-URL poisoning
From: https://portswigger.net/web-security/dom-based/websocket-url-poisoning
WebSocket-URL毒化发生在脚本使用可控数据作为WebSocket连接的目标URL时。
Sinks:
WebSocket
构造函数可能导致WebSocket-URL毒化漏洞。
链接操纵
From: https://portswigger.net/web-security/dom-based/link-manipulation
基于DOM的链接操纵漏洞发生在脚本将攻击者可控数据写入当前页面内的导航目标,如可点击链接或表单的提交URL时。
Sinks:
Ajax请求操纵
From: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation
Ajax请求操纵漏洞会在脚本将可由攻击者控制的数据写入使用XmlHttpRequest
对象发出的Ajax请求时出现。
Sinks:
本地文件路径操纵
来源:https://portswigger.net/web-security/dom-based/local-file-path-manipulation
本地文件路径操纵漏洞会在脚本将可由攻击者控制的数据传递给文件处理 API作为 filename
参数时出现。攻击者可以利用这个漏洞构造一个 URL,如果被另一个用户访问,可能导致用户的浏览器打开或写入任意本地文件。
漏洞点:
客户端SQL注入
From: https://portswigger.net/web-security/dom-based/client-side-sql-injection
客户端SQL注入漏洞发生在脚本以不安全的方式将可由攻击者控制的数据合并到客户端SQL查询中时。
Sinks:
HTML5存储操纵
来源:https://portswigger.net/web-security/dom-based/html5-storage-manipulation
HTML5存储操纵漏洞是指脚本将可由攻击者控制的数据存储在Web浏览器的HTML5存储(localStorage
或sessionStorage
)中时出现的漏洞。虽然这个操作本身并不是一个安全漏洞,但如果应用程序随后不安全地读取并处理存储的数据,就会变得有问题。这可能允许攻击者利用存储机制进行其他基于DOM的攻击,如跨站脚本和JavaScript注入。
漏洞点:
XPath注入
From: https://portswigger.net/web-security/dom-based/client-side-xpath-injection
DOM-based XPath注入漏洞发生在脚本将可由攻击者控制的数据合并到XPath查询中时。
Sinks:
客户端JSON注入
From: https://portswigger.net/web-security/dom-based/client-side-json-injection
DOM-based JSON注入漏洞发生在脚本将可由攻击者控制的数据合并到一个被解析为JSON数据结构的字符串中,然后由应用程序处理时。
Sinks:
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的外观或行为。
漏洞点:
拒绝服务
来源:https://portswigger.net/web-security/dom-based/denial-of-service
基于DOM的拒绝服务漏洞发生在脚本将可由攻击者控制的数据不安全地传递给有问题的平台API时。这包括当调用时可能导致用户计算机消耗过多的CPU或磁盘空间的API。这类漏洞可能会产生重大副作用,例如浏览器通过拒绝尝试将数据存储在localStorage
中或终止繁忙脚本来限制网站功能。
漏洞点:
DOM欺骗
最后更新于