java反序列化原理-Demo(一)
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,java反序列化原理-Demo(一)0x00 什么是java序列化和反序列?Java 序列化是指把 Java 对象转换为字节序列的过程便于保存在内存、文件、数据库中,ObjectOutputStrea
千家信息网最后更新 2025年01月21日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安全错误
数据库的锁怎样保障安全
怎么停止服务器
数据库中有且只有一个
vr软件开发用的软件
自学网络安全从哪入手
移动网络服务器和lp地址是什么
怎么注册光猫服务器
如何修复服务器
吃鸡怎么上国际服的服务器
青葱时代网络技术郑州
人工智能技术教育软件开发
红色报刊档案数据库账户
网络安全问题与信用问题
台南民宿软件开发
将网络安全的话题推上了
健康天津服务器怎么了
阿里云数据库的亮点是什么
关闭闪回数据库
中国网络安全立场
万兆网卡是目前服务器上最快的吗
干洗店管理系统数据库设计源码
简述数据库数据的安全措施
数据库系统的安全模型
数据库防火墙 部署
服务器ap
金山服务器安全软件
手机软件开发流行什么语言
java删除数据库表格
服务器分布式集群
沈阳智慧安全文化展厅软件开发
usgl2tp访问服务器