HTTP 响应头文件中包含未经验证的数据会引发 cache-poisoning、cross-site scripting、cross-user defacement、page hijacking、cookie manipulation 或 open redirect。
HTTP协议头注射漏洞原理
以下情况中会出现 HTTP协议头注射漏洞: 1. 数据通过一个不可信赖的数据源进入 Web 应用程序,最常见的是 HTTP 请求。 2. 数据包含在一个 HTTP 响应头文件里,未经验证就发送给了 Web 用户。
其中最常见的一种 Header Manipulation 攻击是 HTTP Response Splitting。 为了成功地实施 Http Response Splitting 盗取,应用程序必须允许将那些包含 CR(回车,由 %0d 或 指定)和 LF(换行,由 %0a 或 指定)的字符输入到头文件中。
攻击者利用这些字符不仅可以控制应用程序要发送的响应剩余头文件和正文,还可以创建完全受其控制的其他响应。
HTTP协议头注射漏洞实例
1 <?php 2 $location = $_GET['some_location']; 3 header("location: $location"); 4 ?>
假设在请求中提交了一个由标准的字母和数字字符组成的字符串,如 "index.html",那么包含此 cookie 的 HTTP 响应可能表现为以下形式:
HTTP/1.1 200 OK
...
location: index.html
...
然而,因为该位置的值由未经验证的用户输入组成,所以仅当提交给 some_location 的值不包含任何 CR 和 LF 字符时,响应才会保留这种形式。
如果攻击者提交的是一个恶意字符串,比如 :
"index.html HTTP/1.1 200 OK ..."
那么此 HTTP 响应就会被分割成以下形式的两个响应:
HTTP/1.1 200 OK
location: index.html
HTTP/1.1 200 OK
...
显 然,第二个响应已完全由攻击者控制,攻击者可以用所需的头文件和正文内容构建该响应。攻击者可以构建任意 HTTP 响应,从而发起多种形式的攻击。
HTTP协议头注射漏洞解决方案
如今的许多现代应用程序服务器可以防止 HTTP 头文件感染恶意字符。
例如,当新行传递到 header() 函数时,最新版本的 PHP 将生成一个警告并停止创建头文件。 如果您的 PHP 版本能够阻止设置带有换行符的头文件,则其具备对 HTTP Response Splitting 的防御能力。
代码层面常见的解决方案:
- 严格检查变量是否已经初始化
- 在设置HTTP响应头的代码中,过滤回车换行(%0d%0a、%0D%0A)字符
- 禁止header()函数中的参数外界可控