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漏洞的话,会弹出存在漏洞的弹框。
2.漏洞利用
在下载连接里有两个连接地址,第一个是工具,第二个是利用脚本。我们将这两个放在同一目录下。
然后,按照下面步骤
在第三步监听后,会创建监听
然后,执行第四步和第五步之后,点击发送,会执行命令。
我们去容器中查看命令是否执行成功,可以看到已经创建成功了。
这里还有远程的使用方法,只要把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工具网。
推荐阅读: