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 的初期版本中,主要出于以下几个原因:
- 简化开发:AutoType 机制可以简化 JSON 数据在 Java 对象之间的转换过程,减少代码量,提高开发效率。
- 增强灵活性:通过在 JSON 数据中嵌入类型信息,可以方便地处理复杂对象和多态对象,特别是在实现继承和接口时。
- 广泛适用性:在很多应用场景下,特别是 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 请求。
具体原因如下:
-
漏洞描述中的关键点:
- 漏洞涉及 Fastjson 序列化问题,允许攻击者利用
@type
属性执行潜在危险的代码。 - 攻击者可以利用这个漏洞从系统中提取敏感信息,并对系统进行进一步的攻击。
- 漏洞涉及 Fastjson 序列化问题,允许攻击者利用
-
测试请求的执行:
- 测试步骤中,通过 POST 请求向目标 URL 发送数据
- 请求体中包含了一个特殊的 Payload
-
响应结果:
- 响应结果显示了 HTTP 200 状态码,表明请求被成功处理。
- 表示 Fastjson 在处理这个请求时没有阻止序列化的数据类型,验证了 Fastjson 的漏洞。
-
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
相关文章:

fastjson(autoType)反序列化漏洞
1. 温少和他的fastjson 阿里巴巴的 FastJSON,也被称为 Alibaba FastJSON 或阿里巴巴 JSON,是一个高性能的 Java JSON 处理库,用于在 Java 应用程序中解析和生成 JSON 数据。FastJSON 以其卓越的性能和功能丰富的特点而闻名,并在…...

Java入门基础16:集合框架1(Collection集合体系、List、Set)
集合体系结构 Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的。 collection集合体系 Collection的常用方法 package com.itchinajie.d1_collection;import java.util.ArrayList; import java.util.HashSet;/* * 目…...
Qt如何调用接口
在Qt中,你可以使用QNetworkAccessManager类来调用API。以下是一个简单的示例: cpp #include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> int main(int arg…...

Android14之解决编译libaaudio.so报错问题(二百二十七)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列…...

【专题】2024年7月人工智能AI行业报告合集汇总PDF分享(附原数据表)
原文链接:https://tecdat.cn/?p37350 随着人工智能技术的飞速发展,AI已经成为当今时代的重要驱动力。本报告将聚焦于人工智能AI行业的最新动态,涵盖客户服务、体验营销、资产管理以及国产AI大模型应用等多个领域。通过深入研究和分析,我们…...

干货分享|如何使用Stable Diffusion打造会说话的数字人?
数字人已不是什么新鲜名词了。在许多领域,尤其是媒体和娱乐领域,经常可以看到卡通形象的人物或逼真的虚拟主持人。在Stable Diffusion中,我们可以上传一段录制好的音频文件,然后使用SadTalker插件,将音频和图片相结合&…...

OrangePi AIpro学习4 —— 昇腾AI模型推理 C++版
目录 一、ATC模型转换 1.1 模型 1.2 ATC工具 1.3 实操模型转换 1.4 使用ATC工具时的一些关键注意事项 1.5 ATC模型转换命令举例 二、运行昇腾AI模型应用样仓程序 2.1 程序目录 2.2 下载模型和模型转换 2.3 下载图片和编译程序 2.4 解决报错 2.5 运行程序 三、运行…...
vue js 多组件异步请求解决方案
接口之间异步问题可以采用Promiseasyncawait 链接: https://blog.csdn.net/qq_39816586/article/details/103517416 使用场景: 1.保障用户必须完成自动登录,才调用后续逻辑 2.保障必须完成初始启动,才调用后续逻辑 3.保障先执行on…...

【Android】不同系统版本获取设备MAC地址
【Android】不同系统版本获取设备MAC地址 尝试实现 尝试 在开发过程中,想要获取MAC地址,最开始想到的就是WifiManager,但结果始终返回02:00:00:00:00:00,由于用得是wifi ,考虑是不是因为用得网线的原因,但…...
残差网络--NLP上的应用
在自然语言处理(NLP)领域,残差网络(ResNet)同样有着广泛的应用。虽然最初的残差网络设计是为了处理图像任务,但其核心思想也被成功地迁移到了自然语言处理任务中,以解决深层神经网络中的退化问题…...
1章4节:数据可视化, R 语言的静态绘图和 Shiny 的交互可视化演示(更新2024/08/14)
在数据科学的世界中,“一图胜千言”的古老谚语依然适用。数据可视化不仅仅是将数据以图形化的方式展现,更是帮助我们发现数据背后隐藏模式、趋势和异常的强大工具。R语言作为数据科学的主要编程语言之一,以其强大的可视化能力而闻名,许多数据科学家和分析师因此选择了R作为…...
浅谈个人用户如何玩转HTTP代理
今天,准备和大家聊聊我是如何玩转HTTP代理的,希望能给大家带来一些启发和帮助。 犹记得刚开始接触HTTP代理时,我对它还是一无所知。那时我总被各种网络限制所困扰,无法随心所欲地访问我想看的网站。直到HTTP代理的出现,…...

动手研发实时口译系统
重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...

C#(asp.net)电商后台管理系统-计算机毕业设计源码70015
摘 要 随着互联网技术的不断发展,电商行业也越来越受到人们的关注。为了提高电商行业的管理效率和服务水平,本文提出了一种基于ASP.NET电商后台管理系统的设计与实现方案。 电商管理系统基于VisualStudio开发平台,采用C#编程语言和ASP.NET等技…...

Unity 中创建动画的教程
Unity 动画创建教程 在游戏开发中,生动的动画能够极大地提升玩家的体验。在这篇教程中,我们将一起探索如何在 Unity 中创建动画。 一、准备工作 首先,确保您已经安装了最新版本的 Unity 引擎。创建一个新的 Unity 项目或者打开您现有的项目…...

2024年最全渗透测试学习指南,小白也能轻松hold住!零基础到精通,看完这篇就够了!
可能会有很多人觉得渗透测试门槛很高,学习周期长,似乎只有天赋异禀者方能涉足。实则不然,渗透测试行业虽有其专业门槛,但绝非如外界渲染的那样高不可攀。归根结底,所需的基础不过是扎实的编程语言功底,同时…...

有道云docx转换markdown,导入hugo发布到github page,多平台发布适配
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 有道云导出docx 有道云笔记右上角更多按钮选择【导出为Word】,可以导出docx文档 docx转换markdown 尝试了几个docx转markdown的python库后&…...

如何理解:进程控制
文章目录 前言:进程创建:进程终止:如何终止进程?进程等待非阻塞等待: 总结: 前言: 对于前面的地址空间的学习,我们现在了解到原来所谓变量的地址其实是虚拟地址,该虚…...

工业互联网边缘计算实训室解决方案
一、引言 随着物联网(IoT)、5G通信技术的快速发展,工业互联网已成为推动制造业转型升级的重要力量。边缘计算作为云计算的延伸和补充,在实时数据分析、降低数据传输延迟、提升处理效率及增强数据安全性方面展现出巨大潜力。在此背…...

Android全面解析之Context机制(一) :初识Android context
什么是Context 回想一下最初学习Android开发的时候,第一用到context是什么时候?如果你跟我一样是通过郭霖的《第一行代码》来入门android,那么一般是Toast。Toast的常规用法是: Toast.makeText(this, "我是toast", To…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...