03月09, 2015

JSONP 安全攻防技术

关于 JSONP

JSONP 全称是 JSON with Padding ,是基于 JSON 格式的为解决跨域请求资源而产生的解决方案。他实现的基本原理是利用了 HTML 里 元素标签,远程调用 JSON 文件来实现数据传递。如要在 a.com 域下获取存在 b.com 的 JSON 数据( getUsers.JSON ):

{"id" : "1","name" : "知道创宇"}

那么他们可以首先通过 JSONP 的“ Padding ”这个 getUsers.JSON 输出为:

callback({"id" : "1","name" : "知道创宇"});

对于实际应用过程中 callback 的名称在后台实现是动态输出的。如上面例子在 PHP 实现:

然后在 a.com 使用 $.getJSON("http://www.b.com/getUsers.php?callback=?", function(getUsers){ alert(getUsers.name); });

然而,安全问题一直都是伴随着业务发展而出现的,JSONP 的出现同样带来了各种各样的安全问题。本文将 JSONP 实现过程中给带来的安全攻防问题做一些简单介绍。

一、JSON 劫持

JSON 劫持又为“ JSON Hijacking ”,最开始提出这个概念大概是在 2008 年国外有安全研究人员提到这个 JSONP 带来的风险。其实这个问题属于 CSRF( Cross-site request forgery 跨站请求伪造)攻击范畴。当某网站听过 JSONP 的方式来快域(一般为子域)传递用户认证后的敏感信息时,攻击者可以构造恶意的 JSONP 调用页面,诱导被攻击者访问来达到截取用户敏感信息的目的。一个典型的 JSON Hijacking 攻击代码:


这个是在乌云网上报告的一个攻击例子( WooYun-2012-11284 )http://www.wooyun.org/bug.php?action=view&id=11284 当被攻击者在登陆 360 网站的情况下访问了该网页时,那么用户的隐私数据(如用户名,邮箱等)可能被攻击者劫持。

虽然这种攻击已经出现了好几年了,但是目前在大的门户网站都还普遍存在的,而且由于安全意识问题很多官方可能还不认为这是一个安全问题,上面提到的例子其实当时在乌云网站上 360 是忽视了的!

当然还是随着安全意识和技术水平的提高,很多甲方公司开始重视此类安全问题,开始着手研究解决方案。其中一个方案就是验证 JSON 文件调用的来源( Referer )。这个方案是主要利用了 '">

代码里我们使用

[详见: 《Hacking with mhtml protocol handler》http://www.80vul.com/mhtml/Hacking%20with%20mhtml%20protocol%20handler.txt]

这个点就充分利用了 callback 输出点直接输出一个 mhtml 文件格式,然后利用