fastjson 远程代码执行漏洞
最近发现fastjson在1.2.24以及之前版本存在远程代码执行高危安全漏洞,为了保证系统安全,请升级到1.2.28/1.2.29或者更新版本。
官方公告:https://github.com/alibaba/fastjson/wiki/security_update_20170315
这个可能存在的远程代码执行漏洞产生的原因是fastjson反序列化json字符串为java对象的时候autoType没有正确的检测处理。
参照:https://github.com/alibaba/fastjson/commit/d52085ef54b32dfd963186e583cbcdfff5d101b5
触发漏洞需要构造一个特殊的json对象,这种应用场景多出现在C/S接口交互。公告中说道:"安全升级包禁用了部分autotype的功能,也就是"@type"这种指定类型的功能会被限制在一定范围内使用。"
当反序列化一个特殊的json字符串为java对象时可以实例化”任意“(有几个类如Thread在黑名单除外)的java对象并调用部分的java方法。
比如序列号如下json字符串(键包含了"@type" JsonTypeInfo类中的注解)时,fastjson会创建一个java对象实例:
String json = "{\"@type\":\"java.lang.Runtime\"}"; Object obj = JSON.parseObject(json, Object.class); System.out.println(obj);
执行上面的代码会发现输出了:java.lang.Runtime@194e4c9a,不过并不是就可以执行任意的代码了,因为得找一个触发点给方法传参。查了下fastjson的代码,发现可以直接在后面@type后面写方法名称和参数
String json = "{\"@type\":\"org.javaweb.test.controller.Test\",\"cmd\":{\"@type\":\"java.lang.Runtime\"}}";比如Test类有个setCmd方法可以传入自定义参数。但是JavaBeanInfo在反序列化操作的时候限定了很多条件,比如不能是静态方法、而且必须是setXXX方法,不过static类的成员变量可以直接修改值。
目前看起来虽然可以通过@type创建一些特殊的对象并调用一些方法但是想调用到任意的方法还没能找到方法,先记录着。。
修复方法:
1、升级fastjson版本(注意可能有兼容问题,参见:https://github.com/alibaba/fastjson/wiki/incompatible_change_list)
2、全局过滤"@type"关键字