CRLF注入

发布时间 2023-03-23 16:33:25作者: 少年阿丁

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)来将一条合法日志拆分成两条日志,使得日志内容可能令人误解。日志注入一般不会引起服务功能性的损害,而主要是作为一种辅助攻击手段,在日志中添加信息,误导运维人员对日志的审计。
Step1:白盒测试日志注入主要搜索和日志打印相关的关键字:
    Java关键字:
    logger.info 、logger.error、logger.debug、logger.warn、log.等
    通过关键字,定位日志输出代码
    Step2:查看代码是否会输出外部参数,如果没有,检查下一处;如果输出外部参数的值,需检查外部参数是否有做白名单校验或其他安全校验(如:过滤各种换行符\r\n、%0d%0a等),若没有,则存在CRLF日志注入漏洞。