解析针对 HTTP/2 协议的不同步攻击(下)
2021-09-09 12:45:00 Author: www.4hou.com(查看原文) 阅读量:64 收藏

导语:HTTP/2 (原名HTTP/2.0)即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。

3461-article-http2-pub-article.jpg

HTTP / 2利用原语

接下来,让我们看看一些HTTP/2利用原语,本节不提供完整的案例研究。

模糊性和 HTTP/2

在HTTP/1中,重复标头对于各种攻击都有用,但不可能发送具有多个方法或路径的请求。HTTP/2决定用伪headers替换请求行,这意味着这现在是可能的。我观察到接受多个 :path 标头的真实服务器,并且服务器实现在它们处理的 :path 中不一致:

35.png

此外,尽管 HTTP/2 引入了 :authority 标头来替换 Host 标头,但 Host 标头在技术上仍然是允许的。事实上,据我所知,两者都是可选的。这为 Host-header 攻击创造了充足的机会,例如:

36.png

URL前缀注入

HTTP/2的另一个不能忽略的特性是:scheme伪标头,这个值意味着'http'或'https',但它支持任意字节。

包括 Netlify 在内的一些系统使用它来构建 URL,而不执行任何验证。这使你可以覆盖路径,并在某些情况下执行缓存攻击:

37.png

其他人使用该方案构建请求路由到的 URL,从而创建 SSRF 漏洞。

与本文中使用的其他技术不同,即使目标没有进行 HTTP/2 降级,这些漏洞也会起作用。

标题名称拆分

你会发现有些服务器不允许你在标题名称中使用换行符,但允许使用冒号。由于在降级过程中末尾会附加冒号,这很少启用完全不同步:

38.png

它更适合 Host-header 攻击,因为 Host 应该包含一个冒号,并且服务器通常会忽略冒号之后的所有内容:

39.png

请求行注入

我确实找到了一台服务器,其中标头名称拆分启用了不同步。在测试中,漏洞消失了,服务器横幅报告说他们已经更新了他们的 Apache 前端。为了追踪这个漏洞,我在本地安装了旧版本的Apache。不过我无法复制这个漏洞。

Apache 的 mod_proxy 允许在 :method 中使用空格,从而启用请求行注入。如果后端服务器容忍请求行末尾的垃圾,这可以让你绕过阻止规则:

40.png

逃避子文件夹:

41.png

我在5月11日报告给Apache,他们在24小时内确认,预留CVE-2021-33193,并说2.4.49会修复此问题。不幸的是,在这篇白皮书发布的时候——Apache被告知这个漏洞86天之后——2.4.49还没有出来,所以尽管master上有一个补丁,但实际上这是一个零日。作为缓解措施,你可以禁用HTTP/2。

标头篡改Wrap

HTTP/1.1曾经有一个可爱的功能叫做行折叠,你可以在标头值后面加上一个空格,随后的数据就会被折叠起来。

下面是一个正常发送的相同请求:

42.png

使用行转移:

43.png

该功能后来被弃用,但许多服务器仍然支持它。

如果你发现一个网站的 HTTP/2 前端允许你发送以空格开头的标头名称,而后端支持换行,则你可以篡改其他标头,包括内部标头。这是我篡改了内部标头请求 ID 的示例,它是无害的,但在后端反映了有用的信息:

44.png

许多前端不会对传入的标头文件进行排序,所以你会发现通过移动空格标头,你可以篡改不同的内部和外部标头文件。

在结束之前,让我们来看看在利用 HTTP/2 时你可能会遇到的一些陷阱和挑战。

隐藏的HTTP / 2

由于HTTP/2和HTTP/1共享同一个TCP端口,客户端需要一些方法来确定要使用哪个协议。当使用TLS时,大多数客户端默认使用HTTP/1,只有当服务器在TLS握手期间通过ALPN字段明确地发布对HTTP/2的支持时,才使用HTTP/2。一些支持HTTP/2的服务器忘记宣传这一事实,导致客户端只与他们使用HTTP/1,从而隐藏了有价值的攻击面。

幸运的是,这很容易检测到,只要忽略ALPN并尝试发送HTTP/2请求即可。你可以使用HTTP请求走私者,Burp扫描仪,甚至卷发来扫描这个场景:

45.png

HTTP/2在一个连接上支持多个请求上投入了大量的精力,但是,有几个常见的实现陷阱需要注意。

一些服务器以不同的方式处理每个连接上的第一个请求,这可能导致漏洞出现间歇性甚至完全丢失。在其他服务器上,有时请求会破坏连接而不会导致服务器将其断开,从而默默地影响所有后续请求的处理方式。

如果你发现这些问题中的任何一个,你可以使用 Burp Repeater 中的“启用 HTTP/2 连接重用”选项和 Turbo Intruder 中的 requestsPerConnection 设置来缓解它们。

这项研究之所以成为可能,是因为在开发攻击性 HTTP/2 工具包方面进行了大量投资。 HTTP/2 的二进制格式意味着你不能使用经典的通用工具,如 netcat 和 openssl。 HTTP/2 的复杂性意味着你无法轻松实现自己的客户端,因此你需要使用库,现有的库没有给用户发送格式错误的请求的基本能力。

我通过编写自己的精简的、开源的HTTP/2堆栈开始了这项研究,并将其集成到 Turbo Intruder 中来开始这项研究。要调用它,请将 engine=Engine.THREADED 更改为 engine=Engine.HTTP2。它将 HTTP/1.1 格式的请求作为输入,然后将它们重写为 HTTP/2。在重写期间,它会在标头文件上执行一些字符映射,以确保本演示中使用的所有技术都是可能的:

46.png

你也可以通过将它们指定为伪HTTP/1.1标头来覆盖伪标头,下面是一个使用前面提到的Apache漏洞的示例:

47.png

Turbo Intruder 的 HTTP/2 堆栈目前对异常服务器行为的容忍度不是很高。如果你发现它不适用于某个目标,我建议你尝试使用 Burp Suite 的原生 HTTP/2 堆栈。这是经过更多实战测试的,你可以通过 Engine.BURP2 从 Turbo Intruder 中调用它。

为了帮助你扫描这些漏洞,我发布了 HTTP Request Smuggler 的重大更新。该工具找到了本文中提到的所有案例研究。我还确保 Burp Suite 的扫描程序可以检测到这些漏洞。请注意,其中许多功能依赖于 Burp Suite Pro/Community 2020.8 中引入的新 API。例外是 Turbo Intruder 的 HTTP/2 堆栈,它甚至可以用作命令行工具或库。

Burp Suite

我还帮助将 HTTP/2-exclusive 攻击的支持直接集成到 Burp Suite 中。 Burp Suite 已经对 H/2 提供基本支持大约一年了,通过 H/1 样式视图实现,该视图执行基本规范化(如小写标题名称)以避免有效的 H/1 请求被转换为无效的 H/ 2 请求。

H/1 样式的视图对于协议不相关的常规攻击很方便,因此我们将其大致保持原样,但已采取措施使规范化可见。

但是,许多 H/2 独占攻击无法用 H/1 样式的语法表达,因此我们通过 Inspector 侧边栏在 Burp Suite 2021.8 中添加了对这些攻击的支持。 Inspector 视图现在可以准确地表示 H/2 请求,包括伪标头,并允许你执行高级攻击,例如在标头中使用换行符或在路径中使用空格。如果使用 H/1 样式语法根本无法表示请求,我们将其声明为 'kettled'并隐藏 H/1 视图。

缓解措施

如果你正在设置 Web 应用程序,请避免 HTTP/2 降级,这是大多数这些漏洞的根本原因。相反,使用 HTTP/2 端到端。

如果你正在编码一个HTTP/2服务器,特别是支持降级的服务器,强制执行HTTP/1中存在的字符集限制,拒绝标头中包含换行符、标头名称中包含冒号、请求方法中包含空格的请求,等等。另外,请注意规范并不总是明确指出哪里可能出现漏洞。如果跳过某些未标记的需求,将使你的功能服务器存在严重漏洞。

本文翻译自:https://portswigger.net/research/http2如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/6Ggz
如有侵权请联系:admin#unsafe.sh