问题的关键在于,前端和后端往往对HTTP协议提供不同级别的支持,但同时又将不同用户的请求封装到一个公共通道中。 为了连接前端接收请求和后端处理请求,建立一个长寿命的TCP连接,通过该连接传输用户请求,沿着链条一个接一个地传输,通过HTTP协议来分隔。 为了分隔请求,标头“Content-Length”(确定请求中数据的总大小)和“
如果前端仅支持“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
如果后端不立即处理请求并等待分块数据的最终零边界块的到达,就会出现问题。 进行更完整的检查
进行真正的攻击取决于被攻击站点的能力,例如,在攻击 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年有
来源: opennet.ru