CRLF注入漏洞

0x01 CRLF注入漏洞

回车换行(CRLF)注入攻击是一种当用户将CRLF字符插入到应用中而触发漏洞的攻击技巧。CRLF字符(%0d%0a)在许多互联网协议中表示行的结束,包括HTML,该字符解码后即为\ r\ n。这些字符可以被用来表示换行符,并且当该字符与HTTP协议请求和响应的头部一起联用时就有可能会出现各种各样的漏洞,包括http请求走私(HTTP RequestSmuggling)和http响应拆分(HTTP Response Splitting)。

一般有两种应用场景:

1、注入请求头导致html解析

2、注入操作日志导致后台日志记录混淆,比如恶意换行

0x02 CRLF注入检测原理

简单来讲就是在构造请求时,加上%0d%0a字符,验证后续代码能否被单独解析执行,如下测试代码:

1
2
GET url=https://www.test.com%0d%0a%0d%0a<img src=1 onerror=alert(/xss/)>/
Host:xxx

如果存在CRLF注入漏洞会被解析为:

1
2
3
GET url=https://www.test.com
<img src=1 onerror=alert(/xss/)>/
Host:xxx

从而造成XSS

0x03 CRLF注入自动化检测

自动化检测工具地址:https://github.com/Nefcore/CRLFsuite

1
2
3
4
$ git clone https://github.com/Nefcore/CRLFsuite.git
$ cd CRLFsuite
$ sudo python3 setup.py install
$ crlfsuite -h

用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
单网址扫描:
$ crlfsuite -u "http://testphp.vulnweb.com"

多个 URL 扫描::
$ crlfsuite -i targets.txt

从标准输入:
$ subfinder -d google.com -silent | httpx -silent | crlfsuite -s

指定 cookie扫描:
$ crlfsuite -u "http://testphp.vulnweb.com" --cookies "key=val; newkey=newval"

使用 POST 方法:
$ crlfsuite -i targets.txt -m POST -d "key=val&newkey=newval"