
2.8 HTTP响应截断
2.8.1 HTTP响应截断的概念
HTTP响应截断是由于应用程序未对用户提交的数据进行严格过滤,因此当用户恶意提交包含CR(回车,即URL编码%0d或\r)和LF(换行符,即URL编码%0a或\n)的HTTP请求,且请求数据包含在发送给Web用户的HTTP响应标头中时,服务器可能会创建两个HTTP响应,攻击者可以控制第2个响应并加以攻击。攻击者还可以控制响应的内容,构造XSS攻击,其中的响应内容包含恶意的JavaScript或其他代码,并在用户的浏览器中执行,也有可能会让用户重定向到攻击者控制的Web内容中或在用户的主机上执行恶意操作。本节分析HTTP响应截断产生的原因、危害以及修复方法。
2.8.2 HTTP响应截断的危害
HTTP响应截断一旦被攻击者利用,并不会直接造成安全问题,而是会因攻击者控制的HTTP响应内容造成间接攻击。例如,攻击者可控制HTTP响应内容,在Web页面插入恶意的JavaScript或HTML代码,而浏览器会正常解析,导致正在请求页面的结构被破坏、用户信息泄露、拒绝服务等。同样,攻击者还可利用HTTP响应再次发起对其他目标服务器的请求,篡改页面内容。甚至在同一代理服务器下,单个用户被攻击后,多个用户会因共享Web缓存,从而导致共享用户继续收到恶意内容,直到缓存条目被清除。CVE中也有一些与之相关的漏洞信息,如表2-7所示。
表2-7 与HTTP响应截断相关的漏洞信息

2.8.3 实例代码
本节使用实例的完整源代码可参考本书配套资源文件夹,源文件名:CWE113_HTTP_Response_Splitting__Environment_addHeaderServlet_01.java。
1)缺陷代码

上述代码的目的是获取环境变量的ADD。在第38行将该值设置到相应头的Location字段中,这样当浏览器读到Location字段时就会进行资源跳转。当环境变量值为“add\r\nHTTP/1.1 200 OK\r\n…”时,由于在程序中未对环境变量值做校验,因此HTTP响应将会被拆分成两个响应,第2个响应完全由攻击者控制,并构造出攻击者期望的头部内容和主体内容,由此可能产生跨站脚本、页面劫持、浏览器缓存中毒等间接攻击。
2)修复代码


上述修复代码的第77行使用URLEncoder类对环境变量值进行encode,encode方法的作用是对非字母数字进行十六进制编码。
2.8.4 如何避免HTTP响应截断
(1)对用户的输入进行合理验证,对特殊字符(如<、>、'、"等)进行编码。
(2)创建一份安全字符白名单,只允许由这些受认可的字符组成的输入出现在HTTP响应头文件中。
(3)使用源代码静态分析工具进行自动化的检测,可以有效发现源代码中的HTTP响应截断问题。