Skip to content

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

image-20260226170901855

环境搭建

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 启动的相关流程

Reference

springboot环境下的写文件RCE

fastjson 1.2.80 SpringBoot 新链

fastjson写文件挑战2——两个fastjson链