log4j 安全问题验证demo & CRLF注入漏洞
一、环境准备
https://blog.csdn.net/weixin_42299862/article/details/111993837
下面是想写一个demo看两个问题,第一个问题是使用Log4j log.error() 打印异常日志是否会泄露敏感信息,第二个问题是log4j是否有日志注入问题。
二、demo
1、环境和代码
https://www.cnblogs.com/huanghuanghui/p/11775731.html
https://www.cnblogs.com/qlqwjy/p/7192947.html
先在pom.xml里增加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
新建test类,代码如下
package com.example.demo.service;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class test {
public static void main(String[] args) {
try {
int i = 1/0;
}
catch (Exception e) {
System.out.println("--------------------1");
e.printStackTrace();// 只能输出在控制台当中,日志文件看不到
System.out.println("--------------------2");
log.error(e.getMessage());// 只能输出简短的错误信息,不便于排错
System.out.println("--------------------3");
log.error(e.getStackTrace().toString());// 不能输出错误信息
System.out.println("--------------------4");
//用这个去打印日志,完整的日志信息会被打印在日志之中,相当于 e.printStackTrace();
log.error("test fail-",e);
System.out.println("--------------------5");
log.error(e.toString());// 只能输出简短的错误信息,不便于排错
System.out.println("--------------------6");
String a = "A\r\nB";
log.error(a); //log4j的日志注入问题
System.out.println("--------------------7");
String b = "A%0d%0aB";
log.error(b); //log4j的日志注入问题
}
}
}
resource中增加配置文件,具体是log4j.properties
具体配置我用的是https://www.cnblogs.com/qlqwjy/p/7192947.html
也可参考https://blog.csdn.net/zzq900503/article/details/87629782
2、实验结果
--------------------1
java.lang.ArithmeticException: / by zero
at com.example.demo.service.test.main(test.java:9)
--------------------2
11:07:15.304 [main] ERROR com.example.demo.service.test - / by zero
--------------------3
11:07:15.306 [main] ERROR com.example.demo.service.test - [Ljava.lang.StackTraceElement;@108c4c35
--------------------4
11:07:15.308 [main] ERROR com.example.demo.service.test - test fail-
java.lang.ArithmeticException: / by zero
at com.example.demo.service.test.main(test.java:9)
--------------------5
11:07:15.308 [main] ERROR com.example.demo.service.test - java.lang.ArithmeticException: / by zero
--------------------6
11:07:15.308 [main] ERROR com.example.demo.service.test - A
B
--------------------7
11:07:15.308 [main] ERROR com.example.demo.service.test - A%0d%0aB
Process finished with exit code 0
结论:
1、printStackTrace()方法直接将错误堆栈打印到控制台的System.err(日志文件中看不到),存在敏感信息泄露风险,由于控制台信息会占用系统内存,如果这个printStackTrace()可以被外界用户触发,还存在dos攻击风险。不要使用。
2、其他用法是否有敏感信息泄露问题可以写demo实际尝试。
3、\r\n注入到日志中,就有日志注入问题(回车换行产生两行日志),可以在打印日志前有一个过滤方法。message.replace('\n', '_').replace('\r', '_');
4、回车符(\r,%0d,CR)和换行符(\n,%0a,LF)
如果攻击者在request请求中,注入%0a%0d。浏览器/tomcat已经把%0a%0d变成了/r/n。这时候后台在处理的时候仍然是\r\n,不会遇到%0a%0d。
三、/r/n除了伪造日志,可造成的其他问题------》CRLF注入漏洞
CRLF注入漏洞源于应用程序未对用户提交的数据进行过滤。
危害:可以通过CRLF注入会话cookie、html代码。会造成cookie注入和xss。
https://blog.csdn.net/weixin_37968613/article/details/107470182
https://blog.csdn.net/Liuhuaijin/article/details/77449579?utm_source=blogxgwz6
本文地址:https://blog.csdn.net/weixin_42299862/article/details/111994732
上一篇: 2020最新Java面试题