CRLF 注入
CRLF 注入 是什么?
CRLF 注入通过向 HTTP 头、日志或其他文本协议中插入回车换行符,以伪造新行并改变协议语义的攻击。
CRLF 注入利用了 CR(0x0D)和 LF(0x0A)字节在许多文本协议中作为行终止符的特殊含义。当应用程序将未经校验的用户输入反射到 HTTP 响应头、日志条目、SMTP 命令或 LDAP 查询中时,攻击者可以注入 CRLF 字节对及附加内容,以伪造 HTTP 头、拆分响应、隐藏日志条目或夹带命令。该弱点在 CWE 中编号为 CWE-93(对 CRLF 序列的不当中和);其针对 HTTP 头的子类是 CWE-113,涵盖 HTTP 请求/响应拆分。
在 Web 场景中,最严重的形式是 HTTP 响应拆分,由 Sanctum 公司的 Amit Klein 在 2004 年的一篇论文中首次描述。由于注入的 CRLF 会结束头部块,攻击者可以追加一个完全由其控制的第二个响应——污染共享缓存、设置任意 Cookie,或在浏览器视为可信的响应体中注入 XSS。该缺陷在标准库中反复出现:CVE-2019-9740 使得传入 Python urllib.request.urlopen 的 URL 中的 CRLF 序列能够注入 HTTP 头(甚至可经查询字符串注入 Redis 命令),并在 Python 2.7.17 以及 3.5.10/3.6.10/3.7.4 中修复。防御方法包括:对任何进入头部的输入拒绝或百分号编码 CR/LF、使用会拒绝头部值中控制字符的高层 API,以及使用严格、结构化的日志编码器而非原始字符串拼接。
flowchart TD
A[用户输入<br/>name=foo%0d%0aSet-Cookie: admin=true] --> B{校验 / 剥离 CR LF?}
B -->|否| C[输入原样写入头部]
C --> D[CRLF 结束当前头部]
D --> E[攻击者控制的头部或响应体]
E --> F[缓存投毒 / Cookie 注入 / XSS]
B -->|是,拒绝 CR LF| G[安全响应]● 示例
- 01
Set-Cookie: id=foo%0d%0aSet-Cookie: admin=true — 通过 CRLF 添加第二个 Cookie。
- 02
Location: /redir%0d%0aContent-Length:0%0d%0a%0d%0a<html>... — HTTP 响应拆分。
● 常见问题
CRLF 注入 是什么?
通过向 HTTP 头、日志或其他文本协议中插入回车换行符,以伪造新行并改变协议语义的攻击。 它属于网络安全的 攻击与威胁 分类。
CRLF 注入 是什么意思?
通过向 HTTP 头、日志或其他文本协议中插入回车换行符,以伪造新行并改变协议语义的攻击。
如何防御 CRLF 注入?
针对 CRLF 注入 的防御通常结合技术控制与运营实践,详见上方完整定义。
CRLF 注入 还有哪些其他名称?
常见的别称包括: 回车换行注入, 日志注入。