浅谈XSSI漏洞
2017-8-27 19:31:59 Author: mp.weixin.qq.com(查看原文) 阅读量:5 收藏

这是之前写的一篇文章,写到一半拖延了半年...

一句话总结: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 

* 关服务器跑路(划掉)


文章来源: https://mp.weixin.qq.com/s?__biz=MzU4NjIxNzkyNQ==&mid=2247483679&idx=1&sn=8e3f267c1390d00aec44c1464d9c7136&chksm=fdffe1b5ca8868a3f6c5f20ab3ea52d34fc0eeaddeef9d0181e6c3f77d9ef2ee22cc8b4b8181&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh