resultmap type属性值_“Content-Type”导致的另类信息泄露

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

89aee56f58ef8391e036e68670a5cc46.png

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

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

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

3a2fc918490004141db8a1a616b1601e.png

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

如果content-type和HTML 里的type属性不同,资源就不会加载。不幸的是,里并不能使用onload以及onerror事件,因此,检测加载状态又是一个难题。

Eduardo还提出了一个有趣的想法,即在内部使用内联元素来检测加载状态。

 not_loaded 

简单来说,如果not_loaded文本被渲染,要么type属性与content-type不相同,要么服务器响应的状态不等于HTTP 200 OK。我现在依然还在测试这种方法。

在仔细观察的属性后,我注意到,.clientHeight和.clientWidth的值在不同情况下有所不同。这些属性主要代表渲染后对象的宽和高。如果对象未被渲染,则尺寸为0。此外,只有在服务器响应HTTP 200 OK时才会渲染对象。我不确定服务器的响应状态会不会影响我的攻击测试?

最后,我们还需要检测何时加载。如果我们不知道加载时间,就不好确定何时读取height属性。一个天真的解决方案是等一定的时间,然后读取属性,但这实在太浪费时间,而且很不稳定。

虽然不能触发onload事件,但window对象肯定能。在window中,只有所有组件(例如iframe)加载完成,才会触发事件。因此,我创建一个iframe,把放置其中,同时利用onload事件,就可以灵活而迅速地读取的height。

这种利用.onload检测渲染结果的方法,我认为是一种全新的跨源内容和状态类型检测技术。

以下是我制作的一个PoC,能检测你访问资源的content-type,希望你喜欢!(记住在Firefox中使用它)

PoC在网址https://medium.com/bugbountywriteup/cross-site-content-and-status-types-leakage-ef2dab0a492的最后面

d52cc984e308c69cff3881777be5be95.png

感谢你的阅读!

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场

来源:https://nosec.org/home/detail/2428.html

原文:https://medium.com/bugbountywriteup/cross-site-content-and-status-types-leakage-ef2dab0a492

白帽汇从事信息安全,专注于安全大数据、企业威胁情报。

公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。

为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值