7.9 KiB
HTTP 响应串联 / Desync
从零开始学习 AWS 黑客技术 htARTE(HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
- 如果您想看到您的公司在 HackTricks 中被广告,或者下载 HackTricks 的 PDF 版本,请查看订阅计划!
- 获取官方 PEASS & HackTricks 商品
- 探索PEASS 家族,我们的独家NFTs
- 加入 💬 Discord 群组 或 电报群组 或在 Twitter 🐦 @carlospolopm** 上关注我们**。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享您的黑客技巧。
本文技术取自视频: https://www.youtube.com/watch?v=suxDcYViwao&t=1343s
HTTP 请求队列异步
首先,这种技术滥用了 HTTP 请求串联漏洞,因此您需要了解这是什么:
这种技术与常见的 HTTP 请求串联的主要区别在于,不是通过向受害者的请求添加前缀来攻击,而是泄露或修改受害者接收到的响应。这是通过发送两个完整请求以异步代理响应队列,而不是发送一个半请求来滥用 HTTP 请求串联来实现的。
这是因为我们将能够异步响应队列,使得受害者的合法请求的响应被发送给攻击者,或者通过在响应中注入攻击者控制的内容。
HTTP 管道异步
HTTP/1.1 允许请求不需要等待之前的资源。因此,如果中间有代理,则代理的任务是维护与发送到后端的请求和来自后端的响应的同步匹配。
然而,存在一个问题,即异步响应队列。如果攻击者发送了一个 HTTP 响应串联攻击,并且对初始请求和串联请求的响应立即响应,则串联响应不会被插入到受害者响应队列中,而将被丢弃为错误。
因此,需要串联请求花费更多时间在后端服务器中处理。因此,当串联请求被处理时,与攻击者的通信将结束。
在这种特定情况下,如果受害者发送了一个请求,而串联请求在合法请求之前得到响应,则串联响应将发送给受害者。因此,攻击者将控制受害者“执行”的请求。
此外,如果攻击者然后执行一个请求,而受害者的合法响应在攻击者请求之前被回答。则受害者的响应将发送给攻击者,窃取了受害者的响应(例如可能包含头部Set-Cookie)。
多重嵌套注入
与常见的HTTP 请求串联的另一个有趣的区别是,在常见的串联攻击中,目标是修改受害者请求的开头,以执行意外操作。在HTTP 响应串联攻击中,由于发送完整请求,您可以在一个有效负载中注入数十个响应,这将使数十个用户异步,这些用户将接收到注入的响应。
除了更容易地分发数十个漏洞给合法用户外,这也可以用于在服务器上引起拒绝服务。
攻击组织
如前所述,为了滥用这种技术,需要第一个串联消息进入服务器需要花费很长时间来处理。
如果我们只想尝试窃取受害者的响应,则这耗时请求足够。但如果要执行更复杂的攻击,则这将是攻击的常见结构。
首先是滥用 HTTP 请求串联的初始请求,然后是耗时请求,然后是1个或多个有效负载请求,其响应将发送给受害者。
滥用 HTTP 响应队列异步
捕获其他用户的请求
与已知的 HTTP 请求串联有效载荷一样,您可以通过一个重要的区别窃取受害者的请求:在这种情况下,您只需要发送内容反映在响应中,不需要持久存储。
首先,攻击者发送一个包含最终 POST 请求和反映参数的有效负载,以及一个大的 Content-Length
然后,一旦初始请求(蓝色)被处理,同时正在处理耗时请求(黄色),来自受害者的下一个请求将被附加到反映参数后的队列中:
然后,受害者将接收到耗时请求的响应,如果同时 攻击者发送了另一个请求,则反映内容请求的响应将发送给他。
响应异步
到目前为止,我们已经学会了如何滥用 HTTP 请求串联攻击来控制客户端将接收的响应的请求,以及如何窃取本应发送给受害者的响应。
但仍然可以进一步异步响应。
有一些有趣的请求,如HEAD请求,规定响应体内不得包含任何内容,并且应(必须)包含请求的 Content-Length,就像GET 请求一样。
因此,如果攻击者注入一个HEAD请求,如下图所示:
然后,一旦蓝色请求被响应给攻击者,下一个受害者请求将被引入队列:
然后,受害者将接收到HEAD请求的响应,其中将包含 Content-Length 但没有任何内容。因此,代理不会将此响应发送给受害者,而是等待一些内容,实际上将是对黄色请求的响应(同样是攻击者注入的):
内容混淆
根据先前的示例,知道你可以控制将要接收受害者的响应的请求的主体,而HEAD 响应通常在其标头中包含Content-Type和Content-Length,你可以发送以下请求来在受害者中引发XSS,而页面本身并不容易受到XSS攻击:
缓存毒化
滥用先前评论的响应解同步内容混淆攻击,如果缓存存储了受害者执行的请求的响应,并且这个响应是一个注入的响应导致XSS,那么缓存就被毒化了。
包含XSS有效载荷的恶意请求:
发送给受害者的恶意响应,其中包含指示缓存存储响应的标头:
{% hint style="warning" %} 请注意,在这种情况下,如果**"受害者"是攻击者**,他现在可以在任意URL中执行缓存毒化,因为他可以控制将被缓存的URL与恶意响应一起。 {% endhint %}
Web缓存欺骗
这种攻击类似于先前的攻击,但攻击者不是在缓存中注入有效载荷,而是将受害者信息缓存在缓存中:
响应拆分
这种攻击的目标是再次滥用响应 解同步,以便使代理发送100%由攻击者生成的响应。
为了实现这一点,攻击者需要找到Web应用程序的一个端点,该端点在响应中反映一些值,并且了解HEAD响应的内容长度。
他将发送一个利用,如下所示:
在第一个请求被解决并发送回攻击者后,受害者的请求被添加到队列中:
受害者将作为响应接收HEAD响应 + 第二个请求响应的内容(包含反映数据的部分):
然而,请注意反映数据的大小符合HEAD响应的Content-Length,这在响应队列中生成了一个有效的HTTP响应。
因此,第二个受害者的下一个请求将接收到完全由攻击者制作的响应。由于响应完全由攻击者制作,他还可以使代理缓存响应。