hacktricks/pentesting-web/http-request-smuggling/request-smuggling-in-http-2-downgrades.md
2023-08-03 19:12:22 +00:00

9.3 KiB
Raw Blame History

HTTP/2降级中的请求劫持

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

起源

这个漏洞的主要起源是反向代理将使用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 Header劫持

这与之前的技术完全相同但是通过检查请求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的连接重用连接(对于这种类型的攻击来说是相当严重的限制)。

在最严格的限制(不重用连接)下,你将使用基于时间的技术检测到漏洞,但在测试时你会发现这是一个“误报”。

隧道确认

一种确认端点是否存在漏洞但连接位于隧道内的方法是将两个完整请求伪装成一个。

HTTP/1.1的问题在于,如果你收到两个HTTP响应,你无法确定端点是否存在漏洞,或者**“伪装”请求是否只被视为常规请求**。

然而,这种技术可以在HTTP/2中使用,因为如果端点存在漏洞并且你伪装了一个请求,你将在来自反向代理的响应中看到对伪装请求的响应头:

隧道视野问题

如果合法请求的响应包含Content-Length,反向代理只会读取指定的字节数,而不会读取更多,因此你无法读取伪装请求的响应

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

通过隧道泄露内部头部信息

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

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

{% hint style="info" %} 使用此攻击针对Web的不同部分方法、路径等可能导致使用不同的后端,并泄露不同的敏感信息 {% endhint %}

通过隧道进行缓存污染

在这种情况下,发送一个HEAD请求到URL该URL的缓存将被污染,同时伪装一个请求,其响应内容将包含有效负载可能是一些XSS有效负载

由于HEAD响应包含Content-Type: text/html,并且反向代理认为伪装请求的整个响应是HEAD请求的正文即使页面不容易受到XSS攻击XSS有效负载也将被视为HTML

隐藏的HTTP/2

通常服务器通过TLS握手中的ALPN字段来广告其支持但有些服务器不会这样做。

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

工具

参考资料

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥