【Web漏洞指南】DOM XSS

发布于:2024-05-10 ⋅ 阅读:(19) ⋅ 点赞:(0)

漏洞概述

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

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

当数据从源流向接收端时,如果没有适当的验证或清理,就会产生风险,从而可能导致XSS等攻击。

常见源

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

这种类型的XSS可能是最难发现的,因为您需要查看JS代码内部,查看是否使用了您可以控制的任何对象的值


DOM XSS可以导致的漏洞

开放重定向

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

JavaScript注入

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

漏洞点:

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

文档域操纵

文档域操纵漏洞发生在脚本使用攻击者可控制的数据设置document.domain属性时。
document.domain属性在浏览器中对同源策略的执行起着关键作用。当来自不同源的两个页面将它们的document.domain设置为相同值时,它们可以无限制地进行交互。尽管浏览器对可分配给document.domain的值施加一定的限制,防止将完全不相关的值分配给实际页面源,但也存在例外情况。通常,浏览器允许使用子域或父域。

漏洞点:

document.domain

链接操纵

基于DOM的链接操纵漏洞发生在脚本将攻击者可控数据写入当前页面内的导航目标,如可点击链接或表单的提交URL时。这样可能会导致恶意的钓鱼攻击行为

漏洞点:

someDOMElement.href
someDOMElement.src
someDOMElement.action

Ajax请求操纵

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

漏洞点:

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

客户端SQL注入

客户端SQL注入漏洞发生在脚本以不安全的方式将可由攻击者控制的数据合并到客户端SQL查询中时。

漏洞点:

executeSql()

本地文件路径操纵

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

漏洞点:

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

客户端JSON注入

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

漏洞点:

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

Web消息操纵

Web消息漏洞会在脚本将可由攻击者控制的数据作为Web消息发送到浏览器中的另一个文档时出现

漏洞点:

postMessage()

DOM数据操纵

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

拒绝服务

基于DOM的拒绝服务漏洞发生在脚本将可由攻击者控制的数据不安全地传递给有问题的平台API时。这包括当调用时可能导致用户计算机消耗过多的CPU或磁盘空间的API

漏洞点:

requestFileSystem()
RegExp()

网站公告

今日签到

点亮在社区的每一天
去签到