响应分裂(又称为,CRLF注入)是一种常见的技术,被用于Web使用的各种攻击,利用HTTP消息成帧的基于行的特性以及请求与持久连接上的响应的有序关联。这个技术在请求通过共享缓存的时候有严重损害。
响应分裂利用了服务器上的漏洞(通常是应用服务器),攻击者可以在请求的一些参数中发送编码数据,这些数据是在之后会解码并且与响应中的任何头字段呼应。如果解码后的数据被精心设计使得看起来响应已经结束并且一个子请求已经开始,那么响应就被分裂了并且在明显的第二个响应中的内容就被攻击者控制了。攻击者可以在相同的长连接上制造任何其他请求,并欺骗接收者(包括中介)使其响应分裂的下一半是第二个请求的权威应答。
例如,请求目标里的一个参数可能被应用用服务器读取并且重用于一个重定向,导致了相同的参数在响应中的Location头字段中回显。如果参数被应用解码并且没有当放置到响应字段时没有正确的编码,攻击者可以发送编码的CRLF字节和其他内容,这将使得应用程序的单个响应看起来像两个或多个响应。
一种常见的响应分裂防御使过滤看起来像编码CR和LF(即“%0D”和”%0A“)的请求数据。然而,假设应用程序仅执行URI编码,而不是更模糊的数据转换,如字符编码,XML实体翻译,base64编码,sprintf重新格式化等。更有效的缓解措施是防止服务器的核心协议库以外的任何内容在头部分内发送CR或LF,这意味着将头字段的输出限制为过滤掉坏八位字节的API,并且不允许应用程序服务器直接写入协议流。