96SEO 2026-02-20 08:48 2
但是#xff0c;Fastjson在序列化及反序列化的过…01漏洞编号

CVE-2022-25845CNVD-2022-40233CNNVD-202206-1037二、Fastjson知多少
Bean序列化为JSON字符串这样得到的字符串就可以通过数据库等方式进行持久化了。
但是Fastjson在序列化及反序列化的过程中没有使用Java自带的序列化机制而是自定义了一套机制。
对于JSON框架来说想要把一个Java对象转换成字符串有两种选择
在我们常用的JSON序列化框架中Fastjson和Jackson将对象序列化成Json字符串时是通过遍历该类中所有的Getter方法来进行的。
而Gson不是这么做的它是通过反射遍历该类中的所有属性并把其值序列化为Json
//所有网络安全全套资料免费领取加w:anquan455领取~当我们对它进行序列化时Fastjson会扫描其中的Getter方法即找到getName和getFruit这时就会将Name和Fruit两个字段的值序列化到JSON字符串中。
那么问题来了上面定义的Fruit只是一个接口序列化的时候Fastjson能将属性值正确序列化出来吗如果可以的话反序列的时候Fastjson会把这个Fruit反序列化成什么类型呢
System.out.println(toJSONString
jsonString);以上代码比较简单我们创建了一个store为它指定了名称并创建了Fruit的子类型Apple然后将store用JSON.toJSONString进行序列化可以得到以下JSON内容
}那么Fruit的类型是什么呢能否反序列化为Apple呢我们再来执行以下代码
com.hollis.lab.fastjson.test.$Proxy0
com.hollis.lab.fastjson.test.Apple
com.hollis.lab.fastjson.test.FastJsonTest.main(FastJsonTest.java:26)可以看到在将store反序列化后我们尝试将Fruit转换成Apple但抛出了异常如果直接转换成Fruit则不会报错如下
newFruit);从以上现象中我们得知当一个类中包含了一个接口或抽象类的时候使用Fastjson进行序列化会将子类型抹去只保留接口抽象类的类型使得反序列化时无法拿到原始类型。
如何解决这个问题呢Fastjson引入了AutoType在序列化时把原始类型记录下来。
使用方法是通过SerializerFeature.WriteClassName进行标记即将上述代码中的
JSON.toJSONString(store,SerializerFeature.WriteClassName);修改后的代码输出结果如下
System.out.println(toJSONString
type:com.hollis.lab.fastjson.test.Store,
type:com.hollis.lab.fastjson.test.Apple,
}可以看到使用SerializerFeature.WriteClassName进行标记后JSON符串中多出了一个type字段标注了类对应的原始类型方便在反序列化的时候定位到具体类型。
**
如上将序列化后的字符串再反序列化就可以顺利拿到Apple类型整体输出内容如下
type:com.hollis.lab.fastjson.test.Store,fruit:{
type:com.hollis.lab.fastjson.test.Apple,price:0.5
Apple{price0.5}这就是Fastjson中引入AutoType的原因但是也正因为这个特性因为功能设计之初在安全方面考虑不周给后续的Fastjson使用者带来了无尽的痛苦。
1、Fastjson是基于内置黑名单来实现安全的打开AutoType后可能造成安全风险即绕过黑名单。
2、关闭AutoType后是基于白名单进行防护的此次解析的漏洞就是在未开启AutoType时产生的。
从v1.2.25版本开始Fastjson默认关闭了AutoType支持并且加入了checkAutoType加入了黑白名单来防御AutoType开启的情况。
Fastjson绕过历史可以分为AutoType机制绕过和黑名单绕过绝大部分情况都是寻找一个新的利用链来绕过黑名单所以Fastjson官方的黑名单列表越来越大但是更有意义的绕过显然是AutoType机制绕过这样无需手动配置autoTypeSupport也可能进行利用。
我们先来看一下通过checkAutoType()校验的方式有哪些
6、使用ParserConfig.AutoTypeCheckHandler接口通过校验的类
**方法**寻找使用checkAutoType()的函数并使之通过checkAutoType()校验
通过研究v1.2.50和v1.2.68的绕过方式主要是在ObjectDeserializer接口的子类JavaBeanDeserializer中存在expectClass非空的checkAutoType调用这也是绕过的关键。
顺着这个思路我们继续在ObjectDeserializer接口的其他子类中寻找expectClass非空的checkAutoType调用发现在子类ThrowableDeserializer的函数deserialze中也存在满足条件的调用。
TypeUtils.fnv1a_64(expectClass.getName());
className.charAt(className.length()
Arrays.binarySearch(INTERNAL_WHITELIST_HASHCODES,
(Arrays.binarySearch(internalDenyHashCodes,
(Arrays.binarySearch(acceptHashCodes,
(Arrays.binarySearch(denyHashCodes,
TypeUtils.getClassFromMapping(typeName)
(Arrays.binarySearch(acceptHashCodes,
TypeUtils.getClassFromMapping(typeName);
deserializers.findClass(typeName);
java.util.LinkedHashMap.class!expectClass.isAssignableFrom(clazz))
(Arrays.binarySearch(denyHashCodes,
(Arrays.binarySearch(acceptHashCodes,
expectClass.isAssignableFrom(clazz))
defaultClassLoader.getResourceAsStream(resource);
ParserConfig.class.getClassLoader().getResourceAsStream(resource);
(ClassLoader.class.isAssignableFrom(clazz)
javax.sql.DataSource.class.isAssignableFrom(clazz)
javax.sql.RowSet.class.isAssignableFrom(clazz)
(expectClass.isAssignableFrom(clazz))
text/html,application/xhtmlxml,application/xml;
zh-CN,zh;q0.8,zh-TW;q0.7,zh-HK;q0.5,en-US;q0.3,en;q0.2
com.example.springfastjson.model.poc20220523,
com.example.springfastjson.model;
Runtime.getRuntime().exec(str);
java.lang.Exception步入到checkAutoType
尝试从缓存mapping中实例化clazzTypeUtils.addBaseClassMappings已经将java.lang.Exception加入了mapping
往下走getDeserializer返回的ObjectDeserializer为ThrowableDeserializer类型。
进入ThrowableDeserializer.deserialze顺利到达checkAutoType
参数传到checkAutoType函数且expectClass不为空顺利绕过checkAutoType函数。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback