返回介绍

2 漏洞基本原理

发布于 2024-09-16 15:35:00 字数 1210 浏览 0 评论 0 收藏 0

2.1 序列化

序列化后的数据开头包含两字节的魔术数字: ACED 。接下来是两字节的版本号 0005 的数据。此外还包含了类名、成员变量的类型和个数等。

序列化的数据流以魔术数字和版本号开头,这个值是在调用 ObjectOutputStream 序列化时,由 writeStreamHeader 方法写入:

protected void writeStreamHeader() throws IOException {
  //STREAM_MAGIC (2 bytes) 0xACED 
  bout.writeShort(STREAM_MAGIC);
  //STREAM_VERSION (2 bytes) 5
  bout.writeShort(STREAM_VERSION);
}

2.2 反序列化

Java 程序中类 ObjectInputStreamreadObject 方法用来将数据流反序列化为对象。

readObject() 方法在反序列化漏洞中它起到了关键作用。如果 readObject() 方法被重写,反序列化该类时调用便是重写后的 readObject() 方法。如果该方法书写不当的话就有可能引发恶意代码的执行。

如:

public class Evil implements Serializable {
    public String cmd;
    private void readObject(java.io.ObjectInputStream stream) throws Exception {
        stream.defaultReadObject();
        Runtime.getRuntime().exec(cmd);
}

但是,实际中反序列化漏洞的构造比较复杂,而且需要借助 Java 的一些特性,如 Java 的反射。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文