通过浏览器缓存bypass同源策略(SOP)

Posted microdesktop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过浏览器缓存bypass同源策略(SOP)相关的知识,希望对你有一定的参考价值。

错误的配置能导致严重的漏洞,

举例,攻击者能用通过中间服务器(反向代理,负载均衡,缓存服务器)去获得敏感数据,

另外一种攻击方式是通过web缓存投毒去溢出缓存。


浏览器缓存看起来非常安全的去临时储存私有信息。

主要的风险是攻击者通过文件系统获得私有信息,

然而在许多案例中,

错误的配置缓存相关的http头也能导致严重的危险案例。


跨域交互风险


许多网站有许多子域,但是子域之间需要共享数据,

然而在同源策略(SOP)下是不可能的,

有许多方法可以实现跨域交互,

举例 JSONP,用这种方法的开发者一定要实现某种保护来对抗信息泄露


让我来说一个例子,

一个站点有二个子域blog.example.com和account.example.com,account.example.com 网站有一个json,

根据用户的cookie 返回该用户的敏感信息,

为了防止信息泄露,

通过白名单列表(blog.example.com)验证了header头的Referer 的字段,

如果诱惑用户访问恶意网站,

攻击者是无法直接偷取敏感数据的,

而然 ,如果jsonp 设置了缓存相关的headers头,

攻击者就能通过web缓存获得私有信息。


浏览器行为


不同的浏览器的缓存实现略微不同,

但是某些方面也相似。

首先,只有GET回复包会缓存,

当浏览器获得GET请求的回复包,会检测回复包的包头:

    1.如果回复包里面包涵Cache-Control:private或者Cache-Control: public 头,缓存会通过 Cache-Control:max-age=<seconds>来缓存。

    2.如果回复包里面包涵  Expires头, 缓存会通过他的值来缓存(他的优先级低于Cache-Control)

    3.如果当前回复包没有上面列出的字段, 一些浏览器会检测 Last-Modified 头 和通常会缓存当前日期和Last-Modified日期差的10%

    4.如果没有任何和缓存相关的头, 浏览器也许会缓存回复包,但是用的时候会重新验证


主要问题是一个浏览器会缓存所有网站数据,

他们只是通过一个标准版key(scheme://host:port/path?query)去获取数据,意味着没有任何附加信息(比如javascript函数或者标签,以及cookies,或者http头)来获得敏感信息 ,

任何网站只要发送相同的URL就能获得缓存account.example.com回复包


攻击步骤解析

手把手的利用攻击步骤说明:

    1.用户访问blog.example.com.

    2.blog.example.com的脚本需要用户账号的信息

    3.用户浏览器发送一个jsonp的请求到account.example.com.

    4.jsonp回复一个站点account.example.com包涵缓存相关的包

    5.用户浏览器缓存了这个回复包

    6.用户被诱导访问一个有毒的网站

    7.这个有毒的网站包涵一个jsonp的脚本来获得account.example.com的用户信息

    8.浏览器返回缓存的回复包给这个有毒的网站


在这个案例中,Referer头永远不会检测,

因为回复包来自缓存。

而然攻击者通过缓存获得了用户的私有信息

Similar Vulnerabilities

类似的漏洞

这个方法可以用来溢出XSSI和过同源你攻击,

这个攻击也能过服务器端检测,举例,Origin头,

相同站点的cookie属性,或者定制包头



让我们来假设account.example.com 用CORS来替换JSONP,

他返回一个Access-Control-Allow-Origin: *的头,

但是通过定制包头用一个特别的token来授权用户来保护敏感数据

如果返回包来自缓存,攻击者通过构造相同的URL也能盗取私有信息,

没有CORS保护(由于Access-Control-Allow-Origin: *),

用户浏览器没有检查定制用户头的token就直接返回缓存数据。



怎么对抗SOP泄露

sop泄露是配置错误导致的

在Cross-origin交互中,你应该屏蔽浏览器缓存,

许多框架和现成的脚本不会设置缓存相关的头或者设置默认(Cache-Control: no-store)

 而然,你应该双层检测他们的安全,

浏览器开发商也应该考虑实现一个严格的途径去缓存,

希望这将改变当前的Cross-origin信息泄露


以上是关于通过浏览器缓存bypass同源策略(SOP)的主要内容,如果未能解决你的问题,请参考以下文章

浏览器SOP

我可以在任何浏览器上禁用 SOP(同源策略)进行开发吗?

VMWare Player 同源策略模拟环境

xss利用——BeEF#stage3(绕过同源策略与浏览器代理)

同源策略与JSONP劫持原理

同源策略如何应用于浏览器扩展?