2024年6月14日发(作者:)
CRLF注入原理和防御
1、CRLF的意思
就是回车(CR, ASCII 13, r) 换行(LF, ASCII 10, n)。
CR、LF分别对应回车(%0d)、换行(%0a)字符。
这两个ACSII字符不会在屏幕有任何输出,但在Windows中广泛使用来标识一
行的结束。而在Linux/UNIX系统中只有换行符。
CR和LF组合在一起即CRLF命令,它表示键盘上的"Enter"键。
2、CRLF注入
在HTTP协议中,HTTP Header与HTTP Body是用两个CRLF分隔的,浏览器
就是根据这两个CRLF来取出HTTP 内容并显示出来。所以,一旦我们能够控制
HTTP 消息头中的字符,注入一些恶意的换行,这样我们就能注入一些会话Co
okie或者HTML代码,所以CRLF Injection又叫HTTP Response Splitting
,简称HRS。
HRS是比XSS危害更大的安全问题,具体是为什么,我们往下看。
对于HRS最简单的利用方式是注入两个rn,之后在写入XSS代码,来构造一
个xss。
类似这样头部信息
HTTP/1.1 302 Moved Temporarilyrn
Date: Wed, 1 Mar 2005 15:26:41 GMTrn
Location: 192.168.0.1/?lang=Allyesnorn
Content-Length: 0rn
HTTP/1.1 200 OKrn
Content-Type: text/htmlrn
Content-Length: 24rnCRLF攻击实例:
3、CRLF注入实例
举个例子,一般网站会在HTTP头中用Location: 这种方式
进行302跳转,所以我们能控制的内容就是Location:后面的XXX某个网址。
所以一个正常的302跳转包是这样:
HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2014 17:52:17 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location:
但如果我们输入的是
%0aSet-cookie:JSPSESSID%3Dwooyun
注入了一个换行,此时的返回包就会变成这样:
HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2014 17:52:17 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location:
Set-cookie: JSPSESSID=wooyun
这个时候这样我们就给访问者设置了一个SESSION,造成一个“会话固定漏洞”
。
当然,HRS并不仅限于会话固定,通过注入两个CRLF就能造成一个无视浏览
器Filter的反射型XSS。
比如一个网站接受url参数/?url=xxx,xxx放在Location后
面作为一个跳转。如果我们输入的是
/?url=%0d%0a%0d%0a
or=alert(/xss/)>
我们的返回包就会变成这样:
HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2014 17:52:17 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location:
之前说了浏览器会根据第一个CRLF把HTTP包分成头和体,然后将体显示出来
。于是我们这里这个标签就会显示出来,造成一个XSS。
为什么说是无视浏览器filter的,这里涉及到另一个问题。
浏览器的Filter是浏览器应对一些反射型XSS做的保护策略,当url中含有XSS
相关特征的时候就会过滤掉不显示在页面中,所以不能触发XSS。
怎样才能关掉filter?一般来说用户这边是不行的,只有数据包中http头含有X
-XSS-Protection并且值为0的时候,浏览器才不会开启filter。
说到这里应该就很清楚了,HRS不正是注入HTTP头的一个漏洞吗,我们可以
将X-XSS-
Protection:0注入到数据包中,再用两个CRLF来注入XSS代码,这样就成功
地绕过了浏览器filter,并且执行我们的反射型XSS。
所以说HRS的危害大于XSS,因为它能绕过一般XSS所绕不过的filter,并能产
生会话固定漏洞。
我们来一个真实案例吧。
新浪某分站含有一个url跳转漏洞,危害并不大,于是我就想到了CRLF Injecti
on,当我测试
/?url=%0a%0d%0a%0d%3Cimg%20src=1%3E
的时候,发现图片已经输出在页面中了,说明CRLF注入成功了:
那么我们试试XSS看看:
看控制台,果然被XSS Filter拦截了。
那么我们就注入一个
X-XSS-Protection:0
到数据包中,看看什么效果:
还有一个是利用字符编码来绕过XSS Filter的方法,当编码是is-2022-
kr时浏览器会忽略%0f,这样我们在onerror后面加个%0f就能绕过filter,
前提是注入一个
当然,在Location:这里注入只有webkit内核浏览器才能够利用,其他浏览器
可能会跳转、出错。不过对于chrome的使用量来说,危害已经足够了。
4、CRLF防御
方案1.
限制用户输入的CR和LF,或者对CR和LF字符正确编码后再输出,以防止注入自
定义HTTP头。
方案2. 查看:HTTP响应拆分漏洞(CRLF注入攻击漏洞) 解决办法
(感谢“黄克业”提供以上解决方案)
-PHP语言的解决方案:
这种现象往往表现在带有参数传递的网页,只要合理的过滤好就OK啦,PHP语言
的一些过滤方法:
$post = trim($post);
$post = strip_tags($post,""); //清除HTML等代码
$post = ereg_replace("t","",$post); //去掉制表符号
$post = ereg_replace("rn","",$post); //去掉回车换行符号
$post = ereg_replace("r","",$post); //去掉回车
$post = ereg_replace("n","",$post); //去掉换行
$post = ereg_replace(" ","",$post); //去掉空格
$post = ereg_replace("'","",$post); //去掉单引号


发布评论