试验目的:哪些情况会导致java反序列化失败。
持久化到本地
public class Test {
private static String file = "/serialFile.txt";
public static void main(String[] args)throws Exception {
write();
//read();
}
static void write() throws Exception{
FileOutputStream os = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(os);
Student s = new Student();
s.setAge(20);
s.setName("test");
s.setState(State.TEST);
oos.writeObject(s);
oos.close();
}
static void read() throws Exception{
FileInputStream is = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(is);
Student s = (Student)ois.readObject();
System.out.println(s);
}
}
class Student implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
State state;
String name;
String id;
int age;
public void setState(State state) {
this.state = state;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String toString(){
StringBuffer str = new StringBuffer();
str.append("state:").append(state != null ? state.getValue() : "error").append(" ");
str.append("name:" + name).append(" ");
str.append("age:" + age).append(" ");
str.append("id:" + id);
return str.toString();
}
}
public enum State {
COMMON(1),TEST(2);
private int value;
private State(int value){
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
1.枚举类型实例删除,反序列化会有问题
//将 Test实例删除
public enum State {
COMMON(1);
private int value;
private State(int value){
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
Exception in thread "main" java.io.InvalidObjectException: enum constant TEST does not exist in class com.my.test.serializable.State
at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1704)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at com.my.test.serializable.Test.read(Test.java:34)
at com.my.test.serializable.Test.main(Test.java:16)
Caused by: java.lang.IllegalArgumentException: No enum const class com.my.test.serializable.State.TEST
at java.lang.Enum.valueOf(Enum.java:196)
at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1702)
... 8 more
2.减少一个属性,和方法,执行read() ,不会有问题
减少以下代码
String name;
public void setName(String name) {
this.name = name;
}
3.增加属性和方法,执行read(),不会有问题
//增加
String id;
//增加
public String getId() {
return id;
}
//增加
public void setId(String id) {
this.id = id;
}
4.将private static final long serialVersionUID = 1L;变成2,执行read()
Exception in thread "main" java.io.InvalidClassException: com.my.test.serializable.Student;
local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at com.my.test.serializable.Test.read(Test.java:34)
at com.my.test.serializable.Test.main(Test.java:16)
部分结论:
1.反序列化时如果是减少或增加属性(包括枚举),方法,不会有问题
2.如果要反序列化枚举实例时,程序端有该枚举类型但没有该实例,则抛错。
3.如果反序列化时,程序端原枚举类型增加了新的实例且原实例存在,不会抛错.
4.序列化版本号不对,抛错。
分享到:
相关推荐
1. **Java序列化机制**:Java对象序列化是通过实现`Serializable`接口来标记一个类可被序列化。`ObjectOutputStream`用于将对象写入流,`ObjectInputStream`用于从流中读取并反序列化对象。 2. **易受攻击的库**:...
在给定的链接"Java序列化机制(2)- serialVersionUID 实验"中,博主通过一个实验详细解释了`serialVersionUID`的作用和重要性。实验可能包括以下步骤: 1. 创建一个实现`Serializable`接口的简单类,并运行序列化...
### 基于混合分析的Java反序列化利用链挖掘方法 #### 一、引言与背景 2015年,Lawrence和Frohoff首次揭示了Java反序列化漏洞的存在及其潜在风险。此后不久,Breenmachine利用这一漏洞成功攻击了包括WebLogic、...
Java序列化是将Java对象转换为字节流的过程,以便可以存储在磁盘上或通过网络进行传输。这个过程对于持久化对象数据、跨进程通信和在网络上传输对象非常有用。在Java中,序列化是通过实现`Serializable`接口来完成的...
Java反序列化漏洞学习实践中的代码 Java反序列化漏洞学习实践一:从Serializbale接口开始,先弹个计算器 Java反序列化漏洞学习实践二:Java的反射机制(Java Reflection) Java反序列化漏洞学习实践三:理解java...
在Java世界里,为了方便地进行JSON的序列化(将Java对象转换为JSON字符串)和反序列化(将JSON字符串转换回Java对象),有多个库提供了强大的支持,其中包括Gson、Jackson、Fastjson以及LoganSquare。接下来,我们将...
实验结果表明,这种方法能够在多个实际Java应用中有效地挖掘反序列化利用链,提高了安全分析的效率和准确性。 总的来说,基于混合分析的Java反序列化利用链挖掘方法是针对Java应用安全的一种重要技术进步,它通过...
Java序列化漏洞是一种常见的安全问题,它出现在Java应用程序中,当对象被转化为字节流以便在网络间或存储中传输时。这种序列化过程如果处理不当,可能会导致远程代码执行(RCE)、信息泄露或者权限提升等严重后果。...
在Java中,反序列化是将之前序列化的对象状态恢复到可操作的Java对象的过程。然而,如果这个过程没有得到适当的控制,攻击者可以通过构造恶意的序列化数据来执行任意代码,从而导致服务器被控制。 JBOSS AS...
输入流对象 */ public ...虽然Java提供了一套默认的序列化机制,但通过自定义接口如FileSerializable,我们可以更好地控制序列化和反序列化的过程,满足特定需求。同时,使用序列化时需要注意安全性和版本兼容性问题。
【实验一对象序列化1】主要探讨的是Java中的序列化机制,这是Java中用于持久化对象状态的重要技术。序列化是指将对象的状态转化为字节序列的过程,而反序列化则是将字节序列恢复为对象的过程。这个过程允许对象在...
2. 配置序列化策略:限制允许反序列化的类,只接受可信的序列化数据,避免未经验证的数据输入。 3. 使用安全的序列化库:例如,可以考虑使用 Google 的 `Protocol Buffers` 或 `Java Object Streaming API (Java ...
实验内容包括从键盘接收用户输入并在屏幕上显示,读取并显示指定文本文件的内容,以及序列化和反序列化对象。 1. 数据流和Java流的层次结构 数据流是指数据传输的路径,Java中的I/O流分为字节流和字符流两大类,每...
- **Java序列化**:Java自带的标准序列化机制,简单易用,但相对较慢且序列化后的数据较大。 4. **Memcached与Tomcat整合**:文件名中提到了Apache Tomcat,这是一款流行的Java Servlet容器。在Tomcat中配置...
所以萌生了开发一个更加灵活的框架来扩展反序列化利用链,也就是当前这个试验品ysomap。 PS:YSOMAP项目为另一个项目的子项目,后续将开源该项目,敬请期待...... #2 原理 我将利用链切分成了两个部分payload和
当一个Java应用程序在处理不可信数据时,如果它进行了反序列化操作且未对用户可控的序列化代码进行适当的验证,那么攻击者可能通过构造恶意的序列化输入,触发非预期的对象创建,从而执行任意代码,对系统安全构成...
它使用文件作为数据存储介质,采用了B+树作为索引结构,并且利用了Java的序列化和反序列化技术来高效地处理对象存储和恢复。 首先,B+树是一种优化的多路搜索树,特别适合用于数据库和文件系统的索引存储。它的特点...
第二个实验部分涉及Java的序列化和反序列化机制。序列化是将对象转换为字节流的过程,便于存储或在网络上传输。`Serializable`接口是Java中实现序列化的标志,当一个类实现这个接口,它的实例就可以被序列化。在本例...
3. Shiro 反序列化:Shiro 是一个 Java 库,提供身份验证、授权、会话管理等功能。Shiro 反序列化是一种攻击方式,攻击者可以通过构造恶意的 serialized 数据,导致 Shiro 反序列化时执行恶意代码。 4. Fastjson 反...