解析针对 HTTP/2 协议的不同步攻击(下) - 嘶吼 RoarTalk – 网络安全行业综合服务平台,4hou.com

解析针对 HTTP/2 协议的不同步攻击(下)

luochicun 技术 2021-09-09 11:45:00
243350
收藏

导语: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如若转载,请注明原文地址
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论

 
本站4hou.com,所使用的字体和图片文字等素材部分来源于原作者或互联网共享平台。如使用任何字体和图片文字有侵犯其版权所有方的,嘶吼将配合联系原作者核实,并做出删除处理。
©2022 北京嘶吼文化传媒有限公司 京ICP备16063439号-1 本站由 提供云计算服务