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

news2024/10/6 6:37:50

基于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.coloradmin.cn/o/1905102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++ 代码注释规范及 doxygen 工具

参考 谷歌项目风格指南——注释 C doxygen 风格注释示例 ubuntu20 中 doxygen 文档生成 doxygen 官方文档 在 /Doxygen/Special Command/ 章节介绍 doxygen 的关键字 注释说明 注释的目的是提高代码的可读性与可维护性。 C 风格注释 // 单行注释/* 多行注释 */ C 风格注…

ESP32 步进电机精准控制:打造高精度 DIY 写字机器人,实现流畅书写体验

摘要: 想让你的 ESP32 不再仅仅是控制灯光的工具吗&#xff1f; 本文将带你使用 ESP32 开发板、步进电机和简单的机械结构打造一个能够自动写字的机器人。我们将深入浅出地讲解硬件连接、软件代码以及控制逻辑&#xff0c;并提供完整的项目代码和电路图&#xff0c;即使是 Ardu…

AI与编程:一个学生的心路历程与思考

前言 大家好&#xff0c;本人是在一个在校的大学生&#xff0c;方向是前端语言。爱好是码代码和看一点小新闻&#xff0c;游戏也是喜爱的。其实本篇文章的想法是源于网上一些人对AI以及对前端的看法&#xff0c;看完网上的评论后我也是有感而发。本篇文章的讨论中心也是围绕着A…

我国网络安全领域有哪些法律法规?主要内容是什么?

1. 背景介绍 网络信息安全方面的法规在全球范围内都有相应的立法&#xff0c;我们主要的立法有《网络安全法》、《密码法》、《数据安全法》以及《个人信息保护法》。当前也有一些相关的条例和管理办法&#xff0c;接下来就为大家一一介绍。 2. 法规介绍 在中国&#xff0c;…

昇思25天学习打卡营第14天|基于MindNLP的文本解码原理

基于MindNLP的文本解码原理 文本解码 文本解码是自然语言处理中的一个关键步骤,特别是在任务如机器翻译、文本摘要、自动回复生成等领域。解码过程涉及将编码器(如语言模型、翻译模型等)的输出转换为可读的文本序列。以下是一些常见的文本解码方法和原理: 1. 自回归解码:…

2.3.2 主程序和外部IO交互 (文件映射方式)----C#调用范例

2.3.2 主程序和外部IO交互 &#xff08;文件映射方式&#xff09;----C#调用范例 效果显示 1 说明 1 .1 Test_IOServer是64bit 程序&#xff0c; BD_SharedIOServerd.dll 在 /Debug文件夹中 1 .2 Test_IOServer是32bit 程序&#xff0c; BD_SharedIOClientd.dll (32bit&#…

安卓的组件

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

六、数据可视化—flask框架入门(爬虫及数据可视化)

六、数据可视化—flask框架入门&#xff08;爬虫及数据可视化&#xff09; 1&#xff0c;数据可视化简介2&#xff0c;flask&#xff08;1&#xff09;创建flask项目&#xff08;2&#xff09;开启debug模式&#xff08;3&#xff09;通过访问路径传递参数&#xff08;4&#x…

【鸿蒙学习笔记】页面布局

官方文档&#xff1a;布局概述 常见页面结构图 布局元素的组成 线性布局&#xff08;Row、Column&#xff09; 了解思路即可&#xff0c;更多样例去看官方文档 Entry Component struct PracExample {build() {Column() {Column({ space: 20 }) {Text(space: 20).fontSize(15)…

C语言 指针和数组——指针和二维数组之间的关系

目录 换个角度看二维数组 指向二维数组的行指针 按行指针访问二维数组元素 再换一个角度看二维数组 按列指针访问二维数组元素 二维数组作函数参数 指向二维数组的行指针作函数参数 指向二维数组的列指针作函数参数​编辑 用const保护你传给函数的数据 小结 换个角度看…

Mysql explain语句详解与实例展示

首先简单介绍sql&#xff1a; SQL语言共分为四大类&#xff1a;数据查询语言DQL&#xff0c;数据操纵语言DML&#xff0c;数据定义语言DDL&#xff0c;数据控制语言DCL。 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句&#xff0c;FROM子句&#xff0c;WHERE子句…

Kafka(一)基础介绍

一&#xff0c;Kafka集群 一个典型的 Kafka 体系架构包括若Producer、Broker、Consumer&#xff0c;以及一个ZooKeeper集群&#xff0c;如图所示。 ZooKeeper&#xff1a;Kafka负责集群元数据的管理、控制器的选举等操作的&#xff1b; Producer&#xff1a;将消息发送到Broker…

k8s学习之cobra命令库学习

1.前言 打开k8s代码的时候&#xff0c;我发现基本上那几个核心服务都是使用cobra库作为命令行处理的能力。因此&#xff0c;为了对代码之后的代码学习的有比较深入的理解&#xff0c;因此先基于这个库写个demo&#xff0c;加深对这个库的一些理解吧 2.cobra库的基本简介 Git…

《昇思 25 天学习打卡营第 11 天 | ResNet50 图像分类 》

《昇思 25 天学习打卡营第 11 天 | ResNet50 图像分类 》 活动地址&#xff1a;https://xihe.mindspore.cn/events/mindspore-training-camp 签名&#xff1a;Sam9029 计算机视觉-图像分类&#xff0c;很感兴趣 且今日精神颇佳&#xff0c;一个字&#xff0c;学啊 上一节&…

张量分解(1)——初探张量

&#x1f345; 写在前面 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;这里是hyk写算法了吗&#xff0c;一枚致力于学习算法和人工智能领域的小菜鸟。 &#x1f50e;个人主页&#xff1a;主页链接&#xff08;欢迎各位大佬光临指导&#xff09; ⭐️近…

MybatisPlus实现插入/修改数据自动设置时间

引言 插入数据时自动设置当前时间&#xff0c;更新数据时自动修改日期为修改时的日期。 使用MybatisPlus的扩展接口MetaObjectHandler 步骤 实现接口 实体类加注解 实现接口 package com.example.vueelementson.common;import com.baomidou.mybatisplus.core.handlers.M…

GraalVM上的多语言混合开发

上篇文件我们介绍了GraalVM强大的静态编译功能,能够让Java应用程序摆脱虚拟机的束缚,像其它本地编译的应用一样直接运行。那么GraalVM的神奇之处仅限于此吗?今天我们再来看看它的另一个重要特性—多语言混合开发 多语言平台 Java并不是唯一运行在JVM上的语言,这个我们都应…

Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264

一、前言 上一篇文章讲到用ffmpeg命令方式执行打印到日志输出&#xff0c;可以拿到本地摄像头设备信息&#xff0c;顺藤摸瓜&#xff0c;发现可以通过执行 ffmpeg -f dshow -list_options true -i video“Webcam” 命令获取指定摄像头设备的分辨率帧率格式等信息&#xff0c;会…

ts-01.泛型(函数和接口)

泛型 泛的意思是:漂浮, 比如泛舟; 泛型: 类型漂浮未定 > 动态类型. 用于: 函数 接口 类 T extends string | number 泛型约束 function a<T any, K> (: number, value: T) { // 泛型参数设置默认值anyconst arr Array<T>(l).fill(value) // [foo, foo, foo] }…

IntelliJ IDEA菜单不见了设置找回方法

通过CtrAltS键按出设置 找到View,然后自定义一个快捷键,然后保存 使用自定义快捷键弹出改界面,点击Main Menu即可