什么是web缓存投毒(web cache poisoning)
Web缓存投毒是利用Web服务器和缓存的行为,将有害的HTTP响应提供给其他用户。
Web缓存投毒分为两个阶段:
- 攻击者必须弄清楚如何从无意中包含某种危险payload的后端服务器引起响应。
- 成功后,他们需要确保将他们的响应缓存起来并随后提供给预期的受害者。
有毒的Web缓存有可能成为变成多种不同攻击,利用XSS,JavaScript注入,开放重定向等漏洞的破坏性手段。
Web缓存工作原理
如果服务器必须分别对每个HTTP请求发送新的响应,则可能会使服务器过载,从而导致延迟问题和不良的用户体验,尤其是在繁忙时期。缓存主要是减少此类问题的一种方法。
缓存位于服务器和用户之间,通常在固定的时间内保存(缓存)对特定请求的响应。如果另一个用户随后发送了等效请求,则缓存将直接将缓存的响应的副本直接提供给用户,而无需后端进行任何交互。通过减少服务器必须处理的重复请求的数量,这极大地减轻了服务器的负载。
缓存键
当cache接收到HTTP请求时,首先需要进行确定是可以直接发送缓存响应还是需要将请求发送给服务器进行响应。
cache通过比较请求组件的预定义子集(“cache key”)来识别等效请求。
这个包含请求行和Host标头,未包括在缓存键中的请求组件为 unkeyed
。
如果传入请求的缓存键与先前请求的键匹配,则缓存会认为它们是等效的。这时会将缓存中的响应发给后面的请求。
在这里重要的是缓存将会忽略请求的其他组件(unkeyed)。这个行为会产生巨大的漏洞。
Web缓存投毒攻击产生的影响
Web缓存投毒的影响在很大程度上取决于两个关键因素:
-
攻击者可以成功地成功缓存什么
由于投毒的缓存更多是一种分发手段,而不是独立的攻击,因此Web缓存投毒的影响与注入的payload的危害密不可分。与大多数攻击一样,Web缓存投毒也可以与其他攻击结合使用,以进一步扩大潜在影响。
-
受影响页面上的通信量
仅当缓存投毒时,投毒响应才会提供给访问受影响页面的用户。结果,根据页面是否受欢迎,影响可能从不存在到严重不等。例如,如果攻击者设法破坏了主要网站主页上缓存的响应,则该攻击可能会影响成千上万的用户,而无需攻击者进行任何后续交互。
构造Web缓存投毒攻击
攻击步骤:
- 识别和评估非关键输入
- 引起后端服务器的有害响应
- 获取响应缓存
识别和评估非关键输入
缓存投毒攻击依赖于对unkeyed
的操作。在cache中进行判别是否由缓存进行响应时会忽略 unkeyed
的输入。因此我们可以使用 unkeyed
输入进行注入payload来引发投毒响应,如果改响应被缓存,就会提供给具有匹配的 cache key
的其他用户。
通过向请求中添加随机输入并对响应进行观察是否被影响来进行识别非关键输入。
引起后端服务器的有害响应
识别出非关键输入后,下一步就是准确评估网站的处理方式。理解这一点对于成功引发有害反应至关重要。如果输入未正确清理就反映在服务器的响应中,或者用于动态生成其他数据,则这是Web缓存投毒的潜在入口点。
获取响应缓存
操纵输入以引起有害的响应是成功的一半。是否缓存响应取决于所有因素,例如文件扩展名,内容类型,路由,状态代码和响应标头。需要花费一些时间来简单地处理不同页面上的请求并研究缓存的行为。一旦确定了如何缓存包含恶意输入的响应,便可以将漏洞利用传递给潜在的受害者。
利用Web缓存投毒漏洞
可以使用web缓存投毒来进行:
- XSS攻击
- 利用对资源的不安全导入
- 利用cookie处理漏洞
- 利用基于DOM的漏洞