fastjson阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean,不过这么好用的软件竟然被爆出来有漏洞!那fastjson漏洞版本列表有哪些?下面来我们就来给大家讲解一下。
一、受影响版本
漏洞信息如下:
漏洞评级:严重
影响组件:com.alibaba:fastjson
影响版本:<= 1.2.80
二、修复建议
建议1:使用fastjson1.2.83版本;
Github地址:https://github.com/alibaba/fastjson/releases/tag/1.2.83
建议2:升级到fastjson v2
Github地址:https://github.com/alibaba/fastjson2
Fastjson v2是FASTJSON项目的重要升级,目标是为下一个十年提供一个高性能的JSON库,同一套API支持JSON/JSONB两种协议,JSONPath是一等公民,支持全量解析和部分解析,支持Java服务端、客户端Android、大数据场景
fastjson为什么会有漏洞?
总体而言是一个叫做autoType的在搞事情。那么autoType是什么呢?
我们写一段简单代码演示一下:
public class JSONController { public static void main(String[] args) throws ParseException { Province province = new Province(); province.setProvincialCapital("wuhan"); province.setCityNum(12); Nation nation = new Nation(); nation.setName("傣族"); nation.setProvince(province); String nationStr = JSON.toJSONString(nation, SerializerFeature.WriteClassName); //{"@type":"com.xx.ins.qsm.demo.web.controller.Nation","name":"傣族","province":{"@type":"com.xx.ins.qsm.demo.web.controller.Province","cityNum":12,"provincialCapital":"wuhan"}} Nation nation1 = JSON.parseObject(nationStr, Nation.class); //{"name":"傣族","province":{"cityNum":12,"provincialCapital":"wuhan"}} Province province1 = (Province) nation1.getProvince(); //{"cityNum":12,"provincialCapital":"wuhan"} String nationStr2 = JSON.toJSONString(nation); //{"name":"傣族","province":{"cityNum":12,"provincialCapital":"wuhan"}} Nation nation2 = JSON.parseObject(nationStr2, Nation.class); //{"name":"傣族","province":{}} Province province2 = (Province) nation2.getProvince(); //Exception in thread "main" java.lang.ClassCastException: com.xxx.qsm.demo.web.controller.$Proxy0 cannot be cast to com.xxx.qsm.demo.web.controller.Province // at com.xxx.qsm.demo.web.controller.JSONController.main(JSONController.java:64) } } @Data class Nation { private String name; private Location province; } interface Location {} @Data class Province implements Location { private String provincialCapital; private Integer cityNum; }
可以看到:Nation类有一个属性province,其类型为接口Location,我们赋值的时候,是给它的实现类Province的对象。
接下来,2次序列化是否使用了SerializerFeature.WriteClassName。
使用了该属性的,序列化的json字符串就出现了一个@type的东西,这个指明了这个对象到时候反序列的时候指定的类型。那么这个@type就是前面所说的万恶之源autoType。在fastjson早期,这个是自动开启的。
那它有什么作用呢:就是反序列化的时候,可以指明我要的对象是什么。从代码可以看到,第二段序列化是没有@type的,所以它反序列化的时候,字段province根本没法转为本来的Province类型。如果指定了类型,那么就很容易的反序列化到指定的类。
总之我们只要进行safeMode的配置,在配置后将会完全禁用autoType就可以临时解决漏洞的问题了,另外开发真遇到漏洞问题,一定要就是修复,避免影响安全问题!最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。
推荐阅读: