JAVA反序列化
开发者重写 readObject 方法,该 readObject 方法调用了别的方法,最终执行到了例如 Transform 方法的危险方法。
什么是反序列化漏洞
PHP 的反序列化和 java 的反序列化是两种不同的类型,序列化和反序列化本身没有漏洞点,只是为了实现数据的完整高效的传输。
PHP 反序列漏洞是由于类里面的魔术方法调用了某个函数,该危险函数又调用了别的函数,最终执行到了命令执行函数的位置。
JAVA 反序列化漏洞是由于开发者重写了 readObject 方法,该 readObject 方法方法调用了别的方法,最终执行到了例如 Transform 方法的危险方法。
1、使用java定义自己的类,继承笔记里的Person类,实例化自己的类调用一下talk函数
class extend_person
package test_java;
public class extend_person extends Person {
public extend_person() { } }
|
主函数
public class helloworld {
public helloworld() { }
public static void main(String[] args) { extend_person exp = new extend_person(); exp.talk(); } }
|

2、重写talk函数,再次调用
函数重写
package test_java;
public class extend_person extends Person {
public extend_person() { } public void talk() { System.out.println("这是 extend_person 类的 talk 方法"); }
}
|

3、编写自己的序列化反序列化函数,实现将自己名称的对象序列化保存到文件里,再反序列化输出
Person.java文件
package test_java;
import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable;
public class Person implements Serializable {
public int age; public String name; private void readObject(ObjectInputStream in) { try { Runtime.getRuntime().exec("calc"); in.defaultReadObject(); } catch (IOException e) { } catch (ClassNotFoundException e) { } }
}
|
主函数文件helloword.java
package test_java;
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream;
public class helloworld {
public helloworld() { }
public static void main(String[] args) { try { Person per = new Person(); per.age = 18; per.name = "john"; serialize(per, "wick.bin"); System.out.println("反序列化结果:" + deserialize("wick.bin")); } catch (Exception e) { } } public static void serialize(Object obj, String file_path) { try (FileOutputStream file_out = new FileOutputStream(file_path); ObjectOutputStream objt = new ObjectOutputStream(file_out)){ objt.writeObject(obj); } catch (IOException e) { } } public static Object deserialize(String file_path) { try (FileInputStream file_in = new FileInputStream(file_path); ObjectInputStream obji = new ObjectInputStream(file_in)){ return obji.readObject(); } catch (IOException e) { } catch (ClassNotFoundException e) { } return null; } }
|
wick.bin文件

反序列化结果输出

4、安装docker和docker-compose
安装docker
环境
CentOS 8
依赖安装
yum install -y yum-utils device-mapper-persistent-data lvm2
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
mv docker-compose /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
https://cr.console.aliyun.com/cn-beijing/instances/mirrors
mkdir -p /etc/docker vim /etc/docker/daemon.json
{ "registry-mirrors": [ "https://docker.1ms.run", // 毫秒镜像(推荐,速度最快) "https://dockerproxy.com", // 稳定代理,兼容性好 "https://hub.rat.dev" // 备用源,偶尔第一个抽风时用 ] }
|
由于centos8默认安装了podman(一个类似于 Docker 的开源容器工具)及其手册页(man pages)包 podman-manpages。
docker-ce-cli 软件包也包含了大量名称完全相同的手册页文件(例如 /usr/share/man/man1/docker-attach.1.gz, /usr/share/man/man1/docker-ps.1.gz 等)。
yum remove podman-manpages
yum remove podman buildah cockpit-podman podman-manpages
yum install -y docker-ce docker-ce-cli containerd.io
|

5、启动vulhub靶场的shiro反序列化漏洞,任选一个访问看一下效果


登录界面

6、任选一个容器将centos8宿主机的/home/day18目录映射到docker虚拟机的/home目录
mkdir /home/ceshi docker run -it -v /home/ceshi:/home 431217c1f2b1
|

docker exec -it 07e80635add9 /bin/bash
root@07e80635add9:/# cd home root@07e80635add9:/home# echo "rongqi" > rqi.txt
|

查看主机文件
[root@wickt ceshi]# cat rqi.txt
|
