利用JSONP进行水坑攻击

0x00 简介


前几天安全研究者Jaime Blasco发现了在中国某些特定主题的网站被进行了水坑攻击,攻击方法有一定多样性,其中存在一些比较少见于此类型攻击中的技术,不过其实是比较早的技术了。

< 返回的数据被作为callback值的函数的实参传给调用页面,调用页面再实现一个callback值的函数,用来解析、处理传过来的数据(实参) >

比如参考1,发送Microsoft Office .doc利用MS09-027来打苹果电脑,虽然我认为他们可能没打到啥东西。除此之外的攻击事件还可以参考23

这次的攻击方式总结起来就是 当受害者访问网站a时会处罚恶意代码,之后恶意代码会去访问某些存在可获取私人信息接口的网站,获取信息后再上传至c2。

至于提到的玩烂了,乌云上有记录的分析最早是剑心 2012年发布的 《Json hijacking/Json劫持漏洞》参考文献4 以及2014 年zone社区的两篇相关文章以及利用文章。可看参考56

0x01 原理 & 攻击分析


总结来说 js会通过某种方式获取数据来方便用户的交互 ,这种获取数据的方式有一 些通用的格式 一般js会通过 json or jsonp这数据格式获取数据,获取的方法 一种 是xmlhttp,还有一种是script的形式

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

1
2
3
4
5
6
<script> 
function wooyun_callback(a){ 
alert(a); 
</script> 
<script src= "http://www.wooyun.org/userdata.php?callback=wooyun_callback" ></script> 

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

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

2 通过callback获取响应数据

3 解析响应数据

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

0x02 利用代码 & 案例


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

案例方面 可以在乌云主站搜索到需要的案例 wooyun.org

比如 http://wooyun.org/bugs/wooyun-2010-0118732 可以获取用户的购买记录等大量的隐私信息。比较有代表性的还有剑心发布的 WooYun: QQMail邮件泄露漏洞 通过qqmail的特殊接口获取邮箱内容。

1
2
3
4
5
6
7
8
9
<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交换数据

参考文献


        
  1. ( 1 ] https : //www.alienvault.com/open-threat-exchange/blog/cyber-espionage-campaign-against-the-uyghur-community-targeting-macosx-syst#sthash.fHOjOceQ.dpuf
  2. ( 2 ] https : //www.alienvault.com/open-threat-exchange/blog/new-macontrol-variant-targeting-uyghur-users-the-windows-version-using-gh0s
  3. ( 3 ] https : //www.alienvault.com/open-threat-exchange/blog/latest-adobe-pdf-exploit-used-to-target-uyghur-and-tibetan-activists
  4. ( 4 ] http : //drops.wooyun.org/papers/42
  5. ( 5 ] http : //zone.wooyun.org/content/16828
  6. ( 6 ] http : //zone.wooyun.org/content/16309
  7. ( 7 ] https : //www.alienvault.com/open-threat-exchange/blog/watering-holes-exploiting-jsonp-hijacking-to-track-users-in-china