欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

log4j 安全问题验证demo & CRLF注入漏洞

程序员文章站 2022-03-27 08:49:33
一、环境准备https://blog.csdn.net/weixin_42299862/article/details/111993837二、demo1、使用 @Log4j2 log.error() 打印异常日志是否会泄露敏感信息?https://www.cnblogs.com/huanghuanghui/p/11775731.htmlhttps://www.cnblogs.com/qlqwjy/p/7192947.html代码如下如果有红线语法错误,参考https://blog.csdn.n...

一、环境准备
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>

log4j 安全问题验证demo & CRLF注入漏洞
新建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
log4j 安全问题验证demo & CRLF注入漏洞
具体配置我用的是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

相关标签: 安全