fastjson 远程代码执行漏洞

yzmm
2519 阅读

最近发现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"关键字


评论 (3)

过客
http://webcache.googleusercontent.com/search?q=cache:GRBlR5_GdlYJ:blog.nsfocus.net/analysis-protection-fastjson-remote-code-execution-vulnerability/&num=1&newwindow=1&hl=zh-CN&gl=cn&strip=0&vwsrc=0 这是绿盟分析的一个快照。和你的思路略有不同,你看看有什么借鉴的没有。 通过新老版本的代码对比,发现此漏洞出现在com\alibaba\fastjson\parser\DefaultJSONParser.java文件中的DefaultJSONParser::parseObject函数,如下图所示: 从图中可以看到,在1.2.24 (即受影响的版本)版本的代码中,加载类名时,用到了一个TypeUtils::loadClass的方法,此方法在com\alibaba\fastjson\util\TypeUtils.java中的具体内容如下:
yzmm
@shenjingb C/S交互的时候经常会直接传输json对象,所以这个时候可能是某个端直接序列化了对方传过来的json字符串。所以这里的@type并不一定是参数中获取的某个具体key值,比方说@type=123,不是这意思可能是如参数json对应的值是{"@type":"xxxx"}。
shenjingb
对于没有使用@type注解的应该没关系吧

发表评论