每日漏洞 | 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字符的输入,可以:

  1. 注入额外的HTTP响应头(如Set-Cookie)
  2. 控制HTTP响应主体(通过注入两个CRLF)
  3. 实现HTTP响应拆分攻击

四、漏洞检测方法

1. 检测步骤

  1. 寻找可能的输入点(URL参数、表单字段等)
  2. 构造包含CRLF字符的测试用例(如%0d%0a
  3. 观察响应头中是否包含注入的内容

2. 测试用例示例

http://example.com/%0d%0aSet-Cookie:crlf=true

3. 检测示例

  1. 正常请求抓包
  2. 在URL参数中加入CRLF字符和测试字段(如Set-Cookie)
  3. 提交修改后的请求
  4. 检查响应头是否包含注入的字段

五、漏洞危害

CRLF注入漏洞可导致以下安全问题:

  1. 会话固定攻击:通过注入Set-Cookie头控制用户会话
  2. 跨站脚本攻击:通过注入Location头实现重定向到恶意网站
  3. 缓存投毒:操纵缓存控制头
  4. 安全策略绕过:修改CSP或其它安全头
  5. HTTP响应拆分:完全控制响应内容

六、漏洞示例分析

1. 漏洞代码示例(PHP)

<?php
if (isset($_GET['url'])) {
    header("Location: " . $_GET['url']);
    exit;
}
?>

2. 攻击过程

  1. 攻击者提交恶意URL:http://victim.com/?url=http://itsecgames.blogspot.com%0d%0aSet-Cookie:crlf=true
  2. 服务器拼接Location头:Location: http://itsecgames.blogspot.com\r\nSet-Cookie:crlf=true
  3. HTTP解析时,将\r\n识别为行结束符,将Set-Cookie视为新的响应头
  4. 响应中包含注入的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;
}
?>

八、进阶防御措施

  1. 使用白名单验证:只允许特定格式的输入
  2. 实施内容安全策略:限制HTTP头的可设置范围
  3. 定期安全测试:使用自动化工具检测CRLF注入漏洞
  4. 安全编码培训:提高开发人员的安全意识

九、总结

CRLF注入漏洞是一种严重的Web安全威胁,可能导致会话劫持、XSS等多种攻击。防御关键在于:

  • 严格过滤所有用户输入
  • 避免直接将用户输入拼接到HTTP头中
  • 实施纵深防御策略

通过理解漏洞原理、掌握检测方法并实施有效防御措施,可以显著降低CRLF注入漏洞的风险。

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. 测试用例示例 3. 检测示例 正常请求抓包 在URL参数中加入CRLF字符和测试字段(如Set-Cookie) 提交修改后的请求 检查响应头是否包含注入的字段 五、漏洞危害 CRLF注入漏洞可导致以下安全问题: 会话固定攻击 :通过注入Set-Cookie头控制用户会话 跨站脚本攻击 :通过注入Location头实现重定向到恶意网站 缓存投毒 :操纵缓存控制头 安全策略绕过 :修改CSP或其它安全头 HTTP响应拆分 :完全控制响应内容 六、漏洞示例分析 1. 漏洞代码示例(PHP) 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修复示例 八、进阶防御措施 使用白名单验证 :只允许特定格式的输入 实施内容安全策略 :限制HTTP头的可设置范围 定期安全测试 :使用自动化工具检测CRLF注入漏洞 安全编码培训 :提高开发人员的安全意识 九、总结 CRLF注入漏洞是一种严重的Web安全威胁,可能导致会话劫持、XSS等多种攻击。防御关键在于: 严格过滤所有用户输入 避免直接将用户输入拼接到HTTP头中 实施纵深防御策略 通过理解漏洞原理、掌握检测方法并实施有效防御措施,可以显著降低CRLF注入漏洞的风险。