千家信息网

java反序列化原理-Demo(一)

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,java反序列化原理-Demo(一)0x00 什么是java序列化和反序列?Java 序列化是指把 Java 对象转换为字节序列的过程便于保存在内存、文件、数据库中,ObjectOutputStrea
千家信息网最后更新 2026年11月01日java反序列化原理-Demo(一)

java反序列化原理-Demo(一)

0x00 什么是java序列化和反序列?

Java 序列化是指把 Java 对象转换为字节序列的过程便于保存在内存、文件、数据库中,ObjectOutputStream类的 writeObject() 方法可以实现序列化。
Java 反序列化是指把字节序列恢复为 Java 对象的过程,ObjectInputStream 类的 readObject() 方法用于反序列化。

0x01 java反序列漏洞原理分析

首先先定义一个user类需继承Serializable

package test;import java.io.IOException;import java.io.Serializable;public class user implements Serializable {    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}   

编写一个测试类,生成一个user对象,将其序列化后的字节保存在硬盘上,然后再读取被序列化后的字节,将其反序列化后输入user的name属性

package test;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class test1 {    public static void main(String[] args) {        try {            FileOutputStream out =new FileOutputStream("d:/1.bin");            ObjectOutputStream obj_out = new ObjectOutputStream(out);            user u = new user();            u.setName("test");            obj_out.writeObject(u);            //利用readobject方法还原user对象            FileInputStream in = new FileInputStream("d:/1.bin");            ObjectInputStream ins = new ObjectInputStream(in);            user u1 = (user)ins.readObject();             System.err.println(u1.getName());        } catch (FileNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

运行后输出name属性:test

为了构造一个反序列化漏洞,需要重写user的readObjec方法,在改方法中弹出计算器:
重写readObjec后的user类:

package test;import java.io.IOException;import java.io.Serializable;public class user implements Serializable {    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    private void readObject(java.io.ObjectInputStream in) throws ClassNotFoundException, IOException {        in.defaultReadObject();        Runtime.getRuntime().exec("calc.exe");    }}   

再次运行测试类,发现计算器已经弹出:

只需要修改Runtime.getRuntime().exec("calc.exe");中的calc.exe即可执行任意命令

0x02 总结

产生反序列化漏洞的前提是必须重写继承了Serializable类的readObjec方法

参考连接:
http://www.freebuf.com/vuls/170344.html

序列 方法 字节 对象 漏洞 原理 属性 计算器 过程 测试 运行 内存 再次 前提 命令 数据 数据库 文件 硬盘 分析 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小米移动互联网科技园 深圳市人人互联网科技有限公司 中国互联网科技工作委员会毛军 新华互联网科技学校 重生之互联网科技帝国 科技和互联网公司 字节跳动和互联网科技 互联网企业和科技型企业 湖南诚度互联网科技有限公司 岳阳华臻互联网科技有限公司 青岛科技大学互联网大赛研究生 宜昌元轩互联网科技有限公司 国大互联网教育科技有限公司工作 996高科技互联网公司 广州富喜互联网络科技 广东鹅鹅鹅互联网科技有限公司 玉溪新华互联网科技怎么选 山东蛋芒互联网科技有限公司 广东猫王互联网科技有限公司电话 科技发展第三阶段互联网时代 湖南永感互联网科技有限公司 苏州找大状互联网科技有限公司 互联网科技公司税收优惠 艾特科技互联网 凡科互联网科技 互联网科技网站 互联网科技宣传片 互联网科技教育视频 恒生互联网科技指数跳水 佛山市拉法互联网科技有限公司
0