【前端安全】web缓存投毒

核心概念

缓存

web缓存位于用户和应用程序服务器之间,用于保存和提供某些响应的副本。在下图中,我们可以看到三个用户一个接一个地获取相同的资源:
在这里插入图片描述
缓存技术旨在通过减少延迟来提升页面加载速度,还可以减少应用程序服务器上的负载,同时达到防止Dos攻击的目的。

缓存键

缓存的概念可能听起来简单明了,但它隐藏了一些风险的假设。
每当缓存服务收到对资源的请求时,它需要确定:

  1. 是否已保存此指定资源的副本
  2. 是否可以使用该副本进行响应
  3. 是否需转发给应用程序服务器

确定两个请求是否正在尝试加载相同的资源可能是很棘手的问题;
对请求进行逐字节匹配的做法是完全无效的,因为HTTP请求充满了无关紧要的数据。
缓存使用缓存键的概念解决了这个问题 —— 使用一些特定的要素用于完全标识锁请求的资源。
缓存系统认为以下两个请求是等效的,并且很乐意将第一个请求缓存的响应来响应第二个请求:

GET /blog/post.php?mobile=1 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 … Firefox/57.0
Cookie: language=pl;
Connection: close
GET /blog/post.php?mobile=1 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 … Firefox/57.0
Cookie: language=en;
Connection: close

因此,该页面将以错误的语言输出提供给第二位访问者。
这揭示了一个问题:由非缓存键导致的差异化响应都能够被缓存并提供给其他用户。

缓存投毒

web缓存投毒的目的是发送导致有害响应的请求,将该响应保存在缓存服务中并提供给其他用户。
在这里插入图片描述
请注意,web缓存服务中还存在一种被称为 web缓存欺骗 的不同类型的攻击,不要和 缓存投毒 混淆了。

浏览器缓存投毒

浏览器一般缓存静态资源,那么攻击者的攻击目标也就是诸如JS、Css这类静态资源了。
比较容易发现的浏览器缓存投毒的表现是影响了页面的正常展示,但往往造成更大危害的可能属于不影响页面展示的缓存投毒,用于窃取一些用户信息等

服务器缓存投毒

服务器会缓存某个链接的第一个访问者的response内容。
如果第一个人是攻击者,就很有可能让CDN错误的缓存污染内容,达成攻击。
在这里插入图片描述
请看如下请求:
在这里插入图片描述
我们发现response页面中会拼接 X-Forwarded-Host,
那么假设我们是第一个请求者,此response将会被缓存,当下一个请求者访问时:
在这里插入图片描述
很明显,将会受到xss攻击。但是此类攻击有一个前提:
即攻击者需要是第一个请求页面的人,那么如何做到这一点?
攻击者可以利用response里的Age和max-age,以此计算投毒时机。

Age代表当前response时间,max-age代表该页面缓存何时过期

那么如何保护网站免受此类攻击呢?
这就要和我们之前提到的cache key有关了,如下:
在这里插入图片描述
如果我们利用Vary指定cache key为User-Agent,那么当两个访问者的请求域名、url、User-Agent都相同时,才命中同一块cache返回。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值