16 KiB
缓存投毒和缓存欺骗
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥
- 你在一家网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品The PEASS Family
- 获取官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组或关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。
使用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响应,因此发送错误的授权标头尝试访问S3或Azure存储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
的内容类型,而不是.css_文件的预期text/css
MIME类型。
在这里了解如何通过滥用HTTP请求伪造来执行滥用HTTP请求伪造进行缓存欺骗攻击。
参考资料
- https://portswigger.net/web-security/web-cache-poisoning
- https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities
- https://hackerone.com/reports/593712
- https://youst.in/posts/cache-poisoning-at-scale/
- https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9
使用Trickest可以轻松构建和自动化由全球最先进的社区工具提供支持的工作流程。
立即获取访问权限:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 你在一家网络安全公司工作吗?想要在HackTricks中看到你的公司广告吗?或者想要获取PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品——The PEASS Family
- 获取官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组,或者关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。