JSONP存在的JSON Hijacking漏洞以及与csrf/xss漏洞的关系

在实习过程中接触过所谓的JSON Hijacking 漏洞,但最近在写论文时发现理解得不深,好像跟xss与csrf又有点区别与联系,索性深入学习了下JSONP(JSON with Padding)。

下面一段话截取自:http://stackoverflow.com/questions/2067472/what-is-jsonp-all-about   仔细看看就比较清晰了。

Say you're on domain abc.com, and you want to make a request to domain xyz.com. To do so, you need to cross domain boundaries, a no-no in most of browserland.

The one item that bypasses this limitation is <script> tags. When you use a script tag, the domain limitation is ignored, but under normal circumstances, you can't really DO anything with the results, the script just gets evaluated.

Enter JSONP. When you make your request to a server that is JSONP enabled, you pass a special parameter that tells the server a little bit about your page. That way, the server is able to nicely wrap up its response in a way that your page can handle.

For example, say the server expects a parameter called "callback" to enable its JSONP capabilities. Then your request would look like:

http://www.xyz.com/sample.aspx?callback=mycallback

Without JSONP, this might return some basic JavaScript object, like so:

{ foo: 'bar' }

However, with JSONP, when the server receives the "callback" parameter, it wraps up the result a little differently, returning something like this:

mycallback({ foo: 'bar' });

As you can see, it will now invoke the method you specified. So, in your page, you define the callback function:

mycallback = function(data){
  alert(data.foo);
};

And now, when the script is loaded, it'll be evaluated, and your function will be executed. Voila, cross-domain requests!

大概解释一下。举例:在abc.com 有这么一段 <script src="http://www.xyz.com/sample.aspx?callback=mycallback"></script>

在 xyz.com 的 sample.aspx 可能是如下实现的:

PHP Code
<?php
header('Content-Type:text/html;charset=utf-8');
$callback = $_GET['callback'];
$data     = "{foo:
 'bar'}";
echo $callback . "(" . $data . ");";
?>

src 标签请求返回即 <script> mycallback({foo: 'bar'});</script> 也就是会执行函数mycallback,这里需要明确的是mycallback 肯定是在abc.com 上实现的,把 {foo: 'bar' } 作为参数传递,以便下一步操作。callback只是个key,也可以写成jsonp,当然server获取的key也得变换。

讲到这里,对于正常的请求,jsonp并没有什么安全问题。但是,对于一些在登陆态会暴露敏感信息如用户id和昵称的cgi来说,我们直接用浏览器访问

http://www.a.com/json.php?mod=pay&func=openvip&callback=loginInfoCallback   虽然我们并没有实现loginInfoCallback ,但如上所述,server端会返

回 loginInfoCallback({"ret":-1102321,"data":{"_id":1032412,"_nick":"jnusimba"}});  当然这是在 jnusimba 在浏览器的另一个tab已经登录过 a.com 的情

形下。所以攻击的手法是 在第三方站点通过“<script src=http://www.a.com/json.php?mod=pay&func=openvip&callback=loginInfoCallback></script>”

的形式就可以在函数loginInfoCallback 参数里面取得当前用户的id号和昵称。

上述讲到的JSON Hijacking 漏洞可以认为是 csrf漏洞的一种,也就是 csrf 写-读 。基本原理还是因为浏览器的会话机制在第三方站点请求 a.com 时

也会把a.com 相关的cookie 发送出去。防御来说,校验refer/ 请求带上form token 都是比较好的办法,也就是带有第三方无法预测的值。

注意:jsonp 只支持 get 请求。

对于上面server端的php代码来说,返回 {foo: 'bar'}  没有带有登陆态信息,故没有什么实质的风险。但不知道有人注意到没有,它返回的头部

Content-Type:text/html; 即类型设置错误了,应该是content-type:text/javascript;  (or application/javascript) 设置成html格式,容易造成xss攻击,比

如callback=<script>alert('aaa')</script>,即浏览器会弹框(注意,在高版本的ie和chrome下面可能已经限制了xss攻击,测试在firefox下查看即可)。

(注:The MIME media type for JSON text is application/json. The default encoding is UTF-8. For JSONP with callback :application/javascript )

对于此类由jsonp引起的反射xss漏洞,一来响应头应该设置正确;二来应该对callback参数进行过滤或者编码,避免可以直接执行js。

关于 csrf 的防御:

1. 检查 http referer 是否是同域

如果网站有客户端,需要对此开绿灯,可能是个隐患。

注意:ajax 跨域发起请求时是不可以添加 cookie、user-agent、referer、 x_forward_for 等http 头的,可以看下w3c给出的一份头部黑名单。

否则 referer 校验就无效了。

此外在某些情况下,浏览器也不会发送referer,比如从https 跳转到 http;flash 的请求等。

2. 限制 cookie 的生命周期(减少发生概率)

3. 使用一次性 token

token 是一段随机的数字字母值,经常出现在表单的隐藏项中,原理是 无法通过 ajax 获取到外域页面的 token 值(虽然可以通过 html 标签带动 ajax 跨域请求,如 <img src='http://...'  onload="load_ajax_func()">,但无法通过 javascript 读取返回的内容)。

4. 使用验证码(降低用户体验)

当同域页面上有xss 漏洞时,可以通过 ajax 获取到其他页面的 token;

token 如果出现在 get 参数中,也容易通过 refer的方式泄露;

此时只能通过验证码来防范csrf 了。

参考链接:

http://en.wikipedia.org/wiki/JSONP

http://stackoverflow.com/questions/2067472/what-is-jsonp-all-about

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张戈的专栏

Nginx发布1.9.0版本,新增支持TCP代理和负载均衡的stream模块

昨天在公司微信群,CTO 分享了这个消息,对运维来说以后基于 TCP 协议的后端业务的高可用又多了一个新的选择,实在是棒极了! 一直以来,Nginx 并不支持 ...

31250
来自专栏北京马哥教育

4个Linux服务器监控工具

下面是我想呈现给你的4个强大的监控工具。 htop – 交互式进程查看器 你可能知道在机器上查看实时进程的标准工具top。如果不知道,请运行$ top看看,运行...

45490
来自专栏编程坑太多

python使用selenium+chromedriver调用chrome截图

40850
来自专栏耕耘实录

两种方法实现Linux不活动用户登录超时后自动登出

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢。

20220
来自专栏FreeBuf

PHP任意文件上传漏洞(CVE-2015-2348)

安全研究人员今天发布了一个中危漏洞——PHP任意文件上传漏洞(CVE-2015-2348)。 在上传文件的时候只判断文件名是合法的文件名就断定这个文件不是恶意文...

30950
来自专栏FreeBuf

CVE 2017-0199漏洞利用的新姿势

近日从客户处捕获一枚邮件附件中的可疑word样本,以下是扫描结果,检测率貌似不高。 ? ? 手动分析吧。 文件md5:0b16b255918264667a9f0...

25250
来自专栏老安的博客

vmware api开发之快照管理

21140
来自专栏Jerry的SAP技术分享

Chrome开发者工具关于网络请求的一个隐藏技能

这个隐藏技能的背景是,最近出于学习目的,我写了一个百度贴吧的网络爬虫,专门爬取一些指定主题的贴吧帖子。

15210
来自专栏Spark学习技巧

Spark Structured Streaming高级特性

一,事件时间窗口操作 使用Structured Streaming基于事件时间的滑动窗口的聚合操作是很简单的,很像分组聚合。在一个分组聚合操作中,聚合值被唯一保...

1.2K70
来自专栏我叫刘半仙

高效访问海量地图数据--用OpenLayers访问GeoServer发布的地图

1.2K30

扫码关注云+社区

领取腾讯云代金券