hacktricks/pentesting-web/http-request-smuggling/request-smuggling-in-http-2-downgrades.md

8.6 KiB
Raw Blame History

HTTP/2 降级中的请求走私

从零开始学习 AWS 黑客攻击直到成为英雄 htARTE (HackTricks AWS 红队专家)

支持 HackTricks 的其他方式:

起源

这个漏洞的主要来源是反向代理将使用 HTTP/2客户端通信,然后将该通信转换为与后端服务器HTTP/1.1

这种方法的问题在于,用户将能够在HTTP/2 通信注入不必要的头部,这些头部可能不会被代理检查。但是,当这些头部在 HTTP/1.1 通信盲目注入时,可以执行请求走私攻击

示例

H2.CL Desync

HTTP/2 规范指出Content-Length 头部不是必需的,但可以指示。因此,反向代理处理用户发送的所有内容作为请求,但是,当降级到 HTTP/1.1时,这个头部将被注入请求中,因此,后端将把请求视为两个不同的请求,如下图所示:

H2.TE Desync URL Token 劫持

HTTP/2 规范还指出,包含特定于连接的头部字段的任何消息必须被视为格式错误的...但如果你不遵循这个规则,你就会变得脆弱

这种技术在 AWS 负载均衡器上被滥用,因此确保用户访问一个指向攻击者控制的服务器的 Host 头部将使他们访问该服务器。

H2.TE Desync 头部劫持

这与之前的技术完全相同但在检查请求时James 注意到客户要求将他们的凭据发送给他,所以他只是修改了他的服务器,允许 CORS 将人们的凭据发送给他:

H2.TE 通过请求头部注入

HTTP/2 也不允许在头部中放置不允许的字符,但如果服务器不遵守这个规则,你可以在通信降级到 HTTP/1.1 时注入任意头部

在这种情况下注入了 Transfer-Encoding 头部

H2.TE 通过头部名称注入

HTTP/2 在某些服务器上允许你在头部名称中放置冒号,并且通过冒号你可以像这样在头部名称中注入一个新的头部:

注意,如果你只放置换行字符发送一个没有内容的头部,请求将被视为无效

H2.TE 通过请求行注入

在这种情况下,注入是在请求行内执行的:

URL 前缀注入

在 HTTP/2 连接的方案中,你可能能够发送一个完整的 URL它将覆盖路径中指示的 URL

通过空格进行请求行注入

前端->后端连接复用

有时你会发现,在执行 HTTP 请求走私攻击时你只能攻击自己。这可能是因为反向代理决定对每个 IP 使用不同的与后端的连接

注意,即使有这个限制,你仍然可以执行像授权绕过、内部头部泄露以及缓存欺骗和缓存投毒攻击。

通常这种限制不存在,所以你可以将请求走私到其他人正在使用的反向代理和后端之间的连接中,但甚至有可能代理甚至不会重用来自同一 IP 的连接(对这种攻击来说是相当严重的限制)。

在最严重的限制(不复用连接)中,你会使用基于时间的技术检测到漏洞,但在测试时你会发现它是一个“假阳性”。

隧道确认

一种确认端点是否脆弱但连接在“隧道”内的方法是将 2 个完整的请求走私进 1 个。

HTTP/1.1问题在于,如果你收到 2 个 HTTP 响应,你不知道端点是否脆弱,或者它不是,而**“走私”的请求只是被当作常规请求处理**。

然而,这种技术可以在 HTTP/2 中使用,因为如果端点脆弱并且你走私了一个请求,你将在反向代理的响应中看到对走私请求的响应的头部

隧道视觉问题

可能还有另一个问题,如果对合法请求的响应包含Content-Length,那么反向代理只会读取那里指定的字节数,不再多读,所以你将无法读取来自走私请求的响应

然而,HEAD 请求不包含正文,但它通常包含 Content-Length,就像请求是 GET 请求一样。因此,发送一个HEAD 请求而不是 POST 请求,你可以读取走私请求响应的 HEAD Content-Length 字节。

通过隧道泄露内部头部

如果你在应用程序内找到一个POST 参数,其内容将在响应反映,那么你可以尝试在 HTTP/2 请求头部中注入 HTTP/1.1 \r\n 字符,这样代理新注入的头部将被附加在将在响应中反映的 POST 参数中:

注意,在这种情况下,攻击者只关心对第一个请求的响应,他不需要读取对走私的无效第二个请求的请求。

{% hint style="info" %} 使用这种攻击针对网页的不同部分(方法、路径...可能会导致使用不同的后端,并且泄露不同的敏感信息 {% endhint %}

通过隧道进行缓存投毒

在这种情况下,发送一个HEAD 请求到URL其缓存将被投毒,同时走私一个请求,其响应内容将包含有效载荷(可能是某些 XSS 有效载荷)。

由于HEAD 响应包含 Content-Type: text/html,并且因为反向代理认为对走私请求的整个响应是 HEAD 请求的正文,XSS 有效载荷将被视为 HTML,即使页面没有对 XSS 脆弱。

隐藏的 HTTP/2

通常服务器通过 TLS 握手中的 ALPN 字段宣布支持,但有些不是。

可以使用 curl --http2 --http2-prior-knowledge 轻松检测。

工具

参考

从零开始学习 AWS 黑客攻击直到成为英雄 htARTE (HackTricks AWS 红队专家)

支持 HackTricks 的其他方式: