crlf 指的是回车符(cr,ascii 13,\r,%0d) 和换行符(lf,ascii 10,\n,%0a),操作系统就是根据这个标识来进行换行的,你在键盘输入回车键就是输出这个字符,只不过win和linux系统采用的标识不一样而已。

在http当中http的header和body之间就是用两个crlf进行分隔的,如果能控制http消息头中的字符,注入一些恶意的换行,这样就能注入一些会话cookie和html代码,所以crlf injection 又叫做 http response splitting,简称hrs。crlf漏洞可以造成cookie会话固定反射型xss(可过waf)的危害,注入xss的利用方式:连续使用两次%0d%oa就会造成header和body之间的分离,就可以在其中插入xss代码形成反射型xss漏洞。

测试

crlf注入漏洞的检测也和xss漏洞的检测差不多。通过修改http参数或url,注入恶意的crlf,查看构造的恶意数据是否在响应头中输出。主要是在看到有重定向或者跳转的地方,可以在跳转的地址添加?url=http://baidu.com/xxx%0a%0dset-cookie: test123=123测试一下,通过查看响应包的数据查看结果。

get /index.php?c=rpzy&a=query&type=all&value=123&datatype=json&r=x1mu6e86%0a%0dset-cookie: test123=123 http/1.1
host: www.xxxxyou.net

这里并没有利用成功,如果利用成功的话,响应包会出现一行set-cookie: test123=123 数据。

原理分析

hrs漏洞存在的前提是 :url当中输入的字符会影响到文件,比如在重定位当中可以尝试使用%0d%0a作为crlf.

一般网站会在http头中加上location: http://baidu.com的方式来进行302跳转,所以我们能控制的内容就是location:后面的xxx网址,对这个地址进行污染。

假设服务端(php)的处理方式:

if($_cookie("security_level") == 1)
{
    header("location: ". $_get['url']);
    exit;
}

代码意思是说当条件满足时,将请求包中的url参数值拼接到location字符串中,并设置成响应头发送给客户端。

此时服务器端接收到的url参数值是我们修改后的:
http://baidu.com/xxx%0a%0dset-cookie: test123=123

在url参数值拼接到location字符串中,设置成响应头后,响应头就会看到:
set-cookie: test123=123

修复方式

服务端收到前端过来的参数,在加入location之前,需要过滤 \r 、\n 之类的行结束符,避免输入的数据污染其它http首部字段。

参考文献