fastjson漏洞检测工具是什么?fastjson为什有漏洞?

Fastjson 是一个Java库,Fastjson可以操作任何Java对象,但是开发人员在使用过程中经常会遇到一些问题以及漏洞,因此我们需要fastjson漏洞检测工具,那fastjson漏洞检测工具是什么?下面来我们就来给大家讲解一下。

1.下载地址

https://github.com/nex121/FastjsonEXP

2.利用工具实现Fastjson 1.2.47 远程命令执行漏洞

靶场:Vulhub靶场,docker启动。

vulhub/fastjson/1.2.47-rce

docker-compose up -d

1.检测漏洞是否存在

这里我们在输入目标地址的时候,要输入http,否则可能不能解析。

fastjson漏洞检测工具是什么?fastjson为什有漏洞?.png

如果存在fastjson漏洞的话,会弹出存在漏洞的弹框。

2.漏洞利用

在下载连接里有两个连接地址,第一个是工具,第二个是利用脚本。我们将这两个放在同一目录下。

1.png

然后,按照下面步骤

2.png

在第三步监听后,会创建监听

3.png

然后,执行第四步和第五步之后,点击发送,会执行命令。

4.png

我们去容器中查看命令是否执行成功,可以看到已经创建成功了。

5.png

这里还有远程的使用方法,只要把fastjson_tool.jar放在远程服务器(linux)的root目录下

输入账号密码后,点击测试看是否连接成功。成功后,直接在下面输入攻击地址,再输入版本号,点击发送即可。

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类型。如果指定了类型,那么就很容易的反序列化到指定的类。

其实要想解决fastjson漏洞问题,我们只要完全禁用autoType就可以临时解决这个问题了。最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。

推荐阅读:

json在线解析器是干嘛的?json解析方法有哪些?

java中级工程师应该掌握哪些?java中级工程师必备技能

java是数据库管理系统吗?Java有哪些常用数据库?