在本节中,我们将讨论什么是网络缓存中毒以及哪些行为可能导致网络缓存中毒漏洞。 我们还将探讨利用这些漏洞的一些方法,并提出一些减少这些漏洞的方法的建议。
网络缓存中毒是一项高级技术,攻击者利用该技术利用web服务器和缓存的行为,从而将有害的HTTP响应提供给其他用户。
从根本上讲,网络缓存中毒涉及两个阶段。 首先,攻击者必须弄清楚如何从无意中包含某种危险有效负载的后端服务器引起响应。 一旦成功,他们需要确保将他们的响应缓存起来并随后提供给预期的受害者。
有毒的网络缓存可能是传播多种不同攻击,利用XSS,JavaScript注入,开放重定向等漏洞的破坏性手段。
该技术在我们2018年关于该主题的研究论文中得到了普及。 如果您对我们如何能够利用网络缓存中毒漏洞的详细说明感兴趣,请在“研究”页面上找到完整的文章。
要了解网络缓存中毒漏洞是如何产生的,对网络缓存的工作原理有基本的了解非常重要。
如果服务器必须分别对每个HTTP请求发送新的响应,则可能会使服务器过载,从而导致延迟问题和不良的用户体验,尤其是在繁忙时期。 缓存主要是减少此类问题的一种方法。
缓存位于服务器和用户之间,通常在固定的时间内保存(缓存)对特定请求的响应。 如果另一个用户随后发送了等效请求,则缓存将直接将缓存的响应的副本直接提供给用户,而无需后端进行任何交互。 通过减少服务器必须处理的重复请求的数量,这极大地减轻了服务器的负载。
当缓存接收到HTTP请求时,它首先必须确定是否存在可以直接服务的缓存响应,或者是否必须转发该请求以由后端服务器进行处理。 缓存通过比较请求组件的预定义子集(统称为“缓存密钥”)来标识等效请求。 通常,这将包含请求行和Host标头。 缓存密钥中未包含的请求组件被称为“非密钥”。
如果传入请求的缓存键与先前请求的键匹配,则缓存会认为它们是等效的。 结果,它将提供为原始请求生成的缓存响应的副本。 这适用于具有匹配缓存键的所有后续请求,直到缓存的响应到期为止。
至关重要的是,缓存将完全忽略请求的其他组件。 稍后,我们将更详细地探讨此行为的影响。
网络缓存中毒的影响在很大程度上取决于两个关键因素:
请注意,缓存条目的持续时间并不一定会影响网络缓存中毒的影响。 攻击通常可以以某种方式编写脚本,使其无限期地重新缓存中毒。
一般而言,构建基本的网络缓存中毒攻击涉及以下步骤:
任何网络缓存中毒攻击都依赖于对非键输入(例如标头)的操作。 当决定是否将缓存的响应提供给用户时,网络缓存会忽略未键入的输入。 此行为意味着您可以使用无键输入来注入有效负载并引发“中毒”响应,如果该响应被缓存,则将被提供给其请求具有匹配的缓存键的所有用户。 因此,构造网络缓存中毒攻击的第一步是识别服务器支持的非键输入。
您可以通过向请求添加随机输入并观察它们是否对响应产生影响来手动识别未键入的输入。 这很明显,例如直接在响应中反映输入,或触发完全不同的响应。 但是,有时效果更微妙,需要进行一些侦探工作才能弄清楚。 您可以使用Burp Comparer之类的工具来比较带有或不带有注入输入的响应,但这仍然需要大量的人工。
幸运的是,您可以通过从BApp商店向Burp添加Param Miner扩展程序来自动执行识别未键入输入的过程。 要使用Param Miner,只需在要调查的请求上单击鼠标右键,然后单击“猜测标题”。 然后,Param Miner在后台运行,从其广泛的内置标头列表发送包含不同输入的请求。 如果包含其注入的输入之一的请求对响应有影响,则Param Miner会将其记录在Burp中(如果正在使用Burp Suite专业版,则在“问题”窗格中),或者在扩展名的“输出”标签中(“ 如果您使用的是Burp Suite共享版,请使用“扩展程序”>“扩展程序”>“ Param Miner”>“输出”)。
注意:在实时网站上测试非关键输入时,存在无意间导致缓存将您生成的响应提供给真实用户的风险。 因此,重要的是要确保所有请求都具有唯一的缓存键,以便仅将它们提供给您。 为此,您可以在每次发出请求时向请求行手动添加一个缓存清除器(例如唯一参数)。 另外,如果您使用的是Param Miner,则可以使用一些选项自动将缓存破坏符添加到每个请求中。
识别出非关键输入后,下一步就是准确评估网站的处理方式。 理解这一点对于成功引发有害反应至关重要。 如果输入未正确清理就反映在服务器的响应中,或者用于动态生成其他数据,则这是网络缓存中毒的潜在入口点。
操纵输入以引起有害的响应是成功的一半,但是除非您可以使响应被缓存,否则它不会取得太大的成就,这有时可能很棘手。
是否缓存响应取决于所有因素,例如文件扩展名、内容类型、路由、状态代码和响应标头。 您可能需要花费一些时间来简单地处理不同页面上的请求并研究缓存的行为。 一旦确定了如何缓存包含恶意输入的响应,便可以将漏洞利用传递给潜在的受害者。
此基本过程可用于发现和利用各种不同的网络缓存中毒漏洞。 例如,您可以使用网络缓存中毒来:
有时,响应中提供的信息对于网络缓存中毒也很有用。 例如,Vary标头的内容可用于构造更有针对性的攻击实验室。 同样,缓存控制指令也可以提供有关缓存行为的信息。
通过组合多个标头实验室,您还可以暴露额外的漏洞层,甚至将不同的漏洞链接到实验室上,以升级网络缓存中毒攻击的影响。
防止网络缓存中毒的确定方法显然是完全禁用缓存。 尽管对于许多网站来说,这可能不是一个现实的选择,但在其他情况下,这可能是可行的。 例如,如果您仅使用缓存是因为在采用CDN时默认情况下启用了缓存,那么可能值得评估一下默认缓存选项是否确实反映了您的需求。
即使您确实需要使用缓存,将其限制为纯静态响应也是有效的,前提是您要充分警惕归类为“静态”的内容。 例如,确保攻击者不会欺骗后端服务器来获取其恶意版本的静态资源,而不是真正的恶意资源。
这也与有关网络安全的更广泛的观点有关。 现在,大多数网站在其开发过程和日常运营中都融入了多种第三方技术。 不管您自己的内部安全状况多么强大,一旦将第三方技术集成到您的环境中,您都将依赖其开发人员也像您一样关注安全性。 基于您只有最弱点的安全性,至关重要的是确保在集成之前充分了解任何第三方技术的安全隐患。
特别是在Web缓存中毒的情况下,这不仅意味着决定是否默认使缓存保持打开状态,而且还意味着例如查看CDN支持哪些标头。 由于攻击者能够操纵一系列晦涩的请求标头,因此暴露了上面讨论的一些Web缓存中毒漏洞,其中许多对于网站的功能都是完全不必要的。 同样,您可能没有意识到自己就遭受了这类攻击,这纯粹是因为您已经实现了某种默认情况下支持这些非键输入的技术。 如果网站不需要标题,则应将其禁用。
如果您无法简单地找到未键入的输入并将其禁用,则可以尝试在高速缓存层剥离输入或将其添加到高速缓存键。