fastjson漏洞版本列表有哪些?fastjson为什么会有漏洞?

fastjson阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean,不过这么好用的软件竟然被爆出来有漏洞!那fastjson漏洞版本列表有哪些?下面来我们就来给大家讲解一下。

fastjson漏洞版本列表.jpg

一、受影响版本

漏洞信息如下:

漏洞评级:严重

影响组件: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工具网。

推荐阅读:

dubbo怎么暴露接口的?dubbo服务暴露原理

java三元运算符求三个数最大值怎么做?如何入门java三元运算符?

qt文件怎么运行?qt文件是乱码怎么回事?