告别脚本小子系列丨JAVA安全(7)——反序列化利用链(中)

news2025/1/23 7:02:31

0x01 前言

距离上一次更新JAVA安全的系列文章已经过去一段时间了,在上一篇文章中介绍了反序列化利用链基本知识,并阐述了Transform链的基本知识。Transform链并不是一条完整的利用链,只是CommonsCollections利用链中的一部分。当然并不是所有的CC链都需要用Transform链。

为了更方便的理解CC链,我们并不会按照顺序来阐述所有的链,而是按照链的难易程度,由易到难。

往期推荐

1

告别脚本小子系列丨JAVA安全(1)——JAVA本地调试和远程调试技巧

2

告别脚本小子系列丨JAVA安全(2)——JAVA反编译技巧

3

告别脚本小子系列丨JAVA安全(3)——JAVA反射机制

4

告别脚本小子系列丨JAVA安全(4)——ClassLoader机制与冰蝎Webshell分析

5

告别脚本小子系列丨JAVA安全(5)——序列化与反序列化

6

告别脚本小子系列丨JAVA安全(6)——反序列化利用链(上)

0x02 CommonsCollections5链

CommonsCollections5链是整个CC链中最简单的一条链,通过BadAttributeValueExpException类的readObject方法触发反序列化的过程,最终调用Transform链来达到命令执行的效果。

在ysoserial的环境中调试CommonsCollections5链的方式很简单,如图2.1所示。

图2.1 使用ysoserial生成反序列化利用链

直接调用就会执行弹出计算器的命令,跟踪run方法可以查看代码执行逻辑,如图2.2所示。

图2.2 在ysoserial中的序列化和反序列化过程

在ysoserial的run方法中既有序列化的过程,也有反序列化的过程。所以调用run方法因为反序列化的过程导致会执行对应的恶意代码,弹出计算器。

在很多情况下需要保存反序列化对象到文件,可以通过在run方法中添加文件保存方法即可,如图2.3所示。

图2.3 保存序列化字节码对象到文件

通过上面的方式可以直接把生成的序列化字节码对象保存到文件cc.ser,查看文件内容,如图2.4所示。文件中开头的字符是aced0005,符合序列化文件的标准特征。

图2.4 通过xxd查看序列化文件保存的内容

通过上面的方式可以利用ysoserial生成标准的CommonsCollections5利用链对应的payload,下一步会继续对CommonsCollections5利用链的调用过程进行分析。

通过debug的方式可以查看整个CommonsCollections5利用链的栈调用过程,如图2.5所示。

图2.5 CommonsCollections5利用链的栈调用过程

在图2.5中,红框2对应的过程阶段是属于Transform链的调用过程,在上一篇文章中已经进行详述。红框1对应的过程阶段是属于CommonsCollections5特有的调用过程,也是属于本文的重点部分内容。

反序列化的起始点是javax.management.BadAttributeValueExpException类的readObject方法,如图2.6所示。

图2.6 调用BadAttributeValueExpException类的readObject方法

从图2.6可以看出readObject方法首先获取字节流类(也就是本类)对应的val字段,然后基于多个判断,最终下一步操作是val字段对应的toString方法。这里有一点需要注意的是判断逻辑中要求System.getSecurityManager()为null,也就是不能开启SecurityManager模式。

在下一步的调用栈中是调用了org.apache.commons.collections.keyvalue.TiedMapEntry的toString方法,也就是需要把上一步的val字段类型赋值为TiedMapEntry类。在TiedMapEntry类的toString方法中调用了getValue方法,如图2.7所示。

图2.7 TiedMapEntry类的toString方法

继续跟踪getValue方法,如图2.8所示。

图2.8 调用map接口的get方法

从图2.8可以看出,这里调用了java.util.Map接口的get方法。所有只要找到一个继承自java.util.Map接口的类的get方法中存在恶意调用即可。在CommonsCollections5链中找到的恶意类是org.apache.commons.collections.map.LazyMap类,如图2.9所示。

图2.9 LazyMap类的get方法调用

从图2.9可以看出LazyMap类的get方法会调用org.apache.commons.collections.Transformer类的transform方法。在上一篇文章的内容中已经讲到在反序列化过程中如果可以调用transform方法,那么就可以通过transform方法来执行系统命令,也就可以达到RCE的效果。

实际上要编写真正可利用的EXP远比基于栈调用来分析更加复杂,因为在编写EXP的过程中,需要考虑每一步栈调用的过程中的逻辑判断条件,这并不是一件简单的事情。

一般来说反序列化利用链代码的编写是倒着来写的,首先是transform链的构造,如果某个类可以调用transformChain的transform方法,则可以执行命令,如图2.10所示

图2.10 通过调用Transformer类的transform方法调用执行命令

注释transform方法调用,继续倒序编写EXP。如果某个类可以调用LazyMap类的get方法,则可以执行系统命令,如图2.11所示。

图2.11 通过调用LazyMap类的get方法执行命令

注释LazyMap的get方法调用,继续倒序编写EXP。如果某个类可以调用TiedMapEntry类的toString方法,则可以执行系统命令,如图2.12所示。

图2.12 通过调用TiedMapEntry类的toString方法执行系统命令

注释TiedMapEntry的toString方法调用,继续倒序编写EXP。找到javax.management. BadAttributeValueExpException类的readObject方法中存在toString的方法调用,模拟反序列化过程,执行命令,如图2.13所示。

图2.13 模拟BadAttributeValueExpException类的反序列化过程执行命令

这样就完整的复现和分析了CommonsCollections5利用链,从图2.13的payload中可以看出CommonsCollections5利用链中没有复杂的逻辑处理,适合新手入门java反序列化漏洞学习。

0x03 CommonsCollections7链

CommonsCollections7链是一条和CommonsCollections5链很像的利用链,最终的结果都是通过LazyMap的get方法调用Transform链来执行命令,调用栈如图3.1所示。

图3.1 CommonsCollections7利用链

如图3.1所示,其中红框部分和CommonsCollections5链是完全一样的,区别在于CommonsCollections7链是通过Hashtable类readObject方法一步步调用AbstractMap类的equals方法来调用的。

由于分析调用链的方式基本相同,所以不再对这条链进行分析。

0x04 结论

CommonsCollections利用链中有多条利用链都涉及到Transform链,包括CC1、CC5、CC6、CC7,其中的调用过程都非常相似。但是并不是所有的CC链都是基于Transform实现的命令执行,在下一篇文章中会讲到其他的利用链,会有更加复杂的应用方式。

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

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

相关文章

对制造企业来说,该怎么样去选择合适的CRM系统?

随着互联网和数字化技术的发展,CRM(Customer Relationship Management,客户关系管理)系统正越来越被企业所重视。随之而来的是市场上各种不同类型、功能和价格的CRM系统。对制造企业而言,选择合适的CRM系统可以使企业更好地管理客户关系&…

01 【Sass的安装使用】

1.介绍 1.1 CSS预处理技术,及种类介绍 什么是css预处理技术 CSS 预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只…

【Makefile】笔记

正点原子Linux驱动13.4.1节,通用Makefile疑难点解释 聊聊 SOBJS : $(patsubst %, obj/%, $(SFILENDIR:.S.o)) 的作用 聊聊变量替换语法 在 Makefile 中,变量替换语法可以用来对变量的值进行修改和转换。有以下几种不同的变量替换语法: $(va…

二分类结局变量Logistic回归临床模型预测(一)——介绍

本节讲的是二分类结局变量的临床模型预测,与之前讲的Cox回归不同,https://lijingxian19961016.blog.csdn.net/article/details/124088364https://lijingxian19961016.blog.csdn.net/article/details/124088364https://lijingxian19961016.blog.csdn.net/…

C++类与对象this指针

文章目录 前言一,类1.类的引入2.类的定义3.类的作用域4.类的访问限定符及封装封装访问限定符面试题 二,this指针1.this指针定义2.this指针的特性 前言 从此篇往后,开始了C的类和对象的篇章,嗯就说这么多 一,类 1.类的…

Microsoft Forms的應用(文行版)

Microsoft Forms 功能是發起大眾投票及反饋數據的軟件。 首先要開啟Microsoft Forms 先要取得Microsoft Teams 的應用程式,在下載Microsoft Teams 後,可在最左邊的工具列選擇《應用程式》,然後從中開啟Microsoft Forms 就可以了。 看到Micr…

Java如何生成随机数?要不要了解一下

目录 前言一、Random类介绍二、Random类生成随机数1.生成随机数2.nextInt()方法 三、使用场景四、官方提示总结 前言 我们在学习 Java 基础时就知道可以生成随机数,可以为我们枯燥的学习增加那么一丢丢的乐趣。本文就来介绍 Java 随机数。 一、Random类介绍 在 Ja…

C++篇----构造函数和析构函数

在很多时候,当写了初始化,动态开辟的,需要写销毁函数,写了销毁函数之后,但是却忘记了调用这些函数,忘记调用初始化函数还好,编译器会报错,但是如果是忘记调用销毁函数,那…

社科院与美国杜兰大学金融管理硕士项目——选择在职读研是正确的吗

这个世界上,根本没有正确的选择。我们只不过要努力奋斗,使当初的选择变得正确。最近有咨询项目的同学总是在纠结是否要在职读研,在职读研是否是一条正确的路。当我们为此纠结时,其实只有一条路,那就是选择向前走。往前…

有我和另一个00后卷王后,公司老油条们破防了吗?

今年软件测试行业的内卷现象越来越明显,比2022年疫情那会更甚,越来越多的人涌入这个行业,而想要获得更好的待遇和机会,不断提升自己的技能栈成为了测试老油条不得不面对的问题。 不论是哪个级别的测试工程师,面试官都…

络达开发---- AB1562x左右两侧同一按钮不同功能

开发平台:AB1562X SDK版本:V1.5.2 说明:AB1562X支持TWS,左右两个的耳机的按钮在硬件上是芯片的同一个IO口;那如何实现左右按键对应动作A,右侧按钮对应动作B呢?即左右两侧同一按钮的…

【创建一个网页,实现猜数字游戏】

要求如下 逻辑如下: 一个button按钮第二行中,打印“请…数字” 然后一个 输入文本框 然后一个 按钮第三行 打印 “已经猜的次数” 然后打印 猜的次数结果显示 猜大了 猜小了 猜对了 在script中 获取button按钮、输入的数据、记录count的值&#xff…

vue3——咸鱼仔

vue3——咸鱼仔 vue3——咸鱼仔P1.前言 【00:45】P2.创建项目 【02:09】P3.代码格式化 【01:37】P4.commit规范 【01:57】P5.强制commit 【02:41】P6.强制代码规范 【01:03】P7.按需导入elementplus 【02:58】P8.vue3.2新特性 【01:42】P9.初始化项目 【02:47】P10.登录页面静态…

融合开源软件治理经验,助力科技企业规避开源风险

随着开源软件的普及,越来越多的科技企业依赖开源软件实现业务的高速发展,但开源软件存在的安全合规问题,已成为科技企业面临的主要风险之一。 开源网安十年发展,通过为百度、大疆、金蝶等科技企业提供优质的软件安全产品与服务&a…

【虚幻引擎|UE4】TArray在C++中的使用

简介 TArray 类似于STL的vector,可以自动扩容,因为提供了相关操作函数,所以当作队列、栈、堆来使用也很方便,是UE4中最常用的容器类。其速度快、内存消耗小、安全性高。TArray 类型由两大属性定义:元素类型和可选分配…

smardaten社区版/专业版发布,查看特性与区别!

为满足个人和中小团队开发者需求,近期smardaten正式推出社区版与专业版,其中社区版为免费版本,支持一键下载安装。 值得一提的是,本次社区版和专业版,均支持独立私有部署,并进行商业应用交付。 熟悉smard…

Linux网络——Shell编程之条件语句—if 、case

Linux网络——Shell编程之条件语句—if 、case 一、条件测试1.test命令2.文件测试3.整数值比较4.逻辑测试 二、if语句1.单分支结构2.双分支结构3.多分支结构4.实践操作 三、case分支语句1.case多分支结构2.实践操作 一、条件测试 1.test命令 测试表达式是否成立,若…

信息收集(二)IP信息收集

信息收集(一)域名信息收集 什么是CDN? 内容分发网络(CDN): 是指企业利用分布在不同区域的节点服务器群组成流量分配管理平台,为用户提供内容分散存储和高速缓存服务 在渗透测试过程中&#x…

大数据好学么

大数据本质上是海量数据。 以往的数据开发,需要一定的Java基础和工作经验,门槛高,入门难。 如果零基础入门数据开发行业的小伙伴,可以从Python语言入手。 Python语言简单易懂,适合零基础入门,在编程语言…

kafka集群模拟单节点故障

这里通过kafka manage来展示节点宕机效果 现在三台主机节点均正常 topic正常识别到三个broker leader也均匀分配到了三个broker上 现在把节点id为0的主机模拟宕机 可以通过以上两张图片看到每个topic现在只识别到了两个broker节点,broker id为0的节点已经被剔除掉了 isr列…