9.3 KiB
HTTP/2降级中的请求劫持
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥
- 你在一家网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品The PEASS Family
- 获取官方PEASS和HackTricks周边产品
- 加入💬 Discord群组 或 Telegram群组 或 关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。
起源
这个漏洞的主要起源是反向代理将使用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
轻松检测到。
工具
- Burp扩展:HTTP请求劫持
- https://github.com/neex/http2smugl
参考资料
- 这个演讲完美地解释了这里提到的所有技术:https://www.youtube.com/watch?v=rHxVVeM9R-M
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 你在一家网络安全公司工作吗?你想在HackTricks中为你的公司做广告吗?或者你想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFT收藏品The PEASS Family
- 获取官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组,或在Twitter上关注我🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。