CRLF是用于表示回车(\ r)换行(\ n)的首字母缩写。从括号中的符号可能会注意到,“回车”是指一行的结尾,而“换行”是指新的一行。因此,CR和LF都用来表示线的终点。当用户请求网站上的内容时,服务器将返回网站内容以及HTTP标头。标头和内容由CR和LF的定义组合分隔。由于CRLF,服务器知道新头在何处开始或结束。回车换行(CRLF)注入漏洞是一种服务器端注入,当攻击者通过使输入对象认为一个对象已经终止并且已经开始一个新对象而在一个输入字段中插入CRLF字符来欺骗服务器时,就会发生这种情况。当Web应用程序不清除CRLF字符的用户输入时,就会发生这种情况。它具有中等严重等级(根据Bugcrowd的VRT为P3)。
CRLF注入攻击有两个最重要的用例:
- 日志拆分:攻击者插入一个行尾字符和一个额外的行来伪造日志文件条目,以便通过隐藏其他攻击来欺骗系统管理员。
- HTTP响应拆分: CRLF注入用于向HTTP响应中添加HTTP标头,例如,执行XSS攻击导致信息泄露。
例子:
可以如下设计一个简单的GET请求:
GET /%0d%0aSet-Cookie:CRLFInjection=PreritPathak HTTP/1.1
注意: %0d和%0a分别是\ r和\ n的编码形式。如果Web应用程序容易受到攻击,则攻击者将能够在网站上设置Cookie。
CRLF注射的影响
通过CRLF注入,攻击者可以设置虚假cookie,窃取CSRF令牌,通过注入脚本(XSS)来泄露用户信息以及执行各种其他攻击。它还允许攻击者停用和绕过XSS筛选器和同源起点策略(SOP)之类的安全措施,从而使其容易受到以下攻击:
1. XSS或跨站点脚本
XSS或跨站点脚本是一个安全漏洞,攻击者可以利用该漏洞将恶意JavaScript代码注入Web应用程序。以下GET请求是通过XSS尝试链CRLF注入精心设计的。
通过弹出包含敏感用户信息的警报
www.target.com/%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E
通过禁用XSS保护
www.target.com/%0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23
2. Cookie注入
HTTP响应拆分使攻击者可以在受害者的浏览器上设置恶意cookie。在大多数情况下,以下GET请求将导致307重定向,因此受害者将被重定向到target.com且URL将不包含Set-Cookie参数。但是,将在后台设置cookie。
www.target.com/%0d%0aSet-Cookie:CRLFInjection=MaliciousCookieSet
3.网络钓鱼攻击
攻击者可以设置Location标头,该标头会将受害者重定向到恶意网站。该网站可以开发为看起来像目标网站一样,当受害者输入其凭据时,会将其发送给攻击者。位置标头可以设置为:
GET /%0d%0aLocation:%20https://evil.com HTTP/1.1
4.会话固定
与Cookie注入攻击类似,此处,攻击者将用户的会话ID设置为特定值。该链接将发送给受害者,当受害者使用此会话登录时,攻击者也可以使用相同的会话ID登录。
www.target.com/%0d%0aSet-Cookie:session_id=942....
5. HTTP标头注入
攻击者可以利用CRLF注入在应用程序中注入HTTP标头,以破坏安全机制,例如XSS过滤器或同源策略。
www.target.com/%0d%0aHackersHeader:NewHeader
可以注入CORS(跨源资源共享)激活标头,并且攻击者可以使用JavaScript访问敏感资源,否则该敏感资源将受到SOP(同一源策略)的保护,这会阻止来自不同源的站点相互访问。
6. Web缓存中毒
Web缓存中毒是一种技术,攻击者可通过该技术通过操纵Web缓存来提供中毒内容。为了成功利用此问题,攻击者需要毒害易受攻击的网站的客户端,服务器之间的缓存代理,联合组织,内容交付网络(CDN)或其他缓存机制。成功的Web缓存中毒后,受害者将不知道缓存向他们提供的恶意内容。下面是一个示例,说明攻击者如何通过毒害Web缓存来潜在地利用主机头注入(使用CRLF)。
对于以下请求:
$ telnet www.target.com 80
Trying x.x.x.x...
Connected to www.target.com.
Escape character is '^]'.
GET /%0d%0aX-Forwarded-Host:hacker.com HTTP/1.1 //or Host
Host: target.com
将有以下响应:
HTTP/1.1 200 OK
html
Example
其他用例:
1.注入伪造的HTTP响应头:
Content-Length: 10
现在,Web浏览器将仅解析接下来的10个字节。
2.注入伪造的HTTP响应头:
Content-Length: 0
这被视为终止的响应,并且Web浏览器开始解析新的响应。
缓解措施:
开发人员应牢记以下几点以防止CRLF注入:
- 清理用户输入。
- 编码CR和LF字符(\ r,\ n),以便即使提供了CR和LF字符,服务器也无法识别它们。
- 在用户输入到达响应标头之前对其进行验证(例如,通过使用诸如StringEscapeUtils.escapeJava()之类的方法)。
- 应该禁用不必要的头。
下表根据各种行业标准强调了CRLF注射的严重性:
Classification | ID / Severity |
---|---|
OWASP 2017 | A1 |
CWE | 93 |
CVSS:3.0 | CVSS:3.0: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:H |
Bugcrowd VRT | P3 |