fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,但就是这么好用的解析库也会存在漏洞,那面对漏洞我们需要怎么做呢?下面来我们就来给大家讲解一下。
漏洞主要为autoType开关绕过的反序列化漏洞利用,恶意攻击者可以通过该漏洞绕过autoType限制实现远程代码执行攻击,从而获取目标系统管理权限,建议尽快更新漏洞修复版本或采用临时缓解措施加固系统。
缓解措施:
紧急:目前虽然漏洞细节和利用代码暂未公开,但可以通过更新版本的补丁对比定位漏洞触发点并快速开发出漏洞利用代码,建议尽快更新漏洞修复版本或采用临时缓解措施加固系统。
临时缓解措施(打开SafeMode功能,请评估对业务运行的影响):
首先更新到1.2.68版本,然后进行safeMode的配置,在配置后将会完全禁用autoType;
1. 在代码中配置:
ParserConfig.getGlobalInstance().setSafeMode(true);
2. 加上JVM启动参数:
-Dfastjson.parser.safeMode=true
3. 配置fastjson.properties文件:
fastjson.parser.safeMode=true
为什么会有漏洞?
总体而言是一个叫做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 虽然与漏洞,但是我们也不必慌张,我们只要进行safeMode的配置,在配置后将会完全禁用autoType就可以临时解决这个问题了。最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。
推荐阅读: