【基础漏洞】WEB缓存投毒

admin 2023年6月26日15:00:32评论212 views字数 2698阅读8分59秒阅读模式


  • 什么是 web 缓存

  • 什么是 web 缓存投毒

  • 和缓存有关的一些请求头

  • 挖掘过程

  • 漏洞复现

    • 寻找非缓存键

    • 构造恶意响应内容

    • 确认是否缓存成功

  • 漏洞危害

  • 修复建议

  • 参考链接


什么是 web 缓存

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

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

比较直观的图示如下:

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

【基础漏洞】WEB缓存投毒
Web-Cache-Poisoning-description

什么是 web 缓存投毒

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

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

【基础漏洞】WEB缓存投毒
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[1]进行演示

寻找非缓存键

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

【基础漏洞】WEB缓存投毒
guess header

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

【基础漏洞】WEB缓存投毒
logger

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

【基础漏洞】WEB缓存投毒
uncached

构造恶意响应内容

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

【基础漏洞】WEB缓存投毒
cached

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

【基础漏洞】WEB缓存投毒
cached

确认是否缓存成功

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

【基础漏洞】WEB缓存投毒
cached

漏洞危害

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

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

修复建议

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

参考链接

  • 对缓存投毒的学习总结[2]
  • Is Your Application Vulnerable to Web Cache Poisoning?[3]

参考资料

[1]

Lab: Web cache poisoning with an unkeyed header: https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws/lab-web-cache-poisoning-with-an-unkeyed-header

[2]

对缓存投毒的学习总结: https://xz.aliyun.com/t/7696

[3]

Is Your Application Vulnerable to Web Cache Poisoning?: https://www.hackmanit.de/en/blog-en/142-is-your-application-vulnerable-to-web-cache-poisoning

- END -


原文始发于微信公众号(初始安全):【基础漏洞】WEB缓存投毒

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月26日15:00:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【基础漏洞】WEB缓存投毒http://cn-sec.com/archives/1835133.html

发表评论

匿名网友 填写信息