JSONP跨域攻击
JSONP
原理
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。
下面通过网站A和子站B说明:
网站A:www.AAA.com提供天气信息其接口AAA.com/data.json以json格式返回了天气数据,其分析子站B: analysis.BBB.com 根据天气信息进行分析,并展示给用户。
B站的AJAX想要获取data怎么做?答案是很困难的,普通的AJAX是无法完成的,因为AJAX遵守同源策略,无法读取到响应中的数据。A、B是异源,异源资源共享通常是不允许的(除了脚本、链接等详情可查阅同源策略相关知识)。
由于同源策略是允许跨域加载脚本的,script标签不受同源安全策略限制,它可以向别的域发送get请求,因此可以把数据放进js文件中,由于跨域脚本嵌入是可行的,从而跨域加载数据,但直接把json数据格式作为js文件格式返回浏览器是不正确的。
因此我们的思路是设置一个函数调用,把json数据作为实参传递进来,然后在B中对形参进行处理,这样就跨域获取到了json数据。
举个例子:
我们要在B站请求A站这个json数据:
{"id" : "1","name" : "lisi"}
那么我们在A站www. example.com/data.js内容如下:
callback({"id" : "1","name" : "lisi"});
由此,只需要在B站加载此js,然后构造此函数的处理即可:
function callback(data){
alert(data.name);
}
如果A站要根据需要同时提供不同的json数据,硬编码或每一个都写成一个js是肯定不行的,
这时候可以将需求作为参数传递过去。
数据交换流程:
1、定义一个B站用于接收数据的回调函数:
function myData(data) {
console.log('DATA:',data);
}
2、用<script>标签去A站跨域请求数据:
<script src="http://AAA.com/userinfo?callback=myData"></script>
当获取完如上url的内容后,会自动解释成js代码执行。由此来看,以上url访问输出的结果
类似如下:
myData([{"id" : "1","name" : "lisi"}])
3、一般后台会根据callback参数返回相应名称的函数,类似下面的方式:
<?php
//getUsers.php
$callback = $_GET['callback'];
print $callback.'({"id" : "1","name" : "lisi"});';
?>
攻击场景
通过Jsonp跨域窃取数据,特别是一些最终用户的个人数据、甚至敏感数据的攻击方式与CSRF的攻击方式相似(Jsonp主要区别是用于跨站获取数据)。
1.目标站点没有校验发起xx.json跨站请求来源的站点即未校验Referer,或者校验可被绕过的场景下,可以从其他恶意站点发起跨站请求该xx.json,在用户登录目标网站的情况下,进而窃取该接口响应中的JSON数据。
2.如果xx.json中包含了与用户个人相关的个人数据、订单、身份信息等数据将被窃取。
3.响应中消息头的Content-type为text/html,可进行XSS攻击。
说明:
1.受害者已经登录过target.example.com。这个条件保证了浏览器上缓存的cookie中的sessionID是有效的;
2.受害者用同一个浏览器同时打开了target.example.com和 attacker.com两个网站的页面。
这个条件保证了从attacker.com上发向target.example.com的请求会带上浏览器缓存的target.example.com的cookie,这样才能通过target.example.com后台的校验。
attacker.com页面上的代码:
<script type="text/javascript">
function test(data) {
alert(JSON.stringify(data));
}
</script>
<script type="text/javascript" src="https://target.AAA.com/xxx?callback=test">
</script>