JSONP跨域攻击

发布时间 2023-12-12 10:22:41作者: 少年阿丁

JSONP

原理

JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。
下面通过网站A和子站B说明:

网站A:www.example.com提供比赛信息其接口example.com/data.json以json格式返回了比赛数据,其分析子站B: analysis.example.com 根据赛事信息进行分析,并展示给用户。

B站的AJAX想要获取data怎么做?答案是很困难的,普通的AJAX是无法完成的,因为AJAX遵守同源策略,无法读取到响应中的数据。A、B是异源,异源资源共享通常是不允许的(除了脚本、链接等详情可查阅同源策略相关知识)。

由于同源策略是允许跨域加载脚本的,script标签不受同源安全策略限制,它可以向别的域发送get请求,因此可以把数据放进js文件中,由于跨域脚本嵌入是可行的,从而跨域加载数据,但直接把json数据格式作为js文件格式返回浏览器是不正确的。
因此我们的思路是设置一个函数调用,把json数据作为实参传递进来,然后在B中对形参进行处理,这样就跨域获取到了json数据。

举个例子:

我们要在B站请求A站这个json数据:

{"id" : "1","name" : "隔壁老王"}

那么我们在A站www. example.com/data.js内容如下:

callback({"id" : "1","name" : "隔壁老王"});

由此,只需要在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://example.com/userinfo?callback=myData"></script>

当获取完如上url的内容后,会自动解释成js代码执行。由此来看,以上url访问输出的结果
类似如下:

myData([{nickname:'empty_xl', birthday:'1993-04-05'}])

3、一般后台会根据callback参数返回相应名称的函数,类似下面的方式:

<?php
//getUsers.php
$callback = $_GET['callback'];
print $callback.'({"nickname": "1",birthday: '1993-04-05'});';
?>

攻击场景

通过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.example.com/xxx?callback=test">
</script>