1.基于DOM的漏洞
在本文中,将描述DOM是什么,解释DOM数据的不安全处理如何引入漏洞,并建议如何防止网站上基于DOM的漏洞。
2.什么是DOM?
文档对象模型(DOM)是网页上元素的Web浏览器分层表示。网站可以使用JavaScript来操作DOM的节点和对象,以及它们的属性。DOM操作本身不是问题。事实上,它是现代网站工作方式的一个组成部分。但是,不安全地处理数据的JavaScript可能会导致各种攻击。当网站包含JavaScript时,就会出现基于DOM的漏洞,该JavaScript接受攻击者可控制的值(称为源source
),并将其传递到危险的函数(称为接收器sink
)。
3.污染流漏洞
许多基于DOM的漏洞可以追溯到客户端代码操纵攻击者可控数据的方式。
3.1什么是污染流?
要利用或缓解这些漏洞,首先熟悉源和汇之间的污染流的基础知识是很重要的。
源
源是一个JavaScript属性,它接受可能受攻击者控制的数据。源的一个例子是location.search属性,因为它从查询字符串中读取输入,这对于攻击者来说相对容易控制。最终,任何可以被攻击者控制的属性都是潜在的源。这包括引用URL(由document.referrer字符串公开)、用户的cookie(由document.cookie字符串公开)和Web消息。
接收器
接收器是一种潜在危险的JavaScript函数或DOM对象,如果向其传递攻击者控制的数据,则可能导致不良影响。例如,eval()
函数是接收器,因为它将传递给它的参数作为JavaScript处理。HTML接收器的一个示例是document.body.innerHTML
,因为它可能允许攻击者注入恶意HTML并执行任意JavaScript。
从根本上说,当网站将数据从源传递到接收器时,就会出现基于DOM的漏洞,然后在客户端会话的上下文中以不安全的方式处理数据。
最常见的源是URL,通常使用location
对象访问。攻击者可以构造一个链接,将受害者发送到一个易受攻击的页面,该页面在URL的查询字符串和片段部分中具有有效负载。下面是一个例子:
goto = location.hash.slice(1)
if (goto.startsWith('https:')) {
location = goto;
}
这很容易受到基于DOM的开放重定向的攻击,因为location.hash
源代码是以不安全的方式处理的。如果URL包含以https:
开头的哈希片段,则此代码提取location.hash
属性的值并将其设置为window
的location
属性。攻击者可以通过构造以下URL来攻击此漏洞:
https://www.innocent-website.com/example#https://www.evil-user.net
当受害者访问此URL时,JavaScript将location
属性的值设置为https://www.evil-user.net
,这会自动将受害者重定向到恶意站点。例如,这种行为很容易被利用来构建网络钓鱼攻击。
3.2常见源
以下是可用于利用各种污染流漏洞的典型源:
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
以下类型的数据也可以用作利用污染流漏洞的来源:
Reflected data反射数据
Stored data存储的数据
Web messages的Web消息
4.哪些接收器会导致基于DOM的漏洞?
以下列表提供了常见的基于DOM的漏洞的概述,以及可能导致每个漏洞的接收器的示例。
基于DOM的开放重定向
什么是基于DOM的开放重定向?
当脚本将攻击者可控制的数据写入可以触发跨域导航的接收器时,就会出现基于DOM的开放重定向漏洞。例如,以下代码由于处理location.hash
属性的不安全方式而容易受到攻击:
let url = /https?:\/\/.+/.exec(location.hash);
if (url) {
location = url[0];
}
攻击者可以利用此漏洞构造一个URL,如果该URL被其他用户访问,将导致重定向到任意外部域。
基于DOM的开放重定向有什么影响?
例如,可以利用这种行为来促进针对网站用户的网络钓鱼攻击。使用针对正确域的真实应用程序URL并使用有效的TLS证书(如果使用TLS)的能力为钓鱼攻击提供了可信度,因为许多用户即使验证了这些功能,也不会注意到随后重定向到不同的域。
如果攻击者能够控制传递到重定向API的字符串的开头,则可能将此漏洞升级为JavaScript注入攻击。攻击者可以使用javascript:
伪协议构造URL,以便在浏览器处理URL时执行任意代码。
哪些接收器会导致基于DOM的开放重定向漏洞?
以下是一些可能导致基于DOM的开放重定向漏洞的主要汇点:
location
location.host
location.hostname
location.href
location.pathname
location.search
location.protocol
location.assign()
location.replace()
open()
element.srcdoc
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.ajax()
$.ajax()
如何防止基于DOM的开放重定向漏洞
除了DOM漏洞主题中描述的一般措施外,还应避免使用源自任何不受信任来源的数据动态设置重定向目标。
基于DOM的cookie操作
什么是基于DOM的cookie操作?
一些基于DOM的漏洞允许攻击者操纵他们通常无法控制的数据。这将通常安全的数据类型(如Cookie)转换为潜在的源。当脚本将攻击者可控制的数据写入cookie值时,就会出现基于DOM的cookie操作漏洞。
攻击者可以利用此漏洞构造一个URL,如果其他用户访问该URL,则会在用户的Cookie中设置任意值。许多接收器本身基本上是无害的,但基于DOM的cookie操纵攻击表明,低严重性漏洞有时可以用作高严重性攻击的利用链的一部分。例如,如果JavaScript将数据从源写入document.cookie
,而不首先对其进行清理,则攻击者可以操纵单个cookie的值以注入任意值:
document.cookie = 'cookieName='+location.hash.slice(1);
如果网站不安全地反映未经HTML编码的cookie中的值,攻击者可以使用cookie操作技术来利用此行为。
基于DOM的Cookie操纵攻击的影响是什么?
此漏洞的潜在影响取决于Cookie在网站中所扮演的角色。如果cookie用于控制某些用户操作(例如,生产模式与演示模式设置)导致的行为,则攻击者可能能够通过操纵cookie的值使用户执行非预期的操作。
如果cookie用于跟踪用户的会话,则攻击者可能能够执行会话固定攻击,其中他们将cookie的值设置为他们从网站获得的有效令牌,然后在受害者随后与网站交互期间劫持会话。像这样的cookie操作漏洞不仅可以用于攻击易受攻击的网站,还可以用于攻击同一父域下的任何其他网站。
哪些接收器会导致基于DOM的cookie操作漏洞?
document.cookie
接收器可能导致基于DOM的cookie操作漏洞。
如何防止基于DOM的Cookie操作漏洞
除了基于DOM的漏洞页面上描述的一般措施外,您还应避免使用源自任何不受信任来源的数据动态写入Cookie。
基于DOM的JavaScript注入
什么是基于DOM的JavaScript注入?
当脚本将攻击者可控制的数据作为JavaScript执行时,就会出现基于DOM的JavaScript注入漏洞。攻击者可以利用此漏洞构造URL,如果其他用户访问该URL,将导致攻击者提供的任意JavaScript在用户的浏览器会话上下文中执行。
可以通过各种方式诱导用户访问攻击者的恶意URL,类似于反射跨站点脚本漏洞的常见攻击交付向量。有关更多信息,请参阅相关DOM XSS
.
基于DOM的JavaScript注入攻击有什么影响?
攻击者提供的代码可以执行各种各样的操作,例如窃取受害者的会话令牌或登录凭据,代表受害者执行任意操作,甚至记录他们的键盘输入。
哪些接收器会导致基于DOM的JavaScript注入漏洞?
以下是可能导致基于DOM的JavaScript注入漏洞的一些主要接收器:
eval()
Function()
setTimeout()
setInterval()
setImmediate()
execCommand()
execScript()
msSetImmediate()
range.createContextualFragment()
crypto.generateCRMFRequest()
基于DOM的文档域操作
什么是基于DOM的文档域操作?
当脚本使用攻击者可控制的数据来设置document.domain
属性时,就会出现文档域操纵漏洞。攻击者可以利用此漏洞构造一个URL,如果其他用户访问该URL,将导致响应页面设置任意的document.domain
值。
document.domain
属性被浏览器用于执行同源策略。如果来自不同来源的两个页面显式地设置了相同的document.domain
值,那么这两个页面可以以不受限制的方式进行交互。如果攻击者可以使目标网站的一个页面和他们控制的另一个页面(直接或通过类似XSS的漏洞)设置相同的document.domain
值,那么攻击者就可以通过他们已经控制的页面完全破坏目标页面。这与常规的跨站点脚本(XSS)漏洞一样,也有可能被利用。
浏览器通常会对可以分配给document.domain
的值进行一些限制,并可能会阻止使用与页面实际来源完全不同的值。然而,有两个重要的警告。首先,浏览器允许使用子域或父域,因此攻击者可能能够将目标页面的域切换到安全性较弱的相关网站的域。其次,一些浏览器的怪癖可以切换到完全无关的域。这些警告意味着,操纵页面的document.domain
属性的能力通常代表着一个安全漏洞,其严重性与常规XSS相差不远。
哪些接收器会导致基于DOM的文档域操作漏洞?
document.domain
接收器可能导致基于DOM的文档域操作漏洞。
基于DOM的WebSocket-URL中毒
什么是基于DOM的WebSocket-URL中毒?
当脚本使用可控数据作为WebSocket连接的目标URL时,会发生WebSocket-URL中毒。攻击者可以利用此漏洞构造一个URL,如果另一用户访问该URL,将导致用户的浏览器打开一个与攻击者控制的URL的WebSocket连接。
WebSocket-URL中毒有什么影响?
WebSocket-URL中毒的潜在影响取决于网站如何使用WebSocket。如果网站将敏感数据从用户的浏览器传输到WebSocket服务器,则攻击者可能能够捕获此数据。
如果应用程序从WebSocket服务器读取数据并以某种方式对其进行处理,攻击者可能能够破坏网站的逻辑或对用户进行客户端攻击。
哪些接收器会导致WebSocket-URL中毒漏洞?
WebSocket
构造函数可能导致WebSocket-URL中毒漏洞。
基于DOM的链接操作
什么是基于DOM的链接操作?
当脚本将攻击者可控制的数据写入当前页面内的导航目标(如可单击的链接或表单的提交URL)时,就会出现基于DOM的链接操纵漏洞。攻击者可能能够利用此漏洞构造一个URL,如果其他应用程序用户访问该URL,则会修改响应中链接的目标。
基于DOM的链接操纵攻击的影响是什么?
攻击者可以利用此漏洞执行各种攻击,包括:
- 导致用户被重定向到任意外部URL,这可能有助于网络钓鱼攻击。
- 导致用户将敏感的表单数据提交到攻击者控制的服务器。
- 更改与链接关联的文件或查询字符串,导致用户在应用程序中执行意外操作。
- 通过注入包含XSS漏洞的网站链接来破坏浏览器反XSS防御。这是因为反XSS防御通常不考虑网站上的链接。
哪些接收器会导致基于DOM的链接操纵漏洞?
以下是一些可能导致基于DOM的链接操作漏洞的主要汇点:
element.href
element.src
element.action
基于DOM的Web消息处理
什么是基于DOM的Web消息处理?
当脚本将攻击者可控制的数据作为Web消息发送到浏览器中的另一个文档时,就会出现Web消息处理漏洞。攻击者可以通过构建网页来使用Web消息数据作为源,如果用户访问该网页,则该网页将导致用户的浏览器发送包含受攻击者控制的数据的Web消息。
哪些接收器会导致基于DOM的Web消息操作漏洞?
如果用于接收消息的事件侦听器以不安全的方式处理传入数据,则用于发送Web消息的postMessage()
方法可能导致漏洞。
基于DOM的Ajax请求头操作
什么是基于DOM的Ajax请求头操作?
使用Ajax使网站能够向服务器发出异步请求,以便Web应用程序可以动态更改页面上的内容,而无需重新加载整个页面。但是,当脚本将攻击者可控制的数据写入使用XmlHttpRequest
对象发出的Ajax请求的请求头时,就会出现Ajax请求头操作漏洞。攻击者可以利用此漏洞构造一个URL,如果其他用户访问该URL,则会在随后的Ajax请求中设置任意标头。然后,这可以用作将其他类型的攻击链接在一起的起点,从而增加此漏洞的潜在严重性。
基于DOM的Ajax请求头操作的影响是什么?
此漏洞的潜在影响取决于特定HTTP标头在服务器端处理Ajax请求中的作用。如果头用于控制Ajax请求产生的行为,则攻击者可能能够通过操纵头使用户执行非预期的操作。影响还取决于攻击者能够注入到头中的确切内容。
哪些接收器会导致基于DOM的Ajax请求头操作漏洞?
以下是一些可能导致基于DOM的Ajax请求头漏洞的主要接收器:
XMLHttpRequest.setRequestHeader()
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.globalEval()
$.globalEval()
基于DOM的本地文件路径操作
什么是基于DOM的本地文件路径操作?
当脚本将攻击者可控制的数据作为filename
参数传递给文件处理API时,就会出现本地文件路径操作漏洞。攻击者可以利用此漏洞构造一个URL,如果其他用户访问该URL,将导致用户的浏览器打开任意本地文件。
基于DOM的本地文件路径操作有什么影响?
此漏洞的潜在影响取决于网站如何使用打开的文件:
- 如果网站从文件中读取数据,攻击者可能能够检索此数据。
- 如果网站将特定数据写入敏感文件,攻击者也可以将自己的数据写入文件,例如操作系统的配置文件。
在这两种情况下,潜在漏洞的实际利用可能取决于网站上提供的其他适当功能。
哪些接收器会导致基于DOM的本地文件路径操作漏洞?
以下是一些可能导致基于DOM的本地文件路径操纵漏洞的主要接收器:
FileReader.readAsArrayBuffer()
FileReader.readAsBinaryString()
FileReader.readAsDataURL()
FileReader.readAsText()
FileReader.readAsFile()
FileReader.root.getFile()
基于DOM的客户端SQL注入
什么是基于DOM的客户端SQL注入?
当脚本以不安全的方式将攻击者可控制的数据合并到客户端SQL查询中时,就会出现客户端SQL注入漏洞。攻击者可以利用此漏洞构造一个URL,如果其他用户访问该URL,则会在用户浏览器的本地SQL数据库中执行任意SQL查询。
基于DOM的客户端SQL注入有什么影响?
该漏洞的潜在影响取决于网站对SQL数据库的使用情况。如果数据库用于存储敏感数据,例如社交网络上的消息,则攻击者可能能够检索此数据。
如果数据库用于存储挂起的用户操作(例如电子邮件应用程序中的传出消息),则攻击者可能能够修改此数据并代表用户执行任意操作。
哪些接收器会导致基于DOM的客户端SQL注入漏洞?
JavaScript数据库函数executeSql()
可导致客户端SQL注入漏洞。
如何防止基于DOM的客户端SQL注入漏洞
除了基于DOM的漏洞页面上描述的一般措施外,您还应该确保对所有数据库访问使用参数化查询(也称为预处理语句)。此方法使用两个步骤来安全地将可能受污染的数据合并到SQL查询中:
- 应用程序指定查询的结构,为每个用户输入项保留占位符。
- 应用程序指定每个占位符的内容。由于在第一步中已经定义了查询的结构,因此第二步中的格式错误的数据不可能干扰查询结构。
在JavaScript executeSql()
API中,可以使用查询字符?
在查询字符串内指定参数化项。对于每个参数化项,将向包含该项值的API传递一个附加参数。为了防止疏忽发生,并避免应用程序代码库中其他地方的更改引入漏洞,强烈建议您对合并到数据库查询中的每个变量数据项进行参数化,即使它没有明显的污染。
基于DOM的HTML5存储操作
什么是基于DOM的HTML5存储操作?
当脚本在Web浏览器的HTML5存储中存储攻击者可控制的数据时,就会出现HTML5存储操作漏洞(localStorage
或sessionStorage
)。攻击者可以使用此行为构造一个URL,如果另一个用户访问该URL,将导致用户的浏览器存储攻击者可控制的数据。
这种行为本身并不构成安全漏洞。但是,如果应用程序稍后从存储中读回数据并以不安全的方式处理数据,则攻击者可能能够利用存储机制来提供其他基于DOM的攻击,例如跨站点脚本和JavaScript注入。
哪些接收器会导致基于DOM的HTML5存储操作漏洞?
以下是可能导致基于DOM的HTML5存储操作漏洞的一些主要接收器:
sessionStorage.setItem()
localStorage.setItem()
基于DOM的客户端XPath注入
什么是基于DOM的XPath注入?
当脚本将攻击者可控制的数据合并到XPath查询中时,就会出现基于DOM的XPath注入漏洞。攻击者可以利用此行为构造一个URL,如果其他应用程序用户访问该URL,则会触发执行任意恶意代码查询,从而导致网站检索和处理不同的数据。
基于DOM的XPath注入有什么影响?
根据使用查询结果的目的,攻击者可能会破坏网站的逻辑或代表用户引起意外的操作。
哪些接收器会导致XPath注入漏洞?
以下是可能导致基于DOM的XPath注入漏洞的一些主要接收器:
document.evaluate()
element.evaluate()
基于DOM的客户端JSON注入
什么是基于DOM的JSON注入?
当脚本将攻击者可控制的数据合并到字符串中时,就会出现基于DOM的JSON注入漏洞,该字符串被解析为JSON数据结构,然后由应用程序处理。攻击者可以使用此行为构造一个URL,如果其他用户访问该URL,将导致处理任意JSON数据。
基于DOM的JSON注入攻击有什么影响?
根据使用这些数据的目的,攻击者可能会破坏网站的逻辑,或代表另一个用户导致意外的操作。
哪些汇点会导致基于DOM的JSON注入漏洞?
JSON.parse()
jQuery.parseJSON()
$.parseJSON()
基于DOM的数据操作
什么是DOM数据操作?
当脚本将攻击者可控制的数据写入DOM中的字段(用于可见UI或客户端逻辑)时,就会出现DOM数据操作漏洞。攻击者可以利用此漏洞构造URL,如果其他用户访问该URL,则会修改客户端UI的外观或行为。DOM数据操纵漏洞可以被反射和存储的基于DOM的攻击利用。
DOM数据操作的影响是什么?
在规模较小的一端,攻击者可能能够利用此漏洞对网站执行虚拟污损,例如更改特定页面上显示的文本或图像。然而,攻击可能更严重。例如,如果攻击者能够更改元素的src
属性,则可能会通过导入恶意JavaScript文件来诱使用户执行非预期操作。
哪些接收器会导致DOM数据操作漏洞?
以下是可能导致DOM数据操纵漏洞的一些主要汇:
script.src
script.text
script.textContent
script.innerText
element.setAttribute()
element.search
element.text
element.textContent
element.innerText
element.outerText
element.value
element.name
element.target
element.method
element.type
element.backgroundImage
element.cssText
element.codebase
document.title
document.implementation.createHTMLDocument()
history.pushState()
history.replaceState()
如何防止DOM数据操作漏洞
除了基于DOM的漏洞页面上描述的一般措施外,还应避免将来自任何不受信任的源的数据动态写入DOM数据字段。应检查相关代码和执行路径,以确定此漏洞是否确实存在,或者是否已采取缓解措施来防止攻击。
基于DOM的拒绝服务
什么是基于DOM的拒绝服务?
当脚本以不安全的方式将攻击者可控制的数据传递到有问题的平台API(例如,调用可导致用户计算机占用过多CPU或磁盘空间的API)时,就会出现基于DOM的拒绝服务漏洞。如果浏览器限制了网站的功能,例如,通过拒绝在localStorage
中存储数据或杀死忙碌脚本的尝试,这可能会导致副作用。
哪些接收器会导致基于DOM的拒绝服务漏洞?
以下是可能导致基于DOM的拒绝服务漏洞的一些主要汇点:
requestFileSystem()
RegExp()
基于DOM的控制Web消息源
如果页面以不安全的方式处理传入的Web消息(例如,未在事件侦听器中正确验证传入消息的来源),则事件侦听器调用的属性和函数可能会成为接收器。例如,攻击者可以托管恶意的iframe
并使用postMessage()
方法将Web消息数据传递给易受攻击的事件侦听器,然后将有效负载发送到父页面上的接收器。此行为意味着您可以使用Web消息作为将恶意数据传播到任何这些接收器的源。
基于DOM的Web消息漏洞有什么影响?
该漏洞的潜在影响取决于目标文档对传入消息的处理。例如,如果目标文档信任发送方不会在消息中传输恶意数据,并且通过将数据传递到接收器中以不安全的方式处理数据,则两个文档的联合行为可能允许攻击者危害用户。
如何使用Web消息作为攻击源
下面是一个例子:
<script>
window.addEventListener('message', function(e) {
eval(e.data);
});
</script>
这是脆弱的,因为攻击者可以通过构造以下iframe
注入JavaScript有效负载:
<iframe src="//vulnerable-website" onload="this.contentWindow.postMessage('print()','*')">
由于事件侦听器不验证消息的来源,并且postMessage()
方法指定了targetOrigin "*"
,因此事件侦听器接受有效负载并将其传递到接收器,在本例中为eval()
函数。
源验证
即使事件侦听器确实包含某种形式的来源验证,这个验证步骤有时也可能存在根本性的缺陷。例如,考虑以下代码:
window.addEventListener('message', function(e) {
if (e.origin.indexOf('normal-website.com') > -1) {
eval(e.data);
}
});
indexOf
方法用于尝试和验证传入消息的来源是normal-website.com
域。然而,实际上,它只检查字符串"normal-website.com"
是否包含在源URL中的任何位置。因此,如果恶意消息的来源是http://www.normal-website.com.evil.net
,则攻击者可以轻松绕过此验证步骤。
同样的缺陷也适用于依赖于startsWith()
或endsWith()
方法的验证检查。例如,下面的事件侦听器会将源http://www.malicious-websitenormal-website.com
视为安全:
window.addEventListener('message', function(e) {
if (e.origin.endsWith('normal-website.com')) {
eval(e.data);
}
});
哪些接收器会导致基于DOM的Web消息漏洞?
只要网站由于缺乏足够的来源验证而接受来自不受信任来源的Web消息数据,传入消息事件侦听器使用的任何接收器都可能导致漏洞。
基于DOM的DOM-clobbering
什么是DOM Clobbering?
DOM clobbering是一种将HTML注入页面以操纵DOM并最终改变页面上JavaScript的行为的技术。DOM clobbering在不可能使用XSS,但是您可以在属性id
或name
被HTML过滤器列入白名单的页面上控制一些HTML的情况下特别有用。最常见的DOM clobbering形式使用锚元素覆盖全局变量,然后应用程序以不安全的方式使用该变量,例如生成动态脚本URL。
术语clobbering来自这样一个事实,即你正在“clobbering”一个对象的全局变量或属性,并将其替换为DOM节点或HTML集合。例如,您可以使用DOM对象覆盖其他JavaScript对象,并利用不安全的名称(如submit
)来干扰表单的实际submit()
功能。
如何利用DOM-clobbering漏洞
JavaScript开发人员使用的一个常见模式是:
var someObject = window.someObject || {};
如果您可以控制页面上的某些HTML,那么可以使用DOM节点(例如锚)来清除someObject
引用。下面是一个例子:
<script>
window.onload = function(){
let someObject = window.someObject || {};
let script = document.createElement('script');
script.src = someObject.url;
document.body.appendChild(script);
};
</script>
要利用此易受攻击的代码,您可以注入以下HTML,以使用锚元素破坏someObject
引用:
<a id=someObject><a id=someObject name=url href=//malicious-website.com/evil.js>
由于这两个锚点使用相同的ID,因此DOM将它们分组在一个DOM集合中。然后,DOM clobbering向量用这个DOM集合覆盖someObject
引用。在最后一个锚元素上使用了name属性,以消除指向外部脚本的someObject对象的url属性。
另一种常见的技术是将form
元素沿着与input
元素一起使用,以破坏DOM属性。例如,删除attributes
属性使您能够绕过在其逻辑中使用该属性的客户端筛选器。虽然过滤器将枚举attributes
属性,但它实际上不会删除任何属性,因为该属性已被DOM节点破坏。因此,您将能够注入通常会被过滤掉的恶意属性。例如,考虑以下注入:
<form onclick=alert(1)><input id=attributes>Click me
在这种情况下,客户端过滤器将遍历DOM并遇到白名单中的form
元素。通常,过滤器将循环遍历表单元素的属性,并删除任何列入黑名单的属性。但是,由于属性已经被input
元素破坏,因此过滤器将循环遍历input
元素。由于input
元素具有未定义的长度,因此不满足过滤器的for
循环(例如i<element.attributes.length
)的条件,并且过滤器简单地移动到下一个元素。这导致过滤器完全忽略onclick
事件,从而允许在浏览器中调用alert()
函数。
如何防止DOM clobbering攻击
用最简单的话来说,您可以通过实现检查来防止DOM破坏攻击,以确保对象或函数符合您的预期。例如,您可以检查DOM节点的attributes属性是否实际上是NamedNodeMap
的实例。这确保了属性是一个attributes属性,而不是一个被破坏的HTML元素。
您还应该避免编写引用全局变量和逻辑OR运算符||
的代码,因为这可能导致DOM漏洞。
总结如下:
- 检查对象和函数是否合法。如果您正在过滤DOM,请确保检查对象或函数不是DOM节点。
- 避免坏的代码模式。应避免将全局变量与逻辑OR运算符结合使用。
- 使用经过良好测试的库,如DOMPurify,它可以解决DOM-clobbering 漏洞。
5.如何防止基于DOM的污染流漏洞
没有任何单一的措施可以完全消除基于DOM的攻击的威胁。然而,一般来说,避免基于DOM的漏洞的最有效方法是避免允许来自任何不受信任的源的数据动态地更改传输到任何接收器的值。
如果应用程序所需的功能意味着这种行为是不可避免的,那么必须在客户端代码中实现防御。在许多情况下,相关数据可以在白名单的基础上进行验证,只允许已知安全的内容。在其他情况下,有必要对数据进行清理或编码。这可能是一项复杂的任务,并且根据要插入数据的上下文,可能涉及按适当顺序组合的JavaScript转义、HTML编码和URL编码。