CRLF注入
CRLF注入
【漏洞介绍】
CRLF注入可以将一条合法日志拆分成两条,甚至多条,使得日志内容令人误解,对日志审计造成很大的困难。
或者将HTTP消息头注入恶意换行,造成会话固定、不安全重定向和XSS漏洞。
【漏洞原理】
CRLF的含义 是“carriage return/line feed”,意思就是回车/换行。这是两个ASCII字符,就是回车(CR, ASCII 13, \r) 、换行(LF, ASCII 10, \n)。\r\n这两个字符是用于表示换行的,其十六进制编码分别为0x0d、0x0a,URL编码分别为%0d、%0a。CRLF在Windows中广泛用来标识一行的结束。而在Linux/UNIX系统中只有换行符。 CR和LF组合在一起即CRLF命令,它表示键盘上的"Enter"键(可以用来模拟回车键)。
由于CRLF可以分隔内容,如果在记录的日志中包含未经校验的不可信数据,则可能导致日志注入漏洞。恶意用户会插入伪造的日志数据,从而让系统管理员误以为这些日志数据是由系统记录的。另外在HTTP协议中,HTTP Header与HTTP Body是用两个CRLF分隔的,浏览器就是根据这两个CRLF取出HTTP内容并显示。所以,一旦能够控制HTTP消息头中的字符,注入一些恶意的换行,如注入新的Set-Cookie、Location字段或者注入恶意的javascript代码等,可能导致会话固定,不安全重定向和XSS漏洞。
【挖掘思路】
通过对所有用户可以输入数据的参数进行测试,查看请求相应响应头和响应体内容是否包含不可信数据及对不可信数据的过滤是否安全。
【挖掘方法】
如果在记录的日志中包含未经校验的不可信数据,则可能导致日志注入漏洞。恶意用户会插入伪造的日志数据,从而让系统管理员误以为这些日志数据是由系统记录的。例如,用户可能通过输入一个回车符或一个换行符(CRLF)来将一条合法日志拆分成两条日志,使得日志内容可能令人误解。日志注入一般不会引起服务功能性的损害,而主要是作为一种辅助攻击手段,在日志中添加信息,误导运维人员对日志的审计。
如果在响应中存在未经校验的不可信数据,如响应头中或者响应内容中,数据可被用户控制,则可以利用CRLF自定义响应头内容,构造非法响应头信息,从而可以造成会话固定、不安全重定向等漏洞。用户可控的数据在响应体中,则可以构造响应内容进行XSS攻击。