一,CRLF漏洞原理
在《HTTP/HTTP报文》中介绍了HTTP报文的结构,状态行和首部中的每行以CRLF结束,首部于主题之间有一空行分隔。
可以理解为HTTP头部之间有一个CRLF做间隔,而头部和主体之间有两个CRLF做间隔。
CRLF漏洞是因为web应用没有对用户输入做严格验证,导致攻击者可以输入一些恶意字符。攻击者一旦向请求体或者头部中的字段注入恶意的CRLF,并在响应中输出,所以又称为HTTP响应拆分漏洞。
二,CRLF漏洞拓展知识
CRLF指的是回车符(CR,ASCII值为13,\r,%0d)和换行符(LF,ASCII值为10,\n,%0a),来源于打字机,表示行的结束,计算机出现后沿用了这个概念。
回车符:光标移动到行首
换行符:光标移动到下一行
键盘上的回车键(ENTER)就可以执行该操作。但是不同的操作系统,行的结束符时不一样的。
Windows系统:使用CRLF表示行结束
Linux系统:使用LF表示行结束
MacOS:早期使用CR表示,现在使用LF表示行结束
所以同一文件再不同操作系统中打开,内容格式可能会出现差异,这是行结束符不一致导致的。
三,漏洞检测
漏洞产生的先决条件:
服务器端使用head函数设置了响应头属性的情况下(代码审计)
if(isset($_GET["url"]) && ($_COOKIE["security"]!="1") && $_COOKIE["security_level"]!="2"))
{
//header函数设置响应头中的location的值
header("location:" .$_GET["url"]);
exit();
}
CRLF注入漏洞的本质和XSS有点相似,攻击者将而已数据发送给易受攻击的web应用程序,web应用程序将恶意数据输出在HTTP响应头中。(XSS一般输出在响应主体中)
CRLF注入漏洞的检测和XSS差不太多,通过修改HTTP参数或URL,注入恶意的CRLF,查看构造的恶意数据是否在响应头中输出。
四,漏洞利用
1,通过一个CRLF分割成另一个响应头,可以添加请求头属性,如Set-Cookie;
2,通过两个CRLF分割成响应体,传入的数据会直接将给浏览器执行,这样的话可以逃逸XSS过滤,因为这个数据不是POST传入的,而是服务器通过响应头生成的。
五,漏洞防御
过滤\r,\n之类的行结束符。