fastjson 远程代码执行漏洞(HTTP_Java静态调用_java.lang.Runtime_远程代码执行)

今天公司代码安全测试提出来一个问题:HTTP_Java静态调用_java.lang.Runtime_远程代码执行!

百度查询资料,发现是fastjson架包的安全漏洞问题,在com.alibaba.fastjson原来使用的是1.1.42版本的!

我升级到了1.2.30,测试发现确实解决了该问题!

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.30</version>
        </dependency>

看某博客主介绍fastjson在1.2.24以及之前版本存在远程代码执行高危安全漏洞,为了保证系统安全,请升级到1.2.28/1.2.29或者更新版本。

官方公告:https://github.com/alibaba/fastjson/wiki/security_update_20170315

触发漏洞需要构造一个特殊的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类的成员变量可以直接修改值。

修复方法:

1、升级fastjson版本(注意可能有兼容问题,参见:https://github.com/alibaba/fastjson/wiki/incompatible_change_list)

2、全局过滤"@type"关键字

原文地址:

发布了57 篇原创文章 · 获赞 44 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/Tastill/article/details/99987420