Java 反序列化攻击(Java Deserialization Attack) 是一种常见的网络安全漏洞利用方式,主要发生在 Java 程序使用**对象序列化(Serialization)和反序列化(Deserialization)**机制时,攻击者通过构造恶意的序列化数据,在目标系统上执行任意代码或造成其他危害。
下面从原理到危害、例子和防御,系统地说明。
把 Java 对象转换成字节流,方便:
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(obj);
把字节流恢复成 Java 对象:
ObjectInputStream ois = new ObjectInputStream(in);
Object obj = ois.readObject();
⚠️ 关键点:
readObject() 会自动调用对象的反序列化逻辑,无需程序员显式调用方法。
Java 反序列化本身是“安全的机制”,问题在于:
反序列化时会自动执行对象中的逻辑
如果攻击者能控制反序列化的数据,并且:
readObject、hashCode、equals)就可能形成反序列化利用链(Gadget Chain),最终执行任意代码。
readObject()这是最著名的 Java 反序列化攻击案例。
InvokerTransformerRuntime.getRuntime().exec("命令")简化逻辑:
反序列化对象
→ 调用 Transformer
→ 反射调用方法
→ 执行系统命令
影响:
Object evil = ChainedTransformer(
new InvokerTransformer("exec", ...)
);
byte[] data = serialize(evil);
sendToServer(data);
服务器一旦反序列化:
readObject(data); // 命令被执行
ObjectInputStream 直接反序列化不可信数据| 库 | 问题 |
|---|---|
| Apache Commons Collections | 命令执行 |
| Fastjson | 自动类型反序列化 |
| XStream | XML 反序列化 |
| Jackson | 多态类型处理 |
最重要原则
// ❌ 危险
Object obj = ois.readObject();
Java 9+ 支持:
ObjectInputFilter filter = info ->
info.serialClass() != null &&
info.serialClass().getName().startsWith("com.safe.")
? Status.ALLOW : Status.REJECT;
ois.setObjectInputFilter(filter);
readObject 执行危险逻辑Java 反序列化攻击 = 不可信数据 + 自动执行对象逻辑 + 危险类利用链
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。