什么是web缓存

Web缓存(Web Cache)是一种用于存储和提供经常访问的Web资源的技术。它是位于网络架构中的一层,可以在客户端和Web服务器之间充当中间层。Web缓存通过保存经常被请求的Web页面、图像、CSS文件、脚本等内容,以便在后续请求中快速提供给用户,从而减少了对原始Web服务器的请求,提高了性能和响应速度。

当用户请求访问一个Web资源时,客户端(例如浏览器)首先会检查本地缓存,看是否已经有该资源的副本。如果有,客户端可以直接从缓存中获取该资源,而无需再次向服务器发出请求。这减少了网络延迟和带宽消耗,提供了更快的加载速度。

比较直观的图示如下:

第一个用户访问index.html后,缓存服务器会将index.html的内容缓存,后续一定时间内,其他用户访问index.html都由缓存服务器直接返回。

Web-Cache-Poisoning-description

什么是web缓存投毒

还是看图说话,攻击者如果在第一次访问时就把恶意内容缓存了,那其他用户访问时,就会直接返回恶意的内容。

简单来说:如果可以控制缓存的内容,那么就可以造成缓存投毒。(Web cache poisoning)

Web-Cache-Poisoning-attack

和缓存有关的一些请求头

缓存服务器判断是否要缓存文件通常依赖于一些标头和策略。以下是一些常见的方法和标头,用于缓存服务器判断是否要缓存文件:

Cache-Control 标头: Cache-Control 是 HTTP 标头之一,用于控制缓存行为。通过设置不同的 Cache-Control 值,可以指示缓存服务器如何处理文件的缓存。常见的 Cache-Control 值包括:

  • "public":表明该资源可以被任意缓存服务器缓存。
  • "private":表明该资源只能被客户端缓存,不能被中间缓存服务器缓存。
  • "no-cache":表明缓存服务器必须重新验证文件的有效性,不能直接返回缓存的副本。
  • "no-store":表明缓存服务器不应该存储该资源的任何副本。

Expires 和 Max-Age 标头: Expires 和 Max-Age 标头用于指定文件的过期时间。Expires 是一个绝对时间,表示文件的过期日期和时间,而 Max-Age 是一个相对时间,表示文件在缓存中的最大存储时间。当文件过期后,缓存服务器会重新获取最新的文件副本。

Last-Modified 和 If-Modified-Since 标头: Last-Modified 是一个标头,指示文件的最后修改日期和时间。当客户端再次请求该文件时,会发送 If-Modified-Since 标头,带上上次获取文件时的 Last-Modified 值。如果文件在服务器上未发生修改,服务器可以返回 304 Not Modified 响应,指示客户端继续使用缓存的副本。

ETag 和 If-None-Match 标头: ETag 是一个标识文件的唯一标识符(通常是哈希值或版本号),用于验证文件的完整性。当客户端再次请求该文件时,会发送 If-None-Match 标头,带上之前获取文件时的 ETag 值。如果文件的 ETag 值与服务器上的匹配,服务器可以返回 304 Not Modified 响应。

Vary 标头: Vary 标头用于指示缓存服务器根据特定的请求头(如 Accept-Encoding、User-Agent 等)来区分不同的缓存副本。这样可以确保根据不同的请求头返回适当的缓存副本。

挖掘过程

  1. 寻找非缓存键
    1. 缓存键是用于标识缓存内容的唯一标识符,它通常由请求的URL、HTTP方法(如GET或POST)和请求标头(如Accept-Language)等组成。缓存服务器通过缓存键来判断两个请求是否正在尝试加载相同的资源。
    2. 由非缓存键导致的差异化响应都能够被存储到缓存中并提供给其他用户。
  2. 通过非缓存键构造恶意响应内容缓存到缓存服务器中
  3. 访问恶意缓存的地址,确定是否缓存成功

漏洞复现

实战中没有遇到过,所以以Lab: Web cache poisoning with an unkeyed header进行演示

寻找非缓存键

可以手动添加header尝试,也可以通过param miner插件进行枚举。

guess header

在logger就可以看到枚举的请求。

logger

稍等后成功找到了非缓存键X-Forwarded-Host

uncached

构造恶意响应内容

添加X-Forwarded-Host头,可见内容在响应中成功返回,说明可以篡改响应内容。

cached

构造恶意的响应内容,可见恶意内容被缓存。

cached

确认是否缓存成功

正常访问:https://0aa700e104ab54f180e8353900bb009c.web-security-academy.net/?a=3,可见已经攻击成功。

cached

漏洞危害

由于缓存投毒主要以篡改HTML中的内容为主,因此最大的危害也就是操作JS,所以危害和XSS差不多

  1. 获取敏感数据,如cookie、个人信息等
  2. 发起敏感操作,如修改密码、新建工单等
  3. 任意URL跳转
  4. ...

修复建议

  1. 清除缓存服务器中的所有缓存数据,避免用户访问恶意的内容。
  2. 对于用户提供的输入数据,进行严格的验证和过滤。确保输入数据不包含恶意代码、特殊字符或非预期的内容,以防止攻击者在缓存中注入恶意数据。
  3. 部署WAF、IDS等设备。

参考链接

Copyright © d4m1ts 2023 all right reserved,powered by Gitbook该文章修订时间: 2023-06-26 13:17:52

results matching ""

    No results matching ""