“Content-Type”导致的另类信息泄露
某日,当我正在漏洞赏金项目挖掘漏洞时,突然发现目标网站有一个有趣的现象。假设网站是censored.com
,根据用户是否经过权限验证,访问该网站时所返回的页面有很大的不一样:一个返回请求中content-type
为text/html;charset=utf-8
;另一个根本没有Content-Type
头,在这种情况下Content-Type
默认为text/plain
。此时我心中出现很多疑问:有没有一种聪明的方法可以区分这两种回应?可以推广到所有网站吗?这到底构成了什么安全威胁?
让我们先看看这里面蕴含的安全威胁,乍一看可能并不明显,但这是一个严重的信息泄漏,且影响多个网站。在具体的应用中,攻击者可以了解到受害者是否有权限获取另一网站(例如Facebook.com)上某个特定的资源,基于不同的结果,会暴露出受害者在第三方网站的身份权限。
在某些情况下,造成的影响可能比去匿名更严重。于是,我开始向这个方向研究,我相信肯定会有成果的。我开始研究MDN Web文档,希望找到任何有用的HTML属性。没过多久,我就有了结果。
HTMLob jectElement.typeMustMatch
属性是一个布尔值,具体为<object>
元素里的typemustmatch
属性。只有<object>
内部的资源类型和HTMLobjectElement.type
指定的MIME类型相同,才能正常加载此资源。[1]
找到这个属性后,我开始在Chrome中进行实验。但是,一直没看到效果,似乎该属性被浏览器完全忽略了。实际上,这里涉及到浏览器的兼容性。经过Eduardo的提示,我便发现它能在Firefox中生效。
如果content-type
和HTML <object>
里的type
属性不同,资源就不会加载。不幸的是,<object>
里并不能使用onload
以及onerror
事件,因此,检测加载状态又是一个难题。
Eduardo还提出了一个有趣的想法,即在<object>
内部使用内联元素来检测加载状态。
<object type= data= typemustmatch> not_loaded </object>
简单来说,如果not_loaded
文本被渲染,要么type
属性与content-type
不相同,要么服务器响应的状态不等于HTTP 200 OK
。我现在依然还在测试这种方法。
在仔细观察<object>
的属性后,我注意到,<object>.clientHeight
和<object>.clientWidth
的值在不同情况下有所不同。这些属性主要代表渲染后对象的宽和高。如果对象未被渲染,则尺寸为0。此外,只有在服务器响应HTTP 200 OK
时才会渲染对象。我不确定服务器的响应状态会不会影响我的攻击测试?[2]
最后,我们还需要检测<object>
何时加载。如果我们不知道加载时间,就不好确定何时读取height
属性。一个天真的解决方案是等一定的时间,然后读取属性,但这实在太浪费时间,而且很不稳定。
虽然<object>
不能触发onload
事件,但window
对象肯定能。在window
中,只有所有组件(例如iframe)加载完成,才会触发事件。因此,我创建一个iframe
,把<object>
放置其中,同时利用onload
事件,就可以灵活而迅速地读取<object>
的height
。
这种利用<object>.onload
检测<object>
渲染结果的方法,我认为是一种全新的跨源内容和状态类型检测技术
。
以下是我制作的一个PoC,能检测你访问资源的content-type
,希望你喜欢!(记住在Firefox中使用它)
PoC在网址https://medium.com/bugbountywriteup/cross-site-content-and-status-types-leakage-ef2dab0a492
的最后面
感谢你的阅读!
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://medium.com/bugbountywriteup/cross-site-content-and-status-types-leakage-ef2dab0a492
最新评论