JAVA反序列化与Docker

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() {
// TODO Auto-generated constructor stub
}

}

主函数

public class helloworld {

public helloworld() {
// TODO Auto-generated constructor stub
}

public static void main(String[] args) {
extend_person exp = new extend_person();
exp.talk();

}

}

image-20250903161737152

2、重写talk函数,再次调用

函数重写

package test_java;

public class extend_person extends Person {

public extend_person() {
// TODO Auto-generated constructor stub
}

public void talk() {
System.out.println("这是 extend_person 类的 talk 方法");
}

}

image-20250903161912236

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) {
// TODO: handle exception
} catch (ClassNotFoundException e) {
// TODO: handle exception
}
}

}

主函数文件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() {
// TODO Auto-generated constructor stub
}

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) {
// TODO: handle exception
}

}

// 序列化
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) {
// TODO: handle exception
}
}

// 反序列化
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) {
// TODO: handle exception
} catch (ClassNotFoundException e) {
// TODO: handle exception
}
return null;
}

}

wick.bin文件

image-20250903163810781

反序列化结果输出

image-20250903163831752

4、安装docker和docker-compose

安装docker

环境

CentOS 8

依赖安装

# 注意虚拟机网络为NAT,查看自己地址是否为nat地址
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

# 安装docker
yum install -y docker-ce docker-ce-cli containerd.io

# 安装docker-compose
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

# 直接移除整个 podman 及其相关组件
yum remove podman buildah cockpit-podman podman-manpages

# 安装docker
yum install -y docker-ce docker-ce-cli containerd.io

image-20250906132255106

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

docker-compose up -d

image-20250906134517432

image-20250906135112850

登录界面

image-20250906134937233

6、任选一个容器将centos8宿主机的/home/day18目录映射到docker虚拟机的/home目录

mkdir /home/ceshi
docker run -it -v /home/ceshi:/home 431217c1f2b1

image-20250906140800127

docker exec -it 07e80635add9 /bin/bash

root@07e80635add9:/# cd home
root@07e80635add9:/home# echo "rongqi" > rqi.txt

image-20250906140748412

查看主机文件

[root@wickt ceshi]# cat rqi.txt 

image-20250906140905942

Author: wickt42
Link: http://example.com/2025/09/03/JAVA反序列化与Docker/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.