java安全-FastJson流程分析
FastJson调用流程

可视化链接:http://101.200.184.201:7070/fastjson/
一、基本使用
1.Fastjson 详解
2.核心功能
1.序列化(Java 对象 → JSON 字符串)
1 | import com.alibaba.fastjson.JSON; |
2.反序列化(JSON 字符串 → Java 对象)
1 | String json = "{\"name\":\"Eaton\",\"age\":20}"; |
3.JSONObject / JSONArray 操作
1 | JSONObject obj = new JSONObject(); |
3.漏洞产生
@type是 Fastjson 在 JSON 中嵌入的一个特殊元字段
具体作用场景
1 | // 父类引用,实际存的是子类对象 |
本质用途:解决多态反序列化问题,让父类/接口类型的字段能正确还原为具体子类
二、内部具体执行流程
1.识别Type并加载类
1 | parseObject |
JSONObject student = JSON.parseObject(jsonString);
com/alibaba/fastjson/JSON#parseObject

com/alibaba/fastjson/JSON#parse
1 | public static Object parse(String text) { |
com/alibaba/fastjson/JSON#parse
com/alibaba/fastjson/parser/DefaultJSONParser#parse
com/alibaba/fastjson/parser/DefaultJSONParser#parseObject

接着继续执行

2.类初始化详解
1 | getDeserializer |
1 | ObjectDeserializer deserializer = config.getDeserializer(clazz); |
com/alibaba/fastjson/parser/ParserConfig#getDeserializer

com/alibaba/fastjson/parser/ParserConfig#getDeserializer

com/alibaba/fastjson/parser/ParserConfig#createJavaBeanDeserializer

具体如下
com/alibaba/fastjson/util/JavaBeanInfo#build详解
紧接着回到createJavaBeanDeserializer方法
继续回到

与此同时,发现一个极大的问题,就是这里的临时类加载器无法去在我们的idea中去调试,对于下面的调试造成极大的麻烦
3.内置javabean类初始化

setter 方法

getter 方法

com/alibaba/fastjson/util/JavaBeanInfo#add
1 | add(fieldList, new FieldInfo(propertyName, method, null, clazz, type, 0, 0, 0, annotation, null, null)); |
这里有一个new方法,这里出现问题

因此,只需要,我们创建的类中有一个这个方法
1 | public Map getMap(){ |
即可成功实现内置类加载器

4.具体调试过程
接上回,已经到了创建内置初始化器
1 | if (!asmEnable) { |
com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer#JavaBeanDeserializer
1 | public JavaBeanDeserializer(ParserConfig config, Class<?> clazz, Type type){ |
这里还会调用一遍之前的 build 方法,不在赘述
com/alibaba/fastjson/parser/ParserConfig#getDeserializer

com/alibaba/fastjson/parser/DefaultJSONParser#parseObject

接着进行具体的反序列化方法

类实例化

类赋值

然后就结束啦
后面是栈的返回

5.getter调用流程
调用get具体流程
com/alibaba/fastjson/JSON#parseObject
com/alibaba/fastjson/JSON.#toJSON

com/alibaba/fastjson/JSON#toJSON

com/alibaba/fastjson/serializer/JavaBeanSerializer#getFieldValuesMap

com/alibaba/fastjson/serializer/FieldSerializer#getPropertyValue

com/alibaba/fastjson/util/FieldInfo#get

成功调用
总体如下
整体是一个大状态机循环:
1 | JSON Token 流:{ "name":"Eaton", "age":20 } |
1 | if (token == JSONToken.NULL) → 直接返回 null |
1 | for (int fieldIndex = 0; ; fieldIndex++) { |
6.恶意 get 方法


三、尝试利用一下
1 | String s = "{\"@type\":\"Test\",\"cmd\":\"calc\"}"; |
1 | public class Test { |

FastJSON 在反序列化时,不依赖字段存在,而是扫描目标类的 setXxx() 方法:
1 | JSON key: "cmd" |
完整执行流程
1 | JSON.parseObject(s) |
FastJSON 在 JavaBeanDeserializer 中的匹配逻辑大致是:
1 | // 伪代码还原 |