Web安全-检测-CRLF

背景知识

在文本处理中, CR, LF, CR/LF是不同操作系统上使用的换行符.Dos和windows采用回车+换行CR/LF表示下一行,而UNIX/Linux采用换行符LF表示下一行,苹果机(MAC OS系统)则采用回车符CR表示下一行.CR用符号’r’表示, 十进制ASCII代码是13, 十六进制代码为0x0D; LF使用’n’符号表示, ASCII代码是10, 十六制为0x0A.所以Windows平台上换行在文本文件中是使用 0d 0a 两个字节表示, 而UNIX和苹果平台上换行则是使用0a或0d一个字节表示。
CRLF注入在OWASP 里面被称为HTTP拆分攻击(HTTP Splitting),CRLF是”回车 + 换行”(\r\n)的简称。在HTTP协议中,HTTP Header与HTTP Body是用两个CRLF分隔的,浏览器就是根据这两个CRLF来取出HTTP 内容并显示出来。所以,一旦我们能够控制HTTP 消息头中的字符,注入一些恶意的换行,这样我们就能注入一些会话Cookie或者HTML代码。
通过CRLF注入,攻击者可以实现HTTP请求走私(HTTP Request Smuggling)和HTTP响应拆分(HTTP Response Splitting)。
就http请求走私而言,这种漏洞通常出现在当服务器接收http请求并将该请求转发给其他服务器时,比如说代理和防火墙,这种漏洞将造成如下问题:

  • 缓存毒化–攻击者可以修改缓存中的内容然后不显示正常页面而显示恶意页面。
  • 防火墙逃逸–攻击者通过构造数据包来逃避安全检查,通常会利用CRLF和构造超大的数据包
  • 请求劫持–攻击者可以通过该利用获取HttpOnly的cookie和http认证数据,类似于xss但是不需要攻击者和黑客进行交互。
    对于http响应拆分,攻击者通过插入CRLF字符后就可以实现在响应头部中插入任意数据,控制响应的数据内容等。

举例

一般网站会在HTTP头中用Location: http://baidu.com这种方式来进行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: http://www.sina.com.cn

但如果我们输入的是

http://www.sina.com.cn%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,造成一个“会话固定漏洞”。
当然,HRS并不仅限于会话固定,还可以通过注入两个CRLF就能造成一个无视浏览器Filter的反射型XSS。

参考资料

http://byd.dropsec.xyz/2016/08/31/CRLF-injection漏洞/
https://evilanne.github.io/2016/06/21/CRLF注入/
https://zhuanlan.zhihu.com/p/22953209
https://wps2015.org/drops/drops/CRLF Injection漏洞的利用与实例分析.html

猜你喜欢

转载自blog.csdn.net/AG9GgG/article/details/83056682
今日推荐