“Content-Type”导致的另类信息泄露

iso60001  2064天前

content-types-1-638.jpg

某日,当我正在漏洞赏金项目挖掘漏洞时,突然发现目标网站有一个有趣的现象。假设网站是censored.com,根据用户是否经过权限验证,访问该网站时所返回的页面有很大的不一样:一个返回请求中content-typetext/html;charset=utf-8;另一个根本没有Content-Type头,在这种情况下Content-Type默认为text/plain。此时我心中出现很多疑问:有没有一种聪明的方法可以区分这两种回应?可以推广到所有网站吗?这到底构成了什么安全威胁?

33.png

让我们先看看这里面蕴含的安全威胁,乍一看可能并不明显,但这是一个严重的信息泄漏,且影响多个网站。在具体的应用中,攻击者可以了解到受害者是否有权限获取另一网站(例如Facebook.com)上某个特定的资源,基于不同的结果,会暴露出受害者在第三方网站的身份权限。

在某些情况下,造成的影响可能比去匿名更严重。于是,我开始向这个方向研究,我相信肯定会有成果的。我开始研究MDN Web文档,希望找到任何有用的HTML属性。没过多久,我就有了结果。

HTMLob jectElement.typeMustMatch属性是一个布尔值,具体为<object>元素里的typemustmatch属性。只有<object>内部的资源类型和HTMLobjectElement.type指定的MIME类型相同,才能正常加载此资源。[1]

aa.png

找到这个属性后,我开始在Chrome中进行实验。但是,一直没看到效果,似乎该属性被浏览器完全忽略了。实际上,这里涉及到浏览器的兼容性。经过Eduardo的提示,我便发现它能在Firefox中生效。

如果content-typeHTML <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的最后面

44.png

感谢你的阅读!

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://medium.com/bugbountywriteup/cross-site-content-and-status-types-leakage-ef2dab0a492

最新评论

昵称
邮箱
提交评论