Web 缓存中毒 ------ Web cache poisoning
概述
在本文中,我们将讨论什么是 Web 缓存中毒以及哪些行为会导致 Web 缓存中毒漏洞。我们还将研究利用这些漏洞的一些方法,并提出减少暴露于这些漏洞的方法。
1. 什么是 Web 缓存中毒?
Web 缓存中毒是一种高级技术,攻击者利用 Web 服务器和缓存的行为,以便向其他用户提供有害的 HTTP 响应。
从根本上说,Web 缓存中毒涉及两个阶段。首先,攻击者必须弄清楚如何从后端服务器引出无意中包含某种危险负载的响应。一旦成功,他们需要确保他们的响应被缓存并随后提供给预期的受害者。
中毒的 Web 缓存可能是一种毁灭性的手段,可以分发多种不同的攻击,利用 XSS、JavaScript 注入、开放重定向等漏洞。
2. Web 缓存如何工作?
要了解 Web 缓存中毒漏洞是如何产生的,重要的是要对 Web 缓存的工作原理有一个基本的了解。
如果服务器必须单独向每个 HTTP 请求发送新的响应,这可能会使服务器过载,从而导致延迟问题和糟糕的用户体验,尤其是在繁忙时段。缓存主要是减少此类问题的一种方法。
缓存位于服务器和用户之间,它保存(缓存)对特定请求的响应,通常保留固定的时间。如果另一个用户随后发送等效请求,则缓存只需将缓存响应的副本直接提供给用户,而无需来自后端的任何交互。这通过减少服务器必须处理的重复请求数量,大大减轻了服务器的负载。

缓存键
当缓存收到 HTTP 请求时,它首先必须确定是否有可以直接提供的缓存响应,或者是否必须转发请求以供后端服务器处理。缓存通过比较请求组件的预定义子集(统称为“缓存键”)来识别等效请求。通常,这将包含请求行和 Host 标头。缓存键中未包含的请求组件称为“unkeyed”。
如果传入请求的缓存键与前一个请求的键匹配,则缓存会将它们视为等效。因此,它将提供为原始请求生成的缓存响应的副本。这适用于具有匹配缓存键的所有后续请求,直到缓存的响应过期。
至关重要的是,缓存完全忽略了请求的其他组件。我们稍后将更详细地探讨此行为的影响。
3. Web 缓存中毒攻击的影响是什么?
Web 缓存中毒的影响在很大程度上取决于两个关键因素:
- 攻击者究竟能成功缓存什么
由于被污染的缓存更多的是一种分发手段而非独立攻击,因此 Web 缓存投毒的影响与注入的有效载荷的危害性密不可分。与大多数攻击类型一样,Web 缓存投毒也可以与其他攻击结合使用,以进一步扩大潜在影响。 - 受影响页面的流量大小
当缓存被污染时,被污染的响应只会提供给访问受影响页面的用户。因此,其影响可能从不存在到巨大不等,这取决于页面是否受欢迎。例如,如果攻击者成功地污染了一个主要网站首页的缓存响应,那么这次攻击可能会影响成千上万的用户,而攻击者无需进行任何后续交互。
请注意,缓存条目的持续时间不一定会影响 Web 缓存中毒的影响。通常,可以以这样一种方式编写攻击脚本,使其无限期地重新毒害缓存。
4. 构建 Web 缓存中毒攻击
一般来说,构建基本的 Web 缓存中毒攻击包括以下步骤:
- 识别并评估未被用作缓存键的输入
- 从后端服务器引出有害响应
- 使响应被缓存
4.1 识别并评估未被用作缓存键的输入
任何 Web 缓存中毒攻击都依赖于对无键输入(如标头)的操纵。在决定是否向用户提供缓存响应时,Web 缓存会忽略无键输入。这种行为意味着你可以使用它们注入有效载荷并引发“中毒”响应,如果被缓存,该响应将提供给所有请求具有匹配缓存键的用户。因此,构建 Web 缓存中毒攻击的第一步是识别服务器支持的无键输入。
你可以通过向请求中添加随机输入并观察它们是否对响应产生影响来手动识别无键输入。这可能很明显,例如直接在响应中反映输入,或者触发完全不同的响应。然而,有时影响更加微妙,需要一些侦探工作才能弄清楚。你可以使用诸如 Burp Comparer 之类的工具来比较有注入输入和没有注入输入的响应,但这仍然需要大量的手动工作。
Param Miner
幸运的是,您可以通过从 BApp 商店向 Burp 添加 Param Miner 扩展来自动化识别未键控输入的过程。要使用 Param Miner,您只需右键单击要调查的请求,然后单击“Guess headers”。然后,Param Miner 在后台运行,发送包含与其广泛的内置标头列表不同的输入的请求。如果包含其注入输入之一的请求对响应有影响,Param Miner 会将其记录在 Burp 中,如果您使用的是 Burp Suite Professional,则记录在“问题”窗格中,如果您使用的是 Burp Suite 社区版,则记录在扩展程序的“输出”选项卡中(“扩展”>“已安装”>“Param Miner”>“输出”)。
例如,在以下屏幕截图中,Param Miner 在网站主页上发现了一个未键的标头 X-Forwarded-Host:

注意:在对实时网站上的无键输入进行测试时,存在无意中导致缓存将你生成的响应提供给真实用户的风险。因此,确保你的请求都具有唯一的缓存键非常重要,这样它们才只会提供给你。为此,你可以在每次发出请求时手动向请求行添加一个缓存破坏器(例如一个唯一的参数)。或者,如果你正在使用参数挖掘器(Param Miner),则有选项可以自动为每个请求添加缓存破坏器。
4.2 从后端服务器引出有害响应
一旦你确定了一个无键输入,下一步就是准确评估网站如何处理它。理解这一点对于成功引发有害响应至关重要。如果输入在服务器的响应中被反映出来而没有经过适当的清理,或者被用于动态生成其他数据,那么这就是网络缓存中毒的一个潜在入口点。
4.3 使响应被缓存
操纵输入以引发有害响应只是成功的一半,但除非你能使响应被缓存,否则这并没有多大作用,而这有时可能很棘手。
响应是否被缓存可能取决于各种因素,例如文件扩展名、内容类型、路由、状态码和响应头。你可能需要花一些时间在不同页面上试验请求并研究缓存的行为方式。一旦你弄清楚如何使包含恶意输入的响应被缓存,你就可以将漏洞利用传递给潜在受害者。

利用 Web 缓存中毒漏洞
这个基本过程可用于发现和利用各种不同的 Web 缓存中毒漏洞。
在某些情况下,Web 缓存中毒漏洞是由于缓存设计中的一般缺陷引起的。在其他时候,特定网站实现缓存的方式可能会引入可被利用的意外情况。
在以下部分中将概述这两种情况中最常见的一些示例。
- 利用缓存设计缺陷
- 利用缓存实现缺陷
5. 利用缓存设计缺陷
在本节中,我们将更仔细地研究 Web 缓存中毒漏洞是如何由于缓存设计中的一般缺陷而出现的。我们还将演示如何利用这些。
简而言之,如果网站以不安全的方式处理未键的输入并允许缓存后续的 HTTP 响应,则容易受到 Web 缓存中毒的影响。此漏洞可用作各种不同攻击的传递方法。
5.1 使用 Web 缓存中毒进行 XSS 攻击
也许最简单的 Web 缓存中毒漏洞是当未键输入反映在可缓存的响应中而没有进行适当的清理时。
例如,请考虑以下请求和响应:
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: innocent-website.co.uk
HTTP/1.1 200 OK
Cache-Control: public
<meta property="og:image" content="https://innocent-website.co.uk/cms/social.png" />
在这里,X-Forwarded-Host 标头的值用于动态生成 Open Graph 图像 URL,然后将其反映在响应中。对于 Web 缓存中毒至关重要的是,X-Forwarded-Host 标头通常是未键的。在此示例中,缓存可能会因包含简单 XSS 有效负载的响应而中毒:
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"
HTTP/1.1 200 OK
Cache-Control: public
<meta property="og:image" content="https://a."><script>alert(1)</script>


2683

被折叠的 条评论
为什么被折叠?



