JavaSec 17- FastJson 读写文件与 RCE In SpringBoot
约 668 字大约 2 分钟
Java
2026-02-27
前言
一边写文章一边让 opus 4.6 继续帮我分析一下预期解的可能,转动老虎机抽奖这一块(最后抽到了另一个非预期,顺便分析了几条链子,ai 王朝了)
寒假的末尾看到了珂师傅发的关于 fastjson 写文件挑战2,上一期在漫漫安全路公众号发的挑战1一直没来得及做。
Fastjson 我可能也就是一年之前略微分析过一些原生反序列化的内容(现在已经忘差不多了),至于版本探测,不同版本之间的利用与修复也只是看过总结与 POC,读写文件之类的也只是听说过但没有深究,因为感觉现在似乎已经过了当年 fastjson 研究盛行的阶段,这次来学习一些。
感谢 jsjcw 师傅的链子让我非预期解出了题目,不愧是能发现缓存 InputStream 的人,而且看起来我们都采用了覆盖 jdk lib 路径下未加载的 so 去实现 RCE

环境搭建
jdk8 & jdk11 fastjson 1.2.78
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>CVE-2022-25845-In-Spring</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.6.6</version>
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.5</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.29.1-GA</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.6</version>
</plugin>
</plugins>
</build>
</project>期望类与缓存
这次赛题的 fastjson 版本为 1.2.78 也就是比较高的版本,在开始后续的分析前,需要先行了解在后续所有利用中最重要的期望类与缓存这块内容
思路来源于 2024年 geekcon jsjcw 分享的 SpringBoot 之殇,fastjson 反序列化符合条件的期望类时,会将setter参数、public字段、构造函数参数加到缓存中。
FastJson 写文件
FastJson 读文件
Springboot 环境下的写文件 RCE
在 RCE 之前我们先回顾一些类加载和 JVM 启动的相关流程