Featured image of post Web缓存投毒

Web缓存投毒

Web缓存投毒

参考这篇:对缓存投毒的学习总结-先知社区

什么是缓存投毒

什么是缓存

缓存位于服务器和用户之间,通常在固定的时间内保存(缓存)对特定请求的响应。如果另一个用户在这段时间内发送了同样的请求,则缓存会直接提供响应的副本(缓存)给用户,而无需与服务器直接进行交互。通过减少服务器对重复请求进行处理的次数,来减轻服务器的负担。使用CDN(内容分发网络)就可以达到这样的目的。

当缓存接收到HTTP请求的时候,它会匹配vary头部指定的HTTP HEADER来进行判断。当指定的头部与缓存中的数据匹配时,则提供缓存的内容。如果不匹配,就直接与服务器交互。这些指定的头部被称作:缓存键 “cache key”。其他的头部就是非缓存键。

下面举个例子说明缓存键

缓存系统认为以下两个请求是等效的,并且将很乐意的使用从第一个请求缓存的响应来响应第二个请求:

1
2
3
4
5
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
1
2
3
4
5
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

因此,该页面将以错误的语言输出提供给第二位访问者。这揭示了以下的问题-由非缓存键导致的差异化响应都能够被存储并提供给其他用户。理论上来说,网站可以使用“Vary”响应头来指定额外应该加入到缓存键中的其他请求头。在实践中,对Vary响应头的使用仅停留在理论阶段,像Cloudflare这样的CDN完全忽略它,大家甚至没有意识到他们的应用程序支持任何基于请求头的输入。

缓存投毒

在web缓存部分我们知道,当一个页面的内容被缓存后,其他用户访问这个页面时会接收到同样的内容。如果在缓存的过程中,存入了有害的内容,比如存入了一个带有XSS payload的页面。其他用户访问时,就会受到XSS漏洞的攻击。这就是缓存投毒。

发现缓存投毒漏洞的方法

  1. 判断哪些非缓存键会影响页面内容

    任何的缓存投毒都依赖于非缓存键,所以我们在一开始就要判断哪些HTTP头部属于缓存键,哪些不属于。再通过修改或添加HTTP头部来判断哪些头部会引起页面内容的变化。常用的两种方式:

    1. 手动修改或添加HTTP头部,指定随机字符来判断头部是否影响页面内容
    2. 使用Brupsuite插件Param Miner来自动判断
  2. 构造内容引起服务器端的有害响应

    针对不同的非缓存键,我们需要知道哪些非缓存键会导致页面返回有害的内容。举一个例子:页面中js链接的域名是通过获取HTTP头部中的“X-Forwarded-Host”字段来设置的。而服务器不会将这个字段作为缓存键,那么这个字段就可以利用。

  3. 获取响应,使有害内容被缓存

    通过构造有害的内容,访问页面,获取响应。就会将有害的内容存入缓存中。需要注意的是,页面是否会被缓存受到文件扩展名、内容类型、url路由、状态代码和响应标头的影响。在测试的会比较麻烦。

bp靶场练习

这个靶场比较多,就挑一部分来练习

All labs | Web Security Academy

Web cache poisoning with an unkeyed header

描述:

This lab is vulnerable to web cache poisoning because it handles input from an unkeyed header in an unsafe way. An unsuspecting user regularly visits the site’s home page. To solve this lab, poison the cache with a response that executes alert(document.cookie) in the visitor’s browser.

hint: This lab supports the X-Forwarded-Host header.

xss弹cookie,我们首先抓包,加X-Forwarded-Host头,看到响应是有X-Cache: hit,说明响应来自缓存

我们直接在get请求后面加上参数,比如a=1,由于会加载缓存,这个界面跟前面的缓存键相同,会加载缓存,也会加载X-Forwarded-Host头的内容

image-20250812152207579

可以看到响应出现了aaa.com,我们只需要拼接就能加载xss payload

1
X-Forwarded-Host: aaa.com"></script><script>alert(document.cookie)</script>

image-20250812152513235

这里其实就结束了,如果要完成的话要借助他的服务器,因为我们看到这个后面拼接了/resources/js/tracking.js,

image-20250812154152811

然后前面那个头写这个url,就可以触发了

image-20250812154229556

This lab is vulnerable to web cache poisoning because cookies aren’t included in the cache key. An unsuspecting user regularly visits the site’s home page. To solve this lab, poison the cache with a response that executes alert(1) in the visitor’s browser.

插入alert(1)

首先抓包看到cookie

image-20250812160957896

还是老办法拼接

1
"};alert(1);aaa={"":"

注意分号要url编码

image-20250812161226158

其他靶场看上面的参考文章就行了,原理都一样

使用 Hugo 构建
主题 StackJimmy 设计