目录
- 知识点
- 1
- 2
- 反序列化过程
- payload构造过程
- 1、反弹shell
- 1、ysoserial工具的使用
- webgoat实例
知识点
1
- 序列化就是把对象的状态信息转换为字节序列(即可以存储或传输的形式)过程
- 反序列化即逆过程,由字节流还原成对象
注: 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
Java中的API实现:
位置: Java.io.ObjectOutputStream
java.io.ObjectInputStream
序列化: ObjectOutputStream
类 --> writeObject()
注:该方法对参数指定的obj对象进行序列化,把字节序列写到一个目标输出流中
按Java的标准约定是给文件一个.ser扩展名
反序列化: ObjectInputStream
类 --> readObject()
注:该方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
2
PHP里主要是魔术方法来触发漏洞,JAVA主要是控制数据的问题。
补充知识点
下方的特征可以作为序列化的标志参考:
- 一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据。
- 或者如果以aced开头,那么他就是这一段java序列化的16进制。
反序列化过程
- 序列化和反序列化就是一种格式转换的过程,把对象转换成其他格式。
package 反序列化1;
import java.io.*;
class Person implements Serializable{//注意Person一定要继承Serializeable接口
String name;
int age;
String sex;
int stuld;
public Person(String name,int age,String sex,int stuld){
this.name=name ;
this.age=age;
this.sex=sex;
this.stuld=stuld;
}
}
public class SerializebleTest {
//Person对象序列化
private static void serialPerson() throws IOException{
Person person = new Person ("xiaodi",28,"男",101);
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(new File("d:/person.txt"))
);
oos.writeObject(person);
System.out.println("person 对象序列化成功");
oos.close();
}
//Person对象反序列化
private static Person deserialPerson() throws Exception{
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(new File("d:/person.txt"))
);
Person person = (Person)ois.readObject();
System.out.println("person 对象序列化成功");
return person;
}
public static void main (String[] args)throws Exception{
serialPerson();
Person person = deserialPerson();
System.out.println(person);
}
}
得到一个反序列化之后的结果:
payload构造过程
1、反弹shell
关于是否回显的问题(是否print输出到显示屏),我们需要进行反弹shell操作,避免不回显。
反弹命令的写法:windows Linux 暂略,以后更新
一般输出的结果他会进行一波base64,所以都要反序列化之后base64加密一下:
小脚本:
import base64
c=open("payload.bin","rb").read()
cc=base64.urlsafe_b64encode(c)
open("payload.txt","wt",encoding="utf-8").write(cc.decode())
1、ysoserial工具的使用
webgoat实例
上传一个ysoserial工具构造出的payload,再用base64编码一下就可以实现任意代码代码执行