暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DOM型XSS

WEB漏洞挖掘 2021-07-22
4844

在本节中,我们将描述DOM型XSS概念,解释如何找到DOM型XSS漏洞,并讨论如何利用不同的输入源和接收器来利用DOM XSS漏洞。

1. 什么是DOM型XSS

DOM型XSS漏洞通常出现在以下情况: JavaScript从攻击者可控的源(如URL)获取数据,并将其传递给支持动态代码执行的接收器(如eval()或innerHTML)。这使得攻击者能够执行恶意的JavaScript,这通常允许他们劫持其他用户的帐户。

要实现基于dom的XSS攻击,需要将数据放置到源中,以便将其传播到接收器并导致执行任意JavaScript。

DOM XSS最常见的源是URL,它通常通过window.location对象访问。攻击者可以构造一个链接发给受害者使访问漏洞页面,URL查询字符串或者部分片段中含有payload。在某些情况下,例如当针对404页面或运行PHP的网站时,payload也可以放在路径中。

2. 如何测试DOM型XSS

要手动测试DOM型XSS,通常需要使用带有开发者工具的浏览器,如Chrome。您需要依次处理每个可用的输入源,并分别测试每个接收器。

2.1 测试HTML接收器

在HTML接收器中测试DOM XSS,将一个随机的字母数字字符串放入源(例如location.search),然后使用开发者工具检查HTML并找到字符串出现的位置。请注意,浏览器的“查看源代码”选项不适用于DOM XSS测试,因为它没有考虑到JavaScript在HTML中执行的更改。在Chrome的开发工具中,你可以使用Control+F(或者MacOS上的Command+F)在DOM中搜索你的字符串。

对于字符串在DOM中出现的每个位置,需要明确上下文。基于此上下文,您需要推敲你的输入,观察应用如何处理它。例如,如果字符串出现在双引号属性中,则尝试在字符串中注入双引号,以查看是否可以中断该属性。

注意,浏览器对url编码的行为是不同的,Chrome、Firefox和Safari会对location.search和location.hash进行url编码。而IE11和Microsoft Edge (pre-Chromium)不会对这些源进行url编码。如果数据在处理之前进行了url编码,那么XSS攻击就不太可能起作用。

2.2 测试JavaScript执行接收器

测试DOM型XSS的JavaScript执行接收器有点困难。对于这些接收器,您的输入不一定出现在DOM中的任何地方,因此您不能搜索它。相反,您需要使用JavaScript调试器来确定您的输入是否以及如何被发送到接收器。

对于每个潜在的源,比如location,首先需要在页面的JavaScript代码中找到源在哪被引用。在Chrome的开发工具中,您可以使用Control+Shift+F(或MacOS上的Command+Alt+F)来搜索所有页面的JavaScript代码的源代码。

一旦找到源在哪被读取,可以使用JavaScript调试器添加断点,并跟踪源的使用情况。您可能会发现源被赋值给其他变量。如果是这种情况,您将需要再次使用search函数来跟踪这些变量,并查看它们是否被传递给接收器。当您发现一个接收器正在被分配来自源的数据时,您可以使用调试器检查该值,方法是将鼠标悬停在该变量上,在将其发送到接收器之前显示其值。然后,与HTML接收器一样,您需要推敲您的输入,看看是否能够成功地提供XSS攻击。

3. 用不同的源和接收器来利用DOM型XSS

原则上,如果存在一个数据可以从源端传播到接收端的可实现路径,那么网站就容易受到DOM型XSS攻击。在实践中,不同的源和接收器具有不同的属性和行为,这些属性和行为会影响可利用性,并决定需要哪些技术。此外,当试图利用漏洞时,网站的脚本可能会对数据进行校验或其他处理。有许多基于dom漏洞相关的接收器。详情请参阅以下名单。

document.write接收器对script元素有效,所以你可以使用一个简单的payload,例如下面的:

 document.write('... <script>alert(document.domain)</script> ...');

然而要注意,有一些将内容写入document.write的场景,攻击时需要考虑到周围的情形。例如,使用payload前需要先把存在的标签闭合掉。

现代浏览器的innerHTML接收器都不会接受script元素,也不会接受svg onload事件。这意味着您需要使用其他元素,如img或iframe。onload和onerror等事件处理可以与这些元素一起使用。例如:

element.innerHTML='... <img src=1 onerror=alert(document.domain)> ...'

如果使用了像jQuery这样的JavaScript库,注意那些可以改变页面上DOM元素的接收器。例如,jQuery中的attr()函数可以改变DOM元素的属性。如果数据是从用户控制的源(如URL)读取的,然后传递给attr()函数,则可以操作URL值,发送导致XSS。例如,这里我们有一些JavaScript,使用来自URL的数据来改变锚点元素的href属性:

$(function(){
$('#backLink').attr("href",(new URLSearchParams(window.location.search)).get('returnUrl'));
});

您可以通过修改URL来利用这一点,location.search源包含一个恶意的JavaScript URL。当页面的JavaScript将这个恶意URL应用到后退接的href,点击后退链接将执行它:

 ?returnUrl=javascript:alert(document.domain)

如果使用AngularJS这样的框架,执行JavaScript时可以不需要尖括号或事件。当一个站点在HTML元素上使用ng-app属性时,它将被AngularJS处理。在这种情况下,AngularJS会在HTML或属性中的双大括号内执行JavaScript。

4. DOM XSS与反射和存储的数据相结合

一些纯基于dom的漏洞自包含在单个页面中。如果脚本从URL读取一些数据并将其写入一个危险的接收器,那么漏洞完全是客户端。

然而,源并不局限于浏览器直接暴露的数据——它们也可以来源于网站。例如,网站经常在服务器的HTML响应中返回URL参数。这通常与普通XSS相关,但它也可能导致所谓的反射+DOM漏洞。

在反射+DOM漏洞中,服务器处理来自请求的数据,并将数据回显到响应中。所反射的数据可以放在JavaScript字符串中,或者DOM中的数据项中,比如表单字段。页面上的脚本然后以不安全的方式处理反射的数据,最终将其写入一个危险的接收器。

 eval('var data = "reflected string"');

网站也可以将数据存储在服务器上,并在其他地方反射出来。在存储+DOM漏洞中,服务器从一个请求接收数据,存储数据,然后在随后的响应中包含这些数据。之后响应中的脚本包含接收器,然后该接收器以不安全的方式处理数据。

 element.innerHTML = comment.author 

5. 哪些接收器会导致DOM-XSS漏洞?

以下是一些可能导致DOM-XSS漏洞的主要接收器:

document.write()        
document.writeln()
document.domain
element.innerHTML
element.outerHTML
element.insertAdjacentHTML
element.onevent

以下jQuery函数也是可能导致DOM-XSS漏洞的接收器:

add()       
after()
append()
animate()
insertAfter()
insertBefore()
before()
html()
prepend()
replaceAll()
replaceWith()
wrap()
wrapInner()
wrapAll()
has()
constructor()
init()
index()
jQuery.parseHTML()
$.parseHTML()

6. 如何防止DOM-XSS漏洞

您应该避免将数据从任何不受信任的源动态地写入HTML document。


文章转载自WEB漏洞挖掘,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论