是否了解Java反序列化漏洞原理?
1 个回答
在自己的世界独善其身在别人的世界顺其自然。周通## 作用 - 说明 Java 对象与字节序列之间的转换机制。 - 解释反序列化漏洞为什么会在应用接收并恢复不可信对象数据时触发。 ## 原理 - **序列化**:把 Java 对象转换成字节序列,便于保存到文件、数据库或通过网络传输,通常通过 `ObjectOutputStream.writeObject()` 完成。 - **反序列化**:把字节序列重新恢复成 Java 对象,通常通过 `ObjectInputStream.readObject()` 完成。 - 类只有实现 `java.io.Serializable` 接口后才允许序列化;该接口是空接口,主要用于标记类可被 JRE 序列化。 - Java 允许类自定义以下方法: - `private void writeObject(ObjectOutputStream out)` - `private void readObject(ObjectInputStream in)` - 这些方法不是接口强制实现的方法,而是 Java 的约定方法;对象在序列化或反序列化时会被相应流程自动调用。 - 漏洞的根本原因在于:如果应用对**不可信的字节数据**执行反序列化,而恢复过程中会调用对象自定义的 `readObject()`,攻击者就可能通过构造恶意数据间接触发危险逻辑。 - 攻击者通常不能直接指定代码执行流程,只能控制序列化数据中的对象内容和结构;因此需要借助目标应用 classpath 中已有的可利用类或“gadget chain”,把反序列化过程串联到命令执行等危险操作。 - 例如某个可序列化类在 `readObject()` 中根据字段执行系统命令,攻击者把恶意命令放入该字段并构造序列化对象,服务端调用 `readObject()` 时就可能执行该命令。 - Apache Commons Collections 等库曾因存在可被串联利用的类,形成反序列化利用链。发布于 2026-10-27 08:05 •IP属地 陕西举报评论收藏
公众号进入网站体验更佳

