这是之前写的一篇文章,写到一半拖延了半年...
一句话总结:XSSI漏洞,并非开发逻辑错误而产生的,更应该算是浏览器的漏洞。
0x00 JSONP劫持漏洞
首先,从大家比较熟悉的 JSONP劫持 开始讲起。举个栗子,某站(xxx.yyy.com)需要从主站(www.yyy.com)跨域加载一些信息,所以有了下面的这段代码:
但是getinfo.php的代码没有对来源站做检查,再加上script的跨域特性,就让攻击者有机可乘了。攻击代码示例如下:
当用户点击了恶意链接之后,页面解析自动发出请求,然后执行攻击者设定好的代码,该接口返回的信息就被攻击者掌握了。攻击原理可以参考CSRF漏洞,利用姿势参考XSS漏洞,这里不再细讲。
这是 JSONP劫持 里比较经典的一个案例。而我们今天要讲的是 XSSI漏洞,跟这个有什么关系吗?
都是劫持敏感信息,但劫持的类型不一样。JSONP劫持的是callback函数名可以被攻击者控制/猜测的JSONP接口,开发人员背锅。而XSSI漏洞劫持的通常是一些AJAX请求的接口,需要配合浏览器漏洞才能成功利用。
0x01 XSSI
XSSI -> Cross Site Script Include,漏洞到底是怎么产生的呢?
原因之一,是你用了假的AJAX请求。从开发的视角来看,AJAX请求只能通过 javascript 里的 XMLHttpRequest 对象发出,且在请求的时候浏览器会自动在请求头里加上 X-Requested-With: XMLHttpRequest。如果后台没有检查请求头里没有 “X-Requested-With: XMLHttpRequest” ,直接返回数据(AJAX失去了做人的尊严),就会出现问题。
也就是说,攻击者仍然可以用这种方法去加载存在问题的接口(就像JSONP劫持一样):
```
<script src=http://www.yyy.com/getinfo.php??userid=xxx>
```
但AJAX请求返回内容的格式不定,有可能是json,也有可能是字符串、CSV等。举个栗子,json的格式往往是 {"secret": "secret"},没有赋值给某个变量,也不像jsonp请求会执行指定函数。攻击者无法直接获取到内容,那到底是什么操作泄露了返回的内容呢?
原因之二,是浏览器有了真的漏洞。15年有国外的研究人员发布文章提到了如下几种攻击方法,可以获取到接口的内容:
IE bug导致错误信息泄漏
通过UTF-16编码获取其它类型的数据
chrome/firefox 中 Harmony proxy bug利用
穷举
csv获取
我们重点来分析下第三种,通过Proxy的设计缺陷来获取json的内容。产生原因比较经典:因为浏览器新性能导致的漏洞。
0x02 案例分析——Proxy
先来看下 Proxy 的基本使用方法。
看起来像webhook,可以更改原有接口的逻辑,截获参数的内容。原本设计应该是为了方便JavaScript的类继承,但黑阔们发现可以用Proxy代理window对象:
由于 {{target_url}} 是用<script>标签加载的,返回内容会被浏览器当成JS解析,当返回的内容为字符串(xyz)的时候,执行内容类似于 window.xyz。字符串的内容就被Proxy has函数读取到了。
现在漏洞已经修复,不能再给window对象添加Proxy代理。修复的过程也比较有意思,出过几次bypass,看来国际大厂的开发哥哥们也喜欢 “指哪儿修哪儿”
具体的案例可以参考: http://balpha.de/2013/02/plain-text-considered-harmful-a-cross-domain-exploit/
0x03 更多劫持方法
Proxy问题只是诸多劫持方法中的一种,更多类型的数据劫持方法可以参考:
http://www.mbsd.jp/Whitepaper/xssi.pdf
http://bobao.360.cn/learning/detail/3242.html
乌云知识库翻译版本: http://wps2015.org/drops/drops/XSSI%E6%94%BB%E5%87%BB%E5%88%A9%E7%94%A8.html
更多关于Proxy的用法:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
0x04 影响及修复
漏洞的利用条件:
* 含有敏感信息的接口没有验证 X-Requested-With 请求头
* 浏览器非最新版本,或者存在0day
* 用户点击攻击者的链接
修复:
* AJAX接口统一验证 X-Requested-With 请求头,或者添加响应头 X-Content-Type-Options: nosniff
* 关服务器跑路(划掉)