组件介绍
Apache Commons 当中有⼀个组件叫做 Apache Commons Collections ,主要封装了Java 的 Collection(集合) 相关类对象,它提供了很多强有⼒的数据结构类型并且实现了各种集合工具类。
作为Apache开源项⽬的重要组件,Commons Collections被⼴泛应⽤于各种Java应⽤的开发,⽽正 是因为在⼤量web应⽤程序中这些类的实现以及⽅法的调⽤,导致了反序列化⽤漏洞的普遍性和严重性。
Apache Commons Collections中有⼀个特殊的接口,其中有⼀个实现该接口的类可以通过调用 Java的反射机制来调用任意函数,叫做InvokerTransformer。
环境
-
CommonsCollections <= 3.2.1
-
java < 8u71(我是用的是8u66)
导入Maven依赖
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
当然也可以 用传统的 lib
包下导入add as a library
CC1链 利用过程分析:
0x01 Transformer接口
Transformer
是一个接口类,提供了一个对象转换方法transform(接收一个对象,然后对对象作一些操作并输出)
:
package org.apache.commons.collections;
public interface Transformer {
public Object transform(Object input);
}
该接口的重要实现类有:ConstantTransformer
、invokerTransformer
、ChainedTransformer
、TransformedMap
。
ConstantTransformer类
关键代码如下:
接受一个对象返回一个常量,无论接收什么对象都返回 iConstant
这个常量在构造函数当中
ChainedTransformer类
当传⼊的参数是⼀个数组的时候,就开始循环读取,对每个参数调⽤ transform ⽅法,从⽽构造出 ⼀条链。
它赋值时会传入一个要调用方法的数组,然后将传入的方法链式(前一个的输出作后一个的输入)调用。
InvokerTransformer类
我们先看一下它的 transform 方法,传入一个对象,然后反射调用。方法值,参数类型,参数都是可控的。
为什么说是可控的呢?我们看它的构造方法就会明白。
这里其实就是一个很标准的任意方法调用。
例子1:
利用该方法弹出计算器:
import org.apache.commons.collections.functors.InvokerTransformer;
public class demo01 {
public static void main(St