【缺陷周话】第14期:HTTP 响应截断

 

1、HTTP 响应截断

HTTP响应截断是由于应用程序未对用户提交的数据进行严格过滤,当用户恶意提交包含 CR(回车,即URL编码%0d或r)和 LF(换行符,即URL编码%0a或n)的HTTP请求,服务器可能会创建两个 HTTP 响应,攻击者可以控制第二个响应并加载攻击。攻击者可控制响应的内容构造 XSS 攻击,其中响应中包含恶意的 JavaScript 或其它代码在用户的浏览器中执行,也有可能让用户重定向到攻击者控制的Web内容或在用户的主机上执行恶意操作。本篇文章以JAVA语言源代码为例,分析HTTP响应截断漏洞产生的原因以及修复方法。 详细请参见 CWE ID 113: Improper Neutralization of CRLF Sequences inHTTP Headers (‘HTTP Response Splitting’) (http://cwe.mitre.org/data/definitions/113.html)。

 

2、 释放后使用的危害

HTTP响应截断一旦被攻击者利用,并不直接造成安全问题,而是由攻击者控制的HTTP响应内容造成间接攻击。例如,攻击者可控制HTTP响应体内容,在web页面中插入恶意的 javaScript 或 html 代码,而浏览器正常解析,导致正在请求页面的结构被破坏、用户信息泄露、拒绝服务等。同样,攻击者还可利用 HTTP 响应再次发起对其他目标服务器的请求,造成页面内容被篡改。甚至在同一代理服务器下,单个用户被攻击后,多个用户共享web缓存,共享用户将继续收到恶意内容,直到缓存条目被清除。

从2018年1月至12月,CVE中共有11条漏洞信息与其相关。部分漏洞如下:

CVE 概述
CVE-2018-1474 IBM BigFix Platform 9.2.0 到 9.2.14 和 9.5 到 9.5.9 容易受到 HTTP 响应截断攻击,这是由用户提供的输入验证不当引起的。远程攻击者可以利用此漏洞注入任意 HTTP 请求头,并在单击URL后使服务器返回拆分响应。这将允许攻击者执行进一步的攻击,例如 Web 缓存中毒或跨站点脚本,并可能获取敏感信息。
CVE-2018-11347 YunoHost 2.7.2 到 2.7.14 Web 应用程序受一个 HTTP 响应头注入的影响。此漏洞允许攻击者将来自服务器的响应注入一个或多个 HTTP 请求头。它需要与用户进行交互才能向他发送恶意链接。它可用于执行其他攻击,例如用户重定向到恶意网站,HTTP响应截断或 HTTP 缓存中毒。
CVE-2018-7830 HTTP 请求头中 HTTP 响应截断漏洞存在于 Modicon M340、Premium、Quantum PLC 和 BMXNOR0200 的嵌入式 Web 服务器中,通过发送特定 HTTP 请求头,会导致拒绝服务。
CVE-2018-1319 在 1.8.1 之前的 Apache Allura 中,攻击者可能会制作导致 HTTP 响应截断 URL。如果受害者访问恶意制作的 URL,可能会发生不需要的结果,包括受害者浏览会话的 XSS 或拒绝服务。

 

3、示例代码

示例源于 Samate Juliet Test Suite for Java v1.3 (https://samate.nist.gov/SARD/testsuite.php),源文件名:CWE113_HTTP_Response_Splitting__Environment_addHeaderServlet_01.java。

3.1缺陷代码

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

使用360代码卫士对上述示例代码进行检测,可以检出“HTTP响应截断”缺陷,显示等级为中。从跟踪路径中可以分析出数据的污染源以及数据流向,在代码行第38行报出缺陷,如图1所示:

图1:HTTP 响应截断检测示例

3.2 修复代码

在上述修复代码中,第38行使用 Refenence 类对环境变量值进行 decode,剔除特殊字符。

使用360代码卫士对修复后的代码进行检测,可以看到已不存在“HTTP响应截断”缺陷。如图2:

图2:修复后检测结果

 

4 、如何避免 HTTP 响应截断

要避免HTTP响应截断,需要注意以下几点:

(1)对用户的输入进行合理验证,对特殊字符(如<、>、’、”等)等进行编码。

(2)创建一份安全字符白名单,只接受完全由这些受认可的字符组成的输入出现在 HTTP 响应头文件中。

(3)使用源代码静态分析工具,进行自动化的检测,可以有效的发现源代码中的 HTTP 响应截断问题。

(完)