每日漏洞 | CRLF注入
字数 1605 2025-08-18 11:38:32
CRLF注入漏洞详解与防御指南
一、漏洞概述
CRLF注入漏洞(也称为HTTP响应拆分漏洞)是由于Web应用未对用户输入进行严格验证,导致攻击者能够注入恶意CRLF字符(回车符和换行符)。攻击者通过在HTTP请求行或首部字段中注入CRLF,可以注入额外的首部字段或报文主体,从而操纵HTTP响应。
二、CRLF基础知识
1. CRLF定义
- CR(Carriage Return):回车符,ASCII 13,表示为
\r或URL编码%0d - LF(Line Feed):换行符,ASCII 10,表示为
\n或URL编码%0a
2. 不同操作系统的行结束符
- Windows:使用CRLF(
\r\n)表示行结束 - Linux/Unix:使用LF(
\n)表示行结束 - MacOS:早期使用CR(
\r),现在也使用LF(\n)
3. HTTP规范中的CRLF
- HTTP报文中的每一行(状态行和首部字段)都以CRLF结束
- 首部与主体之间由两个连续的CRLF(即空行)分隔
- 浏览器依赖这两个CRLF来正确解析HTTP内容
三、漏洞原理
CRLF注入漏洞与XSS类似,都是由于未过滤用户输入导致的。区别在于:
- XSS:恶意数据输出在HTTP响应主体中
- CRLF注入:恶意数据输出在HTTP响应头中
攻击者通过构造包含CRLF字符的输入,可以:
- 注入额外的HTTP响应头(如Set-Cookie)
- 控制HTTP响应主体(通过注入两个CRLF)
- 实现HTTP响应拆分攻击
四、漏洞检测方法
1. 检测步骤
- 寻找可能的输入点(URL参数、表单字段等)
- 构造包含CRLF字符的测试用例(如
%0d%0a) - 观察响应头中是否包含注入的内容
2. 测试用例示例
http://example.com/%0d%0aSet-Cookie:crlf=true
3. 检测示例
- 正常请求抓包
- 在URL参数中加入CRLF字符和测试字段(如Set-Cookie)
- 提交修改后的请求
- 检查响应头是否包含注入的字段
五、漏洞危害
CRLF注入漏洞可导致以下安全问题:
- 会话固定攻击:通过注入Set-Cookie头控制用户会话
- 跨站脚本攻击:通过注入Location头实现重定向到恶意网站
- 缓存投毒:操纵缓存控制头
- 安全策略绕过:修改CSP或其它安全头
- HTTP响应拆分:完全控制响应内容
六、漏洞示例分析
1. 漏洞代码示例(PHP)
<?php
if (isset($_GET['url'])) {
header("Location: " . $_GET['url']);
exit;
}
?>
2. 攻击过程
- 攻击者提交恶意URL:
http://victim.com/?url=http://itsecgames.blogspot.com%0d%0aSet-Cookie:crlf=true - 服务器拼接Location头:
Location: http://itsecgames.blogspot.com\r\nSet-Cookie:crlf=true - HTTP解析时,将
\r\n识别为行结束符,将Set-Cookie视为新的响应头 - 响应中包含注入的Set-Cookie头
七、漏洞修复方案
1. 输入过滤
- 过滤所有用户输入中的
\r、\n字符 - 对CRLF的URL编码形式(
%0d、%0a)也要过滤
2. 编码输出
- 对输出到HTTP头中的内容进行编码,将CRLF转换为无害字符
3. 安全函数使用
- 使用安全的HTTP头设置函数,避免直接拼接用户输入
4. PHP修复示例
<?php
if (isset($_GET['url'])) {
$url = str_replace(array("\r", "\n"), '', $_GET['url']);
header("Location: " . $url);
exit;
}
?>
八、进阶防御措施
- 使用白名单验证:只允许特定格式的输入
- 实施内容安全策略:限制HTTP头的可设置范围
- 定期安全测试:使用自动化工具检测CRLF注入漏洞
- 安全编码培训:提高开发人员的安全意识
九、总结
CRLF注入漏洞是一种严重的Web安全威胁,可能导致会话劫持、XSS等多种攻击。防御关键在于:
- 严格过滤所有用户输入
- 避免直接将用户输入拼接到HTTP头中
- 实施纵深防御策略
通过理解漏洞原理、掌握检测方法并实施有效防御措施,可以显著降低CRLF注入漏洞的风险。