0X00 前言

最近打算看一些前端方面的东西,琢磨着从哪里开始看起,正好想到之前我还有一篇 由浅入深理解 jsonp 并拓展 这样的文章,主要介绍的是 jsonp 的概念,利用思路还没有讲,于是干脆就接着写这个话题吧。

0X01 什么是 JSONP 劫持

由于之前的那篇文章已经详细介绍过 jsonp 的工作原理,所以这里就不再详细介绍原理了,就简单的说一下:

JSONP 就是为了跨域获取资源而产生的一种非官方的技术手段(官方的有 CORS 和 postMessage),它利用的是 script 标签的 src 属性不受同源策略影响的特性,

那么劫持又是怎么回事呢?其实我们在学安全的过程中对劫持这个词可以说是一点也不陌生,我们遇到过很多的劫持的攻击方法,比如:dns 劫持、点击劫持、cookie劫持等等,也正如劫持这个词的含义:“拦截挟持”,dns 劫持就是把 dns 的解析截获然后篡改,点击劫持就是截获你的鼠标的点击动作,在用户不知情的情况下点击攻击者指定的东西,cookie 劫持就是获取用户的 cookie,然后可以进一步伪造身份,那么同样, jsonp 劫持就是攻击者获取了本应该传给网站其他接口的数据

0X02 JSONP 漏洞的利用过程及危害

通过JSONP技术可以实现数据的跨域访问,必然会产生安全问题,如果网站B对网站A的JSONP请求没有进行安全检查直接返回数据,则网站B 便存在JSONP 漏洞,网站A 利用JSONP漏洞能够获取用户在网站B上的数据。

1.JSONP漏洞利用过程如下:

1)用户在网站B 注册并登录,网站B 包含了用户的id,name,email等信息;
2)用户通过浏览器向网站A发出URL请求;
3)网站A向用户返回响应页面,响应页面中注册了JavaScript的回调函数和向网站B请求的script标签,示例代码如下:

<script type="text/javascript">
function Callback(result)
{
    alert(result.name);
}
</script>
<script type="text/javascript" src="http://B.com/user?jsonp=Callback"></script>

4)用户收到响应,解析JS代码,将回调函数作为参数向网站B发出请求;
5)网站B接收到请求后,解析请求的URL,以JSON 格式生成请求需要的数据,将封装的包含用户信息的JSON数据作为回调函数的参数返回给浏览器,网站B返回的数据实例如下:

Callback({"id":1,"name":"test","email":"test@test.com"})。

6)网站B数据返回后,浏览器则自动执行Callback函数对步骤4返回的JSON格式数据进行处理,通过alert弹窗展示了用户在网站B的注册信息。另外也可将JSON数据回传到网站A的服务器,这样网站A利用网站B的JSONP漏洞便获取到了用户在网站B注册的信息。

2.JSONP 漏洞利用过程示意图

此处输入图片的描述

3.JSONP 劫持漏洞的危害

JSONP是一种敏感信息泄露的漏洞,经过攻击者巧妙而持久地利用,会对企业和用户造成巨大的危害。攻击者通过巧妙设计一个网站,网站中包含其他网站的JSONP漏洞利用代码,将链接通过邮件等形式推送给受害人,如果受害者点击了链接,则攻击者便可以获取受害者的个人的信息,如邮箱、姓名、手机等信息,这些信息可以被违法犯罪分子用作“精准诈骗”。对方掌握的个人信息越多,越容易取得受害人的信任,诈骗活动越容易成功,给受害人带来的财产损失以及社会危害也就越大。

J0X03 SOP 漏洞的挖掘思路

这里我采用chrome浏览器的调试窗口进行挖掘weibo.com中存在的漏洞(测试之前需要登录一下,因为我们需要检测是不是会有敏感信息泄露)

首先把Preserve log选项勾上,这样用来防止页面刷新跳转的时候访问记录被重置,也方便我们进行下一步的筛选。

此处输入图片的描述

然后 F5 刷新,进入 NetWork 标签 ,CTRL+F 查找一些关键词 如 callback json jsonp email

此处输入图片的描述

此处输入图片的描述

然后我们需要人工确认这个请求的返回值是否有泄露用户的敏感信息,并且能被不同的域的页面去请求获取,这里以上面查找到的 jsonp 为例

此处输入图片的描述

发现并不是什么很有价值的信息,再来看看能不能被不同的域的页面请求到(也就是测试一下服务器端有没有对其验证请求来源)

此处输入图片的描述

发现换成了别的浏览器还是能检测到,说明验证的来源有些问题

注意:

上面的测试只是我为了简单的演示整个流程,所以在测试前我并没有登录,因此,上面的测试并不能说明漏洞存在

当然,这种人工的低效的检测方式我们完全可以将其变成主动或者被动的扫描器实现,那样效率会高得多

自动化测试工具Selenium + Proxy + 验证脚本

(1)Selenium:可用于自动化对网页进行测试,“到处”点击按钮、超链接,以期待测试更多的接口;
(2)Proxy:用于代理所有的请求,过滤出所有包含敏感信息的JSONP请求,并记录下HTTP请求;
(3)验证脚本:使用上述的HTTP请求,剔除referer字段,再次发出请求,测试返回结果中,是否仍包敏感信息,如果有敏感信息,说明这个接口就是我们要找的!

0X04 JSONP 漏洞利用技巧

1.利用技巧

JSONP 漏洞主要被攻击者用来在受害者不知不觉中窃取他们的隐私数据,常常被一些 APT 组织采用进行信息收集和钓鱼的工作(水坑攻击),下面的一个例子就可以说是在模拟水坑攻击

当我们发现信息泄露的 jsonp 接口以后我们要做的就是在自己的网站上写一个脚本,然后引诱受害者去访问这个网站,一旦访问了这个网站,脚本就会自动运行,就会想这个接口请求用户的敏感数据,并传送到攻击者的服务器上

$.ajax({
    url: 'https://api.weibo.com/2/{隐藏了哦}',
    type: 'get',
    dataType: 'jsonp',
}).done(function(json){
    var id = json["data"]["id"];
    var screen_name = json["data"]["screen_name"];
    var profile_image_url = json["data"]["profile_image_url"];

    var post_data = "";
    post_data += "id=" + id + "&amp;";
    post_data += "screen_name=" + screen_name + "&amp;";
    post_data += "profile_image_url=" + encodeURIComponent(profile_image_url);
    console.log(post_data);
    // 发送到我的服务器上
}).fail(function() {});

这样就能收到大量用户的敏感信息了

此处输入图片的描述

上述相关代码被一个师傅放在了 github 上,地址

2.相关扩展

(1)既然是窃取敏感信息,那么敏感信息除了一些 email 手机号 用户名等还有什么呢?没错,甚至可以是 CSRF Token 信息,有时候在 CSRF token 获取不到但是又找不到 XSS 的攻击点的时候不妨考虑一下 jsonp 劫持,看看会不会有惊喜

(2)还有一点,你有没有觉得这个攻击方式有点类似于 CSRF ,是的,的确很像,因此这也就引出了非常类似的修复方案。

0X05 防护方案

1、严格安全的实现 CSRF 方式调用 JSON 文件:限制 Referer 、部署一次性 Token 等。
2、严格安装 JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 )。
3、严格过滤 callback 函数名及 JSON 里数据的输出。
4、严格限制对 JSONP 输出 callback 函数名的长度(如防御上面 flash 输出的方法)。
5、其他一些比较“猥琐”的方法:如在 Callback 输出之前加入其他字符(如:/**/、回车换行)这样不影响 JSON 文件加载,又能一定程度预防其他文件格式的输出。还比如 Gmail 早起使用 AJAX 的方式获取 JSON ,听过在输出 JSON 之前加入 while(1) ;这样的代码来防止 JS 远程调用。

0X06 参考链接

http://www.mottoin.com/tech/123337.html
https://www.anquanke.com/post/id/97671
https://xiaix.me/fan-yi-wa-jue-tong-yuan-fang-fa-zhi-xing-lou-dong-same-origin-method-execution/
https://wooyun.js.org/drops/JS%E6%95%8F%E6%84%9F%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%EF%BC%9A%E4%B8%8D%E5%AE%B9%E5%BF%BD%E8%A7%86%E7%9A%84WEB%E6%BC%8F%E6%B4%9E.html
https://www.infosec-wiki.com/?p=455211
https://www.cnblogs.com/52php/p/5677775.html
http://www.91ri.org/13407.html
https://www.freebuf.com/articles/web/70025.html