XSSI攻击利用
个人日记
0x00 介绍
From: MBSD Technical Whitepaper
PS: MBSD是一家日本安全公司,最近好像经常分享技术文档的样子。
Cross Site Script Inclusion (XSSI) 跨站脚本包含是一种攻击技术允许攻击者通过恶意js绕过边界窃取信息。具体的说,应该是通过潜入script标签加载外部数据,for example:
过去几年,web安全研究者之中通用的认识中js文件,jsonp, json,或者版本较老的浏览器都有可能受到这种方式的攻击,除此之外,还可以通过一些浏览器的漏洞来得到js的错误信息利用,不过目前应该已经修复的差不多了。
2014,我们针对这个技术进行了专门的研究,发现了一些有趣的利用技术和浏览器漏洞,可以获取一些简单的文本中的信息,比如csv,在一些特定的情境下还可以获得更复杂的信息。我们主要的研究方向在于通过客户端脚本去识别目标数据的方法,比如变量,或者函数名。
下一节会开始介绍利用技术,最后会谈论下防御的手段。
0x01 攻击技术/漏洞
我们总共发现了5种与xssi相关的漏洞利用技术,或者是浏览器漏洞。
- IE bug导致错误信息泄漏
- 通过UTF-16编码获取其它类型的数据
- chrome/firefox 中 Harmony proxy bug利用
- 穷举
- csv获取
2.1 IE bug导致错误信息泄漏
为了防止js错误信息跨域泄漏,对于外部加载的js文件,现在主流的浏览器只有固定的错误信息,比如“script error”,当是在ie9与ie10,情况不一定如此。
一般来说,在外部js发生语法错误的情况下,浏览器只会提供固定的错误信息,但是当在runtime发生错误的情况下,浏览器会提供详细的错误信息。比如"foo 未定义"之类的,某些浏览器一旦允许外域js回复详细的错误信息,就会导致信息泄漏。
就是说,当某个网页的内容能被js识别为javascript格式的话,那么就可能通过错误信息获取到目标的内容。
比如,目标网页
HTTP/1.1 200 OKContent-Type: text/csvContent-Disposition: attachment; filename="a.csv"Content-Length: 131,abc,def,ghi攻击者设置错误显示
一旦加载成功,网页则会显示 "'abc' is undefined" 。
会出现这种情况是因为浏览器将目标识别为javascript,那么abc就会被识别为某个未定义的变量。当为这种情况的时候,浏览器就允许页面捕捉来自不同网页的错误信息。
做一个总结就是,有被利用的可能性的数据都是可以被识别,或者通过某种方式识别为有效js的数据。
我们在2014年7月报告这个问题,分配MS14-080,后来的 CVE-2014-6345也同样被分配到这个bug (1](2] 他们的修补方案跟其他的浏览器是差不多的,把错误信息改成某个固定的信息。
不过,稍微需要注意的一点,出现该漏洞的只有ie 9 和 ie 10.
遗憾的是我们并不是最早注意到这个问题的货,08年的时候,安全研究人员Chris Evans就在firefox (3]中发现了类似的问题,不过他的攻击代码看起来好麻烦的样子,这货利用多重重定向来欺骗浏览器。另外一件事就是13年的时候,研究人员Yosuke Hasegawa 和 @masa141421356也做过相关的研究,(4]
2. 用UTF-16获取json和其他类型的数据
大家可以看到,上面的东西只在csv这种操蛋的玩意上有用, 所以我们做了更多的研究看看能否获取不同格式的数据,之后我们发现通过UTF-16编码可以达到我们的目标。
其实本身是一个很简单的技巧 比如页面a ,我们加入 charset="UTF-16BE"