对前后端系统的攻击,使我们能够介入第三方请求

已公开 针对使用前端-后端模型的站点(例如通过内容交付网络、负载平衡器或代理运行的站点)的新攻击的详细信息。 该攻击允许通过发送某些请求来插入前端和后端之间同一线程中处理的其他请求的内容。 所提出的方法已成功用于组织一次攻击,该攻击可以拦截 PayPal 服务用户的身份验证参数,该攻击向研究人员支付了约 40 万美元,作为通知未修补漏洞存在的计划的一部分。 该攻击还适用于使用 Akamai 内容交付网络的网站。

问题的关键在于,前端和后端往往对HTTP协议提供不同级别的支持,但同时又将不同用户的请求封装到一个公共通道中。 为了连接前端接收请求和后端处理请求,建立一个长寿命的TCP连接,通过该连接传输用户请求,沿着链条一个接一个地传输,通过HTTP协议来分隔。 为了分隔请求,标头“Content-Length”(确定请求中数据的总大小)和“转移编码:分块(允许您分部分传输数据,以“{size}\r\n{block}\r\n{size}\r\n{block}\r\n0”格式指定不同大小的块)。

如果前端仅支持“Content-Length”但忽略“Transfer-Encoding: chunked”(例如,Akamai CDN 就是这样做的),就会出现问题,反之亦然。 如果双方都支持 Transfer-Encoding: chunked,则可以利用 HTTP 标头解析器的实现功能进行攻击(例如,当前端忽略“Transfer-Encoding: xchunked”、“Transfer-Encoding: chunked”等行时) ”、“传输编码”:[tab]分块”、“X:X[\n]传输编码:分块”、“传输编码[\n]:分块”或“传输编码:分块”,以及后端成功处理它们)。

在这种情况下,攻击者可以发送同时包含“Content-Length”和“Transfer-Encoding:chunked”标头的请求,但“Content-Length”中的大小与分块链的大小不对应,这会导致小于实际值。 如果前端根据“Content-Length”处理并转发请求,后端根据“Transfer-Encoding: chunked”等待块完成,那么根据“Transfer-Encoding: chunked”的数据结束将较早确定,攻击者将在请求的剩余尾部开始下一个请求,即攻击者将能够将任意数据附加到接下来传输的其他人的请求的开头。

对前后端系统的攻击,使我们能够介入第三方请求

要确定所使用的前后端组合中的问题,您可以通过前端发送如下请求:

POST /关于 HTTP/1.1
主机:example.com
转移编码:分块
内容长度:4

1
Z
Q

如果后端不立即处理请求并等待分块数据的最终零边界块的到达,就会出现问题。 进行更完整的检查 准备好的 一个特殊的实用程序,还测试从前端隐藏“Transfer-Encoding:chunked”标头的可能方法。

进行真正的攻击取决于被攻击站点的能力,例如,在攻击 Trello Web 应用程序时,您可以替换请求的开头(替换数据如“PUT /1/members/1234... x=x&csrf =1234&username=testzzz&bio=cake”)并发送包含第三方用户的原始请求以及其中指定的认证Cookie的消息。 对于对 saas-app.com 的攻击,事实证明可以通过将 JavaScript 代码替换为请求参数之一来替换响应中的 JavaScript 代码。 对于 redhat.com 的攻击,使用内部处理程序重定向到攻击者的网站(格式为“POST /search?dest=../assets/idx?redir=//”的请求[电子邮件保护]/HTTP/1.1”)。

使用内容交付网络的方法可以通过替换“Host:”标头来简单地替换所请求的站点。 该攻击还可用于毒害内容缓存系统的内容并提取缓存的机密数据。 该方法的顶峰是组织对 PayPal 的攻击,从而可以拦截用户在身份验证期间发送的密码(iframe 请求被修改为在 paypal.com/us/gifts 页面的上下文中执行 JavaScript,例如未应用 CSP(内容安全策略))。

有趣的是,2005年有 建议的 一种本质上类似的请求欺骗技术,允许您欺骗缓存代理(Tomcat、squid、mod_proxy)中的数据或通过在一个 HTTP 会话中指定多个“GET”或“POST”请求来绕过防火墙阻止。

来源: opennet.ru

添加评论