CRLF漏洞讲解 每天不动了在看src的东西day:7CRLF 注入漏洞详解一、什么是 CRLFCR Carriage Return回车符\rASCII 0x0DLF Line Feed换行符\nASCII 0x0A在 HTTP 协议中\r\n组合用于分隔请求行/状态行与请求头请求头之间请求头与请求体HTTP/1.1 200 OK\r\n ← 状态行结束 Content-Type: text/html\r\n ← 第一个头 Content-Length: 100\r\n ← 第二个头 \r\n ← 头结束 / 体开始 html.../html ← 响应体二、漏洞原理当用户输入被直接拼接到 HTTP 响应头中且未过滤\r\n时攻击者可以注入换行符提前结束当前响应头写入伪造的响应体。漏洞代码示例PHP?php// ❌ 漏洞用户输入直接拼接到 Location 头$redirect$_GET[url];header(Location: .$redirect);?正常请求?url/index.php→Location: /index.php恶意请求?url%0d%0aSet-Cookie:%20PHPSESSIDevil→Location: Set-Cookie: PHPSESSIDevil攻击者注入了第二个响应头。三、攻击类型3.1 HTTP 响应拆分Response Splitting最经典的 CRLF 攻击。注入\r\n\r\n提前结束 HTTP 响应头写入伪造的响应体?url%0d%0a%0d%0ahtml伪造的内容/html经过 header() 后实际输出Location: html伪造的内容/html ← 浏览器将其解析为响应体利用这个可以构造 XSS绕过浏览器的 XSS 过滤器因为注入点发生在服务端头中浏览器认为这是合法响应。3.2 HTTP 请求走私辅助CRLF 注入有时用于构造 HTTP 请求走私的 Payload通过注入\r\n改变请求边界。3.3 日志注入Log Injection当用户输入被记入日志文件时注入 CRLF 可以伪造日志条目GET /login?useradmin%0d%0a[2026-06-28]%20登录成功:%20root HTTP/1.1日志中会多出一条伪造的记录可用于掩盖攻击痕迹或嫁祸他人。3.4 Redis/SSRF CRLF 注入在 SSRF Redis 场景中CRLF 是协议的关键分隔符gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a...每个 Redis 命令都是用\r\n分隔的。四、实际攻击场景XSS 绕过当站点有 CSP内容安全策略或 XSS 过滤器时普通 XSS 可能被拦截。但 CRLF 注入可以在响应头层面绕过去HTTP/1.1 302 Found Location: /redirect.php ← 注入 CRLF Set-Cookie: sessionevil ← 注入的响应头 Content-Type: text/html scriptalert(1)/script ← 注入的响应体浏览器会收到两个响应合并第二个被解析为 HTML → XSS 触发。五、容易被 CRLF 攻击的函数语言危险函数PHPheader()、setcookie()自动编码\r\n的旧版本除外PythonResponse.set_cookie()、wsgi响应头操作Javaresponse.addHeader()、response.sendRedirect()Node.jsres.setHeader()、res.writeHead()PHP 5.1.2 的header()默认禁止了 URL 中的 CRLF但setcookie()和自定义头仍可能受影响。六、防御?php// 1. 移除 URL 中的 CRLF最直接$urlstr_replace([\r,\n],,$user_input);// 2. 白名单校验$allowed_hosts[example.com,sub.example.com];$parsedparse_url($user_input);if(!in_array($parsed[host],$allowed_hosts)){die(Invalid host);}// 3. URL 编码验证防止二次解码绕过if(preg_match(/%0[da]/i,$user_input)){die(CRLF detected);}// 4. 使用现代框架的内置方法// Laravel: redirect()-away($url)-setHttpStatusCode(302);// Spring: return redirect: URLEncoder.encode(url, UTF-8);?七、一句话总结CRLF 注入 向 HTTP 响应头中塞入换行符伪造新的头或体。攻击者利用这个可以构造 XSS、会话固定、缓存投毒等问题。本质上是对协议分隔符的注入和 SQL 注入中对引号注入是同一个道理。