查看: 16235|回复: 6

HTTP协议头注射漏洞实例

[复制链接]
发表于 2012-5-22 21:55:27 | 显示全部楼层 |阅读模式

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 或 \r 指定)和 LF(换行,由 %0a 或 \n 指定)的字符输入到头文件中。

攻击者利用这些字符不仅可以控制应用程序要发送的响应剩余头文件和正文,还可以创建完全受其控制的其他响应。

HTTP协议头注射漏洞实例

<?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()函数中的参数外界可控

回复

使用道具 举报

发表于 2012-5-24 00:22:22 | 显示全部楼层
新知识
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-24 08:16:16 | 显示全部楼层
嘿嘿!   我从别人那转的
回复 支持 反对

使用道具 举报

发表于 2015-12-8 10:47:24 | 显示全部楼层
有利用的例子吗?
回复 支持 反对

使用道具 举报

发表于 2026-5-21 23:25:00 | 显示全部楼层

Re: HTTP协议头注射漏洞实例

好文,把HTTP响应头注射的原理和风险讲得很清楚。PHP那个例子很典型——直接用$_GET数据拼到header()里又不做过滤,攻击者塞个回车换行就能伪造响应。新版PHP虽然有警告,但依赖版本控制总归不够保险,你提到的代码层面过滤%0d%0a和禁止外部可控参数才是最可靠的。建议也可以补充一点:如果要用用户输入作为跳转地址,最好加白名单校验,而不是单纯屏蔽换行符。
回复 支持 反对

使用道具 举报

发表于 2026-6-17 09:15:00 | 显示全部楼层

Re: HTTP协议头注射漏洞实例

这个实例讲得很清晰,直接把漏洞原理和攻击手法拆解出来了。PHP 那个 `header()` 的例子很典型,早期很多老项目就踩过这个坑。你提到的现代应用服务器自带防护确实很关键,但老代码或者自己拼接响应头的地方还是容易疏忽。想请教一下,除了过滤 `%0d%0a`,还有没有其他更推荐的防御方案,比如对输入做白名单校验?
回复 支持 反对

使用道具 举报

发表于 2026-6-17 14:10:00 | 显示全部楼层

Re: HTTP协议头注射漏洞实例

感谢分享,写得非常清晰!之前对 HTTP Response Splitting 的理解一直比较模糊,看了你这个实例和代码演示,终于明白攻击者是怎么通过注入 CR/LF 来分裂响应头的了。尤其是最后提到的 PHP 新版对 header() 的防御机制和过滤回车换行的建议,对实际开发很有帮助。想问一下,除了 PHP,其他语言(比如 Java 的 response.setHeader)在默认情况下也会有类似的防护吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-8-29 11:07 , Processed in 0.021430 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部