Web缓存投毒笔记
个人总结
参考:https://portswigger.net/web-security/web-cache-poisoning
- name: 个人总结
desc: 参考:https://portswigger.net/web-security/web-cache-poisoning
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# Web缓存投毒笔记
# 1Web缓存基本知识
# 1、Web缓存的工作原理
答案
缓存位于服务器和用户之间,它保存(也称缓存)对特定请求的响应,这通常会被缓存在一段固定的时间点。
如果另一个用户随后发送了一个等效请求,则缓存直接向用户提供缓存响应的副本,而无需与后端进行任何交互。
这减少了服务器必须处理的重复请求数,极大地减轻了服务器的负载。
# 2、缓存键是什么?
答案
- 当缓存收到一个 HTTP 请求时,它首先必须确定,是否有一个可以直接提供的缓存响应,或者是否必须转发该请求 以供后端服务器处理。
- 缓存通过比较请求组件的预定义子集(统称为 “缓存键”)来识别等效请求。通常,这将包含请求行和
Host
标头。 - 如果某个请求的缓存键 未被包含在缓存当中,则称为 “无键”(unkeyed)。
- 如果传入请求的 缓存键 与前一个请求的键匹配,则缓存会认为它们是等效的。因此,它将提供为原始请求生成的缓存响应副本。这适用于 具有匹配缓存键 的所有后续请求,直到缓存的响应过期。
- 当匹配到缓存键之后,缓存会完全忽略请求的其他组成部分。
# 2Web缓存投毒基本知识
# 1、Web缓存投毒是什么?
答案
攻击者可以借助 Web 服务器和缓存的行为,向其他用户提供有害的 HTTP 响应。
# 2、Web缓存投毒涉及哪两个阶段?
答案
- 从后端服务器引出一个 包含某种危险有效载荷 的响应。
- 成功引出响应之后,需要确保这些响应已经被缓存,并在随后的过程中提供给预期的受害者。
# 3、Web缓存投毒攻击的危害?
答案
Web 缓存投毒的影响,在很大程度上取决于两个关键因素:
- 攻击者究竟可以成功缓存什么。由于缓存投毒更像是一种分发攻击的手段,而不是一种独立的攻击,因此 Web 缓存投毒的影响与所注入的载荷危害程度密不可分。与大多数类型的攻击一样,Web 缓存投毒也可以与其他攻击结合使用,以进一步升级潜在的影响。
- 受影响网页的流量。在缓存投毒时,被投毒的响应 仅提供给 访问了受影响页面的用户。因此,影响范围飘忽不定,具体取决于这个页面的受欢迎程度。例如,如果攻击者设法毒害了一个 主要网站 的首页缓存响应,则该攻击可能会自动影响数千名用户,而无需攻击者进行任何后续交互。
# 4、构造Web缓存投毒攻击的三个步骤?
答案
- 识别和评估无键(unkeyed)的输入。
- 从后端服务器引出有害响应。一旦你发现了一个无键的输入,下一步就是评估网站是如何处理它的。了解这一点对于 成功地引发有害响应 至关重要。如果一个输入没有经过适当的清理,就反馈在来自服务器的响应中,或者被用来动态生成其他数据,那么这就是 Web 缓存投毒的潜在入口点。
- 获取缓存的响应。“是否缓存响应” 可能取决于各种因素,例如文件扩展名、内容类型、路由、状态代码和响应标头。你可能需要花一些时间,来简单地处理不同页面上的请求,并研究缓存的行为方式。一旦你弄清楚了 如何缓存包含恶意输入的响应,你就可以将漏洞利用传递给潜在的受害者了。
# 5、为什么要识别和评估无键(unkeyed)的输入?
答案
任何 Web 缓存投毒攻击都依赖于对无键输入(如标头)的操纵。
Web 缓存在决定是否向用户提供缓存响应时,会忽略无键的输入。此行为意味着,你可以使用它们来注入有效载荷并引发 “投毒” 的响应,如果该响应被缓存,则稍后该响应将被提供给 请求中具有匹配缓存键 的所有用户。
因此,构建 Web 缓存投毒攻击的第一步是,识别服务器支持哪些无键输入。
# 6、如何快速识别无键的输入?
答案
你可以从 BApp 商店将 Param Miner (opens new window) 扩展添加到 Burp 中,从而自动识别无键的输入。
要使用 Param Miner,你只需右键单击想要调查的请求,然后单击 “Guess header”(猜测标头)。然后,Param Miner 将在后台运行,使用其大量的内置标头列表,生成并发送具有不同输入的请求。如果其注入的某个请求 对响应有影响,Param Miner 会将其记录在 Burp 中。
# 3利用Web缓存投毒 - 缓存设计缺陷
# 1、缓存设计缺陷是什么?
答案
如果网站以不安全的方式处理无键输入,并允许缓存后续的 HTTP 响应,则容易受到 Web 缓存投毒的影响。此漏洞可用于传递各种不同的攻击。
# 2、缓存设计缺陷的攻击手段
答案
- 通过 Web 缓存投毒实现 XSS 攻击
- 通过 Web 缓存投毒来利用资源导入的不安全处理
- 通过 Web 缓存投毒来利用 Cookie 处理漏洞
- 使用多个标头利用 Web 缓存投毒漏洞
- 利用暴露过多信息的响应(例如缓存控制标头
Age
、Cache-Control
、Vary
等) - 通过 Web 缓存投毒实现基于 DOM 的漏洞
- 链接 Web 缓存投毒漏洞
# 3利用Web缓存投毒 - 缓存实现缺陷
# 1、缓存实现缺陷是什么?
答案
Host
标头和请求行,这两个请求组件几乎总是被包含在缓存键中。不同的Host
标头和请求行,会引发不同的缓存响应。这使得它们不可能用于缓存投毒。
然而,经过仔细观察,我们会发现这些值经常被解析、转换和规范化,从而引入了些许差异,使得我们可以利用这些漏洞。这些差异源于危险但故意的功能,一直到解析错误和幼稚的逃逸问题,这些问题让我们能够使完全不同的请求发生冲突。
利用之后,不同的Host
标头和请求行,会引发相同的缓存响应。
# 2、缓存设计缺陷 和 缓存实现缺陷 之间的区别?
答案
- 缓存设计缺陷是 缓存功能本身 存在的一种缺陷,这是一种直接的利用方法,因此对所有缓存的影响都是一样的。
- 缓存实现缺陷是 某些网站在应用缓存系统时 引入了些许解析差异(在本项研究中主要指的是 “缓存键生成方式的缺陷”),导致部分站点受到影响。
# 3、缓存实现缺陷(缓存键缺陷)的原理?
答案
例如,假设Host
标头被包含在缓存键中,但对于Host: vulnerable-website.com:1337
,缓存系统 和 应用程序使用了不同的处理方式,引入了些许差异:
- 缓存系统排除了端口,只将域名
vulnerable-website.com
作为缓存键 - 而应用程序接受了域名和端口
vulnerable-website.com:1337
,并将其用作处理
这个差异导致,不管你是请求Host: vulnerable-website.com
还是Host: vulnerable-website.com:1337
,都会收到同一个缓存响应。
简而言之,虽然Host
标头是一个缓存键,但缓存系统转换它的方式 允许我们将有效载荷 传递到应用程序中,同时,映射到其他用户请求的 “正常” 缓存键仍然会被保留。原理展示:探测键处理
# 4、缓存实现缺陷中的缓存探测方法?
答案
与经典的 Web 缓存投毒方法略有不同。这些较新的技术依赖于 缓存的特定实现方式和配置中的缺陷,这些缺陷可能因站点而异。这意味着,你需要更深入地了解目标缓存及其行为。该方法包括以下步骤:
- 识别合适的缓存预言机(一个页面或端点,提供有关缓存行为的反馈)
- 探测键处理(手动调查该缓存,在生成缓存键时,目标系统是否对输入执行了任何附加处理)
- 识别可利用的Gadgets(用这个缓存键缺陷来链接漏洞)
# 5、缓存实现缺陷的攻击手段
答案
- 无键端口
- 如果目标站点基于
Host
标头来动态生成重定向的 URL,则可以添加无效端口号,构建 DoS 攻击 - 如果网站允许你指定非数字端口,则此类攻击可能会进一步升级。例如,你可以使用它来注入 XSS 有效载荷。
- 如果目标站点基于
- 无键查询字符串(整个查询字符串都从缓存键中被排除)
- 无键查询参数(只排除某些特定参数)
- 缓存参数伪装
- 参数解析的差异(例如 Rails 框架支持使用
&
和;
来分隔请求参数) - 畸形
GET
请求(目标网站接受具有正文的GET
请求) - 畸形
GET
请求(使用诸如X-HTTP-Method-Override
的标头来覆盖默认请求方法) - 利用资源导入中的动态内容
- 参数解析的差异(例如 Rails 框架支持使用
- 缓存键规范化(有编码 和 无编码的响应,共用同一个缓存键)
- 缓存键注入(键控组件被捆绑在查询字符串中)
- 内部缓存投毒
# 4如何防范Web缓存投毒漏洞
答案
- 完全禁用缓存。
- 将缓存限制为纯静态响应。
- 检查 CDN 以及其他默认设置,禁用不需要的请求标头。
- 在实现缓存时,还应采取以下预防措施:
- 如果出于性能原因,想要从缓存键中排除某些内容,请重写整个请求。
- 不要接受畸形
GET
请求。请注意,默认情况下,某些第三方技术可能允许此操作。 - 修补客户端漏洞,即使它们看起来不可利用。由于缓存行为中的不可预测的异常,其中一些漏洞实际上可能是可利用的。这只是一个时间问题,当有人发现一个解析差异时,无论是基于缓存还是其他方式,都可能使这个漏洞被利用。