在本节中,将讨论什么是Web缓存中毒,以及哪些行为会导致Web缓存中毒的漏洞,还将看看利用这些漏洞的方法,并建议如何减少对这些漏洞的暴露。
什么是Web缓存中毒?
Web缓存中毒是一种比较高级的技术,攻击者利用Web服务器和缓存行为,向其他用户提供有害的HTTP响应。
从本质上来说,Web缓存中毒包括两个阶段。
首先,攻击者必须弄清楚如何从后端服务器获取包含某种危险payload的响应。其次一旦成功,攻击者需要确保他们的响应被缓存,并随后提供给预期的受害者。
中毒的Web缓存可能是一种破坏性的手段,可以传播多种不同的攻击,比如XSS、JavaScript注入、开放重定向等漏洞。
Web缓存是如何工作的?
要了解Web缓存中毒漏洞是如何产生的,必须对Web缓存的工作原理有一个基本的了解。
如果某个服务器必须对每一个HTTP请求单独发送新的响应,这可能会使服务器过载,从而导致延迟问题和槽糕的用户体现,尤其是在繁忙时期。
缓存主要是减少此类问题的一种方法和手段。
缓存位于服务器和用户之间,通常在固定的时间内保存对特定请求的响应。
如果另一个用户发送了相同的请求,缓存会直接向用户提供缓存响应的副本,而不需要与后端进行任何交互。
这大大减轻了服务器的复旦,减少了它必须处理的重复请求的数量。
当缓存收到HTTP请求时,它首先要确定是否存在可以直接提供的缓存响应,或者是否必须转发请求以供后端服务器处理。
缓存通过比较请求组件的预定义子集,统称为“缓存键(cache key)”来识别等效请求。通常,这将包含请求行和主机头。请求中未包含在缓存键中的组件被称为"unkeyed"。
如果传入请求的缓存键与前一个请求的缓存键相匹配,那么缓存认为它们就是等价的。因此,它将把原始请求生成的缓存响应作为副本发送给后一个请求。这个副本适用于所有匹配缓存键的后续请求,直到缓存响应过期。
这里有点特别重要,请求的其他部分会被缓存完全忽略,后面会更详细地探讨这种行为的影响。
Web缓存中毒攻击会造成什么影响?
Web缓存中毒的影响在很大程度上取决于两个关键因素:
●攻击者能够获得什么缓存?
由于缓存中毒更多的是一种传播手段,而不是独立的攻击,Web缓存中毒的影响与注入的payload危害程度密不可分。与大多数攻击一样,Web缓存中毒也可以与其他攻击结合使用,使潜在的影响进一步升级。
●受影响页面的流量
中毒响应将仅提供给在缓存中毒时访问受影响页面的用户。因此,可能会不存在任何影响,也可能会导致巨大影响,这取决于页面有多少人来访问。如果攻击者毒害了网站主页上的缓存响应,那么这个攻击可能会影响数千名用户,而无需攻击者进行后续交互。
除了上面两个因素外,缓存的持续时间不一定会影响Web缓存中毒的影响,因为攻击者通常可以通过脚本的方式,无期限的重复刷新毒害缓存。
如何构建一个Web缓存中毒?
通常来说,构建一个基本的Web缓存中毒攻击包括三个步骤:
●识别和评估"unkeyed"组件的输入
●从后端服务器引出有害的响应
●获取被缓存的响应
识别和评估"unkeyed"组件的输入
所有Web缓存中毒攻击都依赖于对"unkeyed"(比如标头等)的操纵,当决定是否向用户提供缓存响应时,Web服务器会忽略"unkeyed"的输入。这种行为意味着可以使用"unkeyed"部分来注入payload从而引发“中毒”响应。如果服务器缓存了这个响应,那么就会向所有匹配缓存键的请求提供这个响应。
因此,构建Web缓存中毒攻击的第一步是识别服务器所支持的"unkeyed"输入。
可以通过BAPP中的Param Miner插件来自动识别"unkeyed"输入,在需要调查的请求上点击右键,然后点击"Guess headers",这个插件就会发送包含不同的输入请求,如果某个包含其注入输入的请求对响应有影响,就会被记录下来。
例如,在下面的截图中,Param Miner在网站的主页上发现了一个"unkeyed"的标头X-Forwarded-Host
不过要注意的是,当在真实场景中测试"unkeyed"输入时,有可能无意中缓存会将我们生成的响应提供给真实的用户。因此,一定要在每个请求中都有一个唯一的缓存键,这样缓存才会把响应提供给我们。可以通过每次发出请求时,在请求行中添加一个缓存破坏者(比如唯一的参数),如果使用Param Miner,在选项中也可以配置。
从后端服务器引出有害的响应
一旦确定了"unkeyed"输入,下一步就是评估网站是如何处理它的。了解这一点对于成功引发有害反应至关重要。如果一个输入没有经过适当的消毒就反应在服务器的响应中,或者是被用于动态生成其他数据,那么这就是Web缓存中毒的潜在入口。
获取被缓存的响应
操纵输入引发有害的响应是成功的一般,如果响应没有被缓存就不会有太大的效果。
是否缓存响应取决于各种隐私,如文件扩展名、内容类型、路由、状态码和响应标头。可能需要花费一些实践来处理不同页面上的请求,并研究缓存的行为。
一旦指导如何获取包含恶意输入的响应缓存,就可以向潜在的受害者进行攻击了。
如何防止Web缓存中毒?
防止Web缓存中毒最根本的方法显然是完全禁用缓存。
对许多网站来说,这不可能是一个选项,但在某些情况下,可能是可行的。
例如,如果只是因为采用了CDN时默认开启了缓存而使用它,那么可以评估下默认的缓存选项是否是一定需要的。
即使确实需要使用缓存,将其限制为纯静态响应也是可以的,前提是能够分类出来哪些是“静态”的。例如,确保攻击者不能欺骗后端服务器检索他们的恶意版本的静态资源。
这也会涉及到更宽泛的网络安全问题。现在,大多数网站在开发过程和日常运营中都加入了各种第三方技术。无论内部安全态势多强大,只要将第三方技术合并到环境中,就需要依靠它的开发人员具有安全意识,因此在集成任何第三方技术之前,务必充分了解其安全影响至关重要。
具体到Web缓存中毒,就不仅仅意味着要决定是否开启缓存,还要看CDN支持哪些标头。由于攻击者能够操纵一系列模糊的请求头,因此暴露了上面讨论的几个Web缓存中毒的漏洞,其中许多请求对于网站的功能来说是完全不必要的。
同样,可能会在没有意识到的情况下暴露在这些攻击中,纯粹是因为实施了一些默认支持这些"unkeyed"的技术。如果站点工作不需要标头,则应该禁用它们。
在实施缓存时,还应该采取下面的预防措施:
●如果出于性能原因考虑从缓存键中排除某些内容,那么就改为重写请求。
●不要接收过大的GET请求,在默认情况下,某些第三方技术可能允许这么做。
●修补客户端漏洞,即使他们看起来无法被利用。由于缓存行为中不可预测的异常,其中一些漏洞实际上可能是可以利用的。
SQL注入攻击-检索隐藏的数据
HTTP Host头漏洞攻击-概念梳理
原文始发于微信公众号(H君网安白话):Web缓存中毒-概念梳理
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论