java反序列化hello world
与php的不同点就是,java的反序列化中,或者说java的类,没有php那么多的魔术⽅法。但是java的反序列化时,使⽤的readObject⽅法是可以重写的,所有的java反序列化漏洞,也是出于这个重写的时候出现的问题。
package serialize;
import java.io.*;
class User implements Serializable {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Main {
public static void main(String[] args) throws Exception {
User user = new User();
user.setName("hello world");
byte[] serializeData = serialize(user);
FileOutputStream fout = new FileOutputStream("user.bin");
fout.write(serializeData);
fout.close();
/*
* ...
* ...
* ...
* 中间有一堆流程
*/
User user2 = (User) unserialize(serializeData);
System.out.println(user2.getName());
}
// 将对象序列化成字节流
public static byte[] serialize(final Object obj) throws Exception {
ByteArrayOutputStream btout = new ByteArrayOutputStream();
ObjectOutputStream objOut = new ObjectOutputStream(btout);
objOut.writeObject(obj);
return btout.toByteArray();
}
// 将字节流反序列化成对象
public static Object unserialize(final byte[] serialized) throws Exception {
ByteArrayInputStream btin = new ByteArrayInputStream(serialized);
ObjectInputStream objIn = new ObjectInputStream(btin);
return objIn.readObject();
}
}
这是一个正常地反序列化过程,不存在问题
反序列化漏洞形成原因
假设,在整个jvm环境中,存在这样⼀个类
import java.io.Serializable;
class Evil implements Serializable {
private String name;
public void setName(String name) {
this.name = name;

最低0.47元/天 解锁文章
1314

被折叠的 条评论
为什么被折叠?



