HTTP协议头注射漏洞原理
以下情况中会出现HTTP协议头注射漏洞:
1. 数据通过一个不可信赖的数据源进入Web 应用程序,最常见的是HTTP 请求。
2. 数据包含在一个HTTP 响应头文件里,未经验证就发送给了Web 用户。
其中最常见的一种Header Manipulation 攻击是HTTP Response Splitting。 为了成功地实施Http Response Splitting 盗取,应用程序必须允许将那些包含CR(回车,由%0d 或\r 指定)和LF(换行,由%0a 或\n 指定)的字符输入到头文件中。
攻击者利用这些字符不仅可以控制应用程序要发送的响应剩余头文件和正文,还可以创建完全受其控制的其他响应。
<?php $location = $_GET['some_location']; header("location: $location"); ?>
假设在请求中提交了一个由标准的字母和数字字符组成的字符串,如”index.html”,那么包含此cookie 的HTTP 响应可能表现为以下形式:
HTTP/1.1 200 OK
…
location: index.html
…
然而,因为该位置的值由未经验证的用户输入组成,所以仅当提交给some_location 的值不包含任何CR 和LF 字符时,响应才会保留这种形式。
如果攻击者提交的是一个恶意字符串,比如:
“index.html\r\nHTTP/1.1 200 OK\r\n…”,
那么此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()函数中的参数外界可控