基于DOM的漏洞-攻击示例(一)

admin 2022年11月3日19:19:45评论40 views字数 3465阅读11分33秒阅读模式

在本节中,将了解如何利用Web消息作为收件人页面上基于DOM的漏洞来源,还将描述这种攻击时如何构建的,包括如何经常绕过常见的来源验证技术。



什么是DOMWeb消息漏洞?

如果页面以不安全的方式处理传入的Web消息,比如,在事件侦听器中未正确验证传入消息的来源,则事件侦听器调用的属性和函数可能会成为接收器

例如,攻击者可以托管恶意iframe并使用psotMessage()方法将Web消息数据传递给易受攻击的事件侦听器,然后将有效负载发送到父页面上的接收器。此行为意味着可以使用Web消息作为恶意数据传播到任何这些接收器的源。



基于DOMWeb消息漏洞有什么影响?

这个漏洞的潜在影响取决于目标文档对传入消息的处理,如果目标文档相信发送者不会在消息中传输恶意数据,并通过将数据传递到接收器以不安全的方式处理数据,那么两个文档的联合行为可能允许攻击者危害用户。



如何以网络消息为源构建攻击?

来看下以下代码:

基于DOM的漏洞-攻击示例(一)

这段代码很容易受到攻击,因为攻击者可以通过构造以下iframe来注入JavaScriptPayload

<iframe src="//vulnerable-website" onload="this.contentWindow.postMessage('print()','*')">

由于事件侦听器不验证消息的来源,并且postMessage()方法指定targetOrigin "*",因此事件侦听器接受Payload并将其传递到接收器,在本例中为eval()函数。


场景试验-使用网络消息的DOMXSS

https://portswigger.net/web-security/dom-based/controlling-the-web-message-source/lab-dom-xss-using-web-messages

场景说明:

这个试验场景包含一个简单的Web消息漏洞。

试验目的:

要完成这个试验,需要使用漏洞利用服务器向目标站点发布消息,从而调用print()函数。

攻击过程:

访问首页后可以注意到包含了一个监听Web消息的addEventListener()

基于DOM的漏洞-攻击示例(一)


打开"exploit server"将下面代码放入Body中,注意替换下试验URL

<iframe src="https://your-lab-id.web-security-academy.net/" onload="this.contentWindow.postMessage('<img src=1 onerror=print()>','*')">

基于DOM的漏洞-攻击示例(一)


保存后发送给受害者,即可完成本试验。


试验小结:

iframe加载时,postMessage()方法会向主页发送一条网络消息,用于提供广告的事件侦听器获取网络消息的内容并将其插入到IDadsdiv中。但是,在有注入的情况下,它会插入我们的img标签,其中包含无效的src属性,从而引发一个错误导致onerror事件处理程序执行打印的payload


场景试验-使用Web消息和JavaScriptURLDOMXSS

https://portswigger.net/web-security/dom-based/controlling-the-web-message-source/lab-dom-xss-using-web-messages-and-a-javascript-url

场景说明:

这个试验场景包含一个由Web消息触发的基于DOM的重定向漏洞。

试验目的:

要完成这个试验,需要使用漏洞利用服务器上构建一个HTML页面来针对这个漏洞调用print()函数。

攻击过程:

根据场景提示,可以注意到在主页包含一个监听Web消息的addEventListener()调用。另外JavaScript还包含有缺陷的indexOf()检查,该检查会在Web消息中的任何位置查找字符串"http:""https:",另外还包含接收器location.href

基于DOM的漏洞-攻击示例(一)

打开"exploit server",在body输入下面的语句,注意替换下试验URL

<iframe src="https://your-lab-id.web-security-academy.net/" onload="this.contentWindow.postMessage('javascript:print()//http:','*')">

基于DOM的漏洞-攻击示例(一)


保存后发送给受害者,完成本试验。


试验小结:

这个脚本会发送Web消息,里面包含了任意PayloadJavaScript以及字符串"http:",第二个参数指定Web消息允许使用任何targetOrigin

iframe加载时,postMessage()方法将JavaScriptPayload发送到主页,事件侦听器发现"http:"字符串并继续将Payload发送到location.href接收器,在那里调用print()函数。



来源验证

即使事件侦听器确实包含某种形式的来源验证,此验证步骤有时也可能存在根本缺陷。

例如,考虑以下代码:

基于DOM的漏洞-攻击示例(一)

indexOf方法用于尝试验证传入消息的来源是normal-website.com,但是在实践中,它只检查字符串"normal-website.com"是否包含在原始URL中的任何位置。因此,如果攻击者的恶意消息来源是

http://www.normal-website.com.evil.net

那么攻击者可以轻松绕过此验证步骤。

同样的缺陷也适用于依赖于startsWith()endsWith()方法的验证检查。

例如,下面的事件侦听器会将来源

http://www.malicious-websitenormal-website.com

视为安全的:

基于DOM的漏洞-攻击示例(一)


场景试验-使用Web消息和JSON.parseDOMXSS

https://portswigger.net/web-security/dom-based/controlling-the-web-message-source/lab-dom-xss-using-web-messages-and-json-parse

场景说明:

这个试验场景使用Web消息传递并将消息解析为JSON

试验目的:

要完成这个试验,需要使用漏洞利用服务器上构建一个HTML页面,利用该漏洞并调用print()函数。

攻击过程:

主页包含一个侦听Web消息的事件侦听器,这个事件侦听器需要一个使用JSON.parse()解析的字符串。在JavaScript中,可以看到事件监听器需要一个type属性,并且switch语句的load-channel分支改变了iframe src属性

基于DOM的漏洞-攻击示例(一)

打开"exploit server",将下面代码放入body中,注意修改下试验场景的URL

<iframe src=https://your-lab-id.web-security-academy.net/ onload='this.contentWindow.postMessage("{"type":"load-channel","url":"javascript:print()"}","*")'>

保存后发送给受害者,即可完成试验。


试验小结:

当构建的iframe加载时,postMessage()方法会向主页发送一条类型为load-channelWeb消息,事件侦听器接收消息并使用JSON.parse()对其进行解析,然后将其发送到switch分支进行处理。

switch会触发load-channel分支,它将消息的url属性分配给ACMEplayer.element iframesrc属性,但是,在这种情况下,消息的url属性实际上包含我们的JavaScriptPayload

由于第二个参数指定Web消息允许使用任何targetOrigin,并且事件处理程序不包含任何形式的来源检查,因此Payload被设置为ACMEplayer.element iframesrc,当受害者在浏览器中加载页面时调用print()函数。



基于DOM的漏洞-攻击示例(一)


服务器端请求伪造(SSRF)-概念梳理

文件上传漏洞-概念梳理

访问控制和权限提升漏洞-概念梳理

信息泄露漏洞-概念梳理

业务逻辑漏洞-概念梳理

命令注入攻击(上)
目录遍历攻击(上)

身份验证漏洞-概念梳理

SQL注入攻击-检索隐藏的数据
HTTP Host头漏洞攻击-概念梳理


原文始发于微信公众号(H君网安白话):基于DOM的漏洞-攻击示例(一)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年11月3日19:19:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   基于DOM的漏洞-攻击示例(一)http://cn-sec.com/archives/1387184.html

发表评论

匿名网友 填写信息