Java反序列化是将字节流还原为对象的过程,危险在于盲目反序列化不可信数据会触发恶意代码执行;核心入口是ObjectInputStream.readObject(),风险源于默认不校验类名且易被gadget链利用;防范需禁用原生方案或启用白名单、JDK序列化过滤等机制。

Java反序列化,简单说就是把一串字节(比如从网络、文件或数据库读来的数据)还原成内存中的Java对象。这个过程本身是中性的,但危险在于:如果程序盲目地对不可信的输入执行反序列化,攻击者就可能构造恶意字节流,让JVM在还原过程中触发非预期代码,比如执行命令、读取文件、连接外网等。
Java原生序列化靠 java.io.Serializable 接口标记可序列化的类,序列化后生成二进制流;反序列化则依赖 ObjectInputStream.readObject() 方法——它会按协议解析字节流,重建对象图,并自动调用特定方法(如 readObject、readResolve),甚至触发构造器和字段赋值。
问题不在于反序列化技术本身,而在于很多老系统把反序列化当作“通用数据传输协议”来用,比如用它传用户ID、配置项、甚至整个业务对象,却没校验来源。一旦攻击者能控制输入字节流,就能绕过正常业务逻辑,直达 JVM 底层行为。
最直接有效的做法,是避免对不可信数据使用原生 Java 反序列化。如果必须用,就加管控层。
立即学习“Java免费学习笔记(深入)”;
看代码里有没有对用户可控输入调用了 readObject;看堆栈里是否频繁出现 ObjectInputStream、AnnotationInvocationHandler、BadAttributeValueExpException 等关键词;用 ysoserial 生成测试 payload 发包验证。
基本上就这些。理解反序列化,关键是抓住“字节→对象→方法触发”这条链,以及“谁控制输入、谁决定加载哪个类”这两个安全边界。不复杂,但容易忽略。
以上就是Java反序列化如何理解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号