vulhub之fastjson

fastjson 1.2.24 反序列化 RCE 漏洞(CVE-2017-18349)

漏洞简介
什么是json

json全称是JavaScript object notation。即JavaScript对象标记法,使用键值对进行信息的存储。举个简单的例子如下:

{

"name":"BossFrank",

"age":23,

"isDeveloper": true

}

将这个 JSON 字符串反序列化为一个 Java 对象。首先,创建一个 Java 类来表示 JSON 数据

public class User {
    private String name;
    private int age;
    private boolean isDeveloper;
    
    // getters and setters 省略
}

然后,使用 Fastjson 的 JSON.parseObject 方法将 JSON 字符串转换为 User 类的实例

String jsonString = "{\"name\":\"John Doe\", \"age\":30, \"isDeveloper\":true}";
User user = JSON.parseObject(jsonString, User.class);

在这个例子中,jsonString 包含了要反序列化的 JSON 数据,User.class 是目标对象的类类型。Fastjson 会解析 JSON 字符串,并且将解析出的数据填充到新创建的 User 对象的相应字段中。

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

fastjson 是阿里巴巴开发的 java语言编写的高性能 JSON 库,用于将数据在 Json 和 Java Object之间相互转换。它没有用java的序列化机制,而是自定义了一套序列化机制。

提供两个主要接口:

JSON.toJSONString 和 JSON.parseObject/JSON.parse 分别实现序列化和反序列化

漏洞原理

fastjson的漏洞本质还是一个java的反序列化漏洞,由于引进了AutoType功能,fastjson在对json字符串反序列化的时候,会读取到@type的内容,将json内容反序列化为java对象并调用这个类的setter方法。

@type

@typefastjson中的一个特殊注解,用于标识JSON字符串中的某个属性是一个Java对象的类型。具体来说,当fastjsonJSON字符串反序列化为Java对象时,如果JSON字符串中包含@type属性,fastjson会根据该属性的值来确定反序列化后的Java对象的类型。

那么为啥要引进Auto Type功能呢?

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 } }

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

使用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服务器请求待执行的命令。也就是靶机服务器问rmi服务器,(靶机服务器)需要执行什么命令啊?
3.rmi 服务器请求加载远程机器的class(这个远程机器是我们搭建好的恶意站点,提前将漏洞利用的代码编译得到.class文件,并上传至恶意站点),得到攻击者(我们)构造好的命令(ping dnslog或者创建文件或者反弹shell啥的)
4.rmi将远程加载得到的class(恶意代码),作为响应返回给靶机服务器。
5.靶机服务器执行了恶意代码,被攻击者成功利用。

影响版本:Fastjson1.2.24及之前版本。 

xray_windows_amd64.exe webscan --listen 127.0.0.1:7777 --html-output ming.html
未选择指定模块,xray默认全部扫描,
–html以html:格式输出
ming.html:输出的网页

环境搭建

Vulhub运行测试环境:

docker-compose up -d

环境运行后,访问http://your-ip:8090即可看到JSON格式的输出。

我们向这个地址POST一个JSON对象,即可更新服务端的信息:

curl http://your-ip:8090/ -H "Content-Type: application/json" --data '{"name":"hello", "age":20}'

 如何判断一个站点是否存在Fastjson?

方式1 响应时间

正常数据响应时间(29毫秒):

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

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

相关文章

Scala案例:全文单词统计

2.txt内容如下 Thank you very much.Well I want to thank you all very much this is great, these are our friends, we have thousands of friends in this incredible movement.This was a movement like no nobodys ever seen before, and frankly this was I believe the…

【STK学习】part2-星座-目标可见性与覆盖性分析

【Satellite Tool Kit】学习并深入了解卫星/星座生成、可见性分析、覆盖性分析等知识,并基于STK软件实现对应数据的导出,以用于算法的约束输入。 文章目录 一、学习目标二、学习内容2.1 星地可见性分析2.1.1 单星单地2.1.2 单星多地2.1.3 多星单地 2.2 星…

金融数据中心容灾“大咖说” | 美创科技赋能“灾备一体化”建设

中国人民银行发布的《金融数据中心容灾建设指引》(JR/T 0264—2024)已于2024年7月29日正式实施。这一金融行业标准对金融数据中心容灾建设中的“组织保障、需求分析、体系规划、建设要求、运维管理”进行了规范和指导。面对不断增加的各类网络、业务、应…

《第十部分》1.STM32之通信接口《精讲》之IIC通信---介绍

经过近一周的USART学习,我深刻体会到通信对单片机的重要性。它就像人类的手脚和大脑,只有掌握了通信技术,单片机才能与外界交互,展现出丰富多彩的功能,变得更加强大和实用。 单片机最基础的“语言”是二进制。可惜&am…

Vue通过file控件上传文件到Node服务器

功能: 1.多文件同时上传、2.拖动上传、3.实时上传进度条、4.中断上传和删除文件、5.原生file控件的美化 搁置的功能: 上传文件夹、大文件切片上传、以及其他限制条件未处理 Node服务器的前置准备: 新建文件夹: file_upload_serve初始化npm: npm …

如何使用 Docker Compose 安装 WireGuard UI

简介 wireguard是什么?维基百科是这样描述的: WireGuard是一种实现加密虚拟专用网络(VPN) 的通信协议和免费开源软件,其设计目标是易于使用,高速性能和低攻击面。它旨在比IPsec和OpenVPN这两种常见的隧道协议具有更好的性能和更…

IM项目-----客户端网络通讯流程

文章目录 前言数据中心类数据持久化网络通信类http客户端websocket客户端 前言 对即时通信系统客户端部分的网络通讯流程的总结。 数据中心类 通过model/datacenter.h 中的DataCenter 类来管理所有客⼾端需要的数据.这是⼀个单例类. 这里管理一份数据有两个作用,1…

软件测试—— Selenium 常用函数(一)

前一篇文章:软件测试 —— 自动化基础-CSDN博客 目录 前言 一、窗口 1.屏幕截图 2.切换窗口 3.窗口设置大小 4.关闭窗口 二、等待 1.等待意义 2.强制等待 3.隐式等待 4.显式等待 总结 前言 在前一篇文章中,我们介绍了自动化的一些基础知识&a…

WebSocket详解、WebSocket入门案例

目录 1.1 WebSocket介绍 http协议: webSocket协议: 1.2WebSocket协议: 1.3客户端(浏览器)实现 1.3.2 WebSocket对象的相关事宜: 1.3.3 WebSOcket方法 1.4 服务端实现 服务端如何接收客户端发送的请…

【图像分割】SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers

SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers 论文链接:http://arxiv.org/abs/2105.15203 代码链接:https://github.com/NVlabs/SegFormer 一、摘要 文中提出了SegFormer,一个简单、高效且强大的…

Linux修改/etc/hosts不起作用(ping: xxx: Name or service not known)的解决方法——开启NSCD

​ 问题描述 起因是我在实验室云资源池的一台虚拟机(CentOS 8.5)上的/etc/hosts文件中为Fabric网络节点的域名指定了IP: IP可以ping通,但是ping域名时提示ping: xxx: Name or service not known。 问题本身应该是Linux通用的&a…

OpenTelemetry 赋能DevOps流程的可观测性革命

原作者:天颇 原出处:微信公众号 乘云数字DATABUFF 原文地址:https://mp.weixin.qq.com/s/D_f31EBtLu7Rr0gahuF-bw 引言 在当今快节奏的软件开发和运维环境中,DevOps 已经成为主流,它通过整合开发和运维流程&#xff0…

windows 和 linux检查操作系统基本信息

windows检查操作系统基本信息 systeminfolinux检查操作系统基本信息 获取系统位数 getconf LONG_BIT查询操作系统release信息 lsb_release -a查询系统信息 cat /etc/issue查询系统名称 uname -a

使用SaaS化的Aurora应用快速搭建私人ChatGPT助手

使用SaaS化的Aurora应用快速搭建私人ChatGPT助手 简介: Aurora是一个带UI且免费的GPT私人聊天助手,可切换GPT-3.5,4,4o等常用版本。用户可通过部署Aurora,快速打造自己专属的AI助手。阿里云计算巢已将Aurora打包为SaaS…

ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模态分解

ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模态分解 目录 ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模态分解效果分析基本介绍程序设计参考资料效果分析 基本介绍 (创新独家)ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模 态分解ASFSSA-VMD:优化VMD分解层数K和惩罚因子a…

Unity脚本基础规则

Unity脚本基础规则 如何在Unity中创建一个脚本文件? 在Project窗口中的Assets目录下,选择合适的文件夹,右键,选择第一个Create,在新出现的一栏中选择C# Script,此时文件夹内会出现C#脚本图标,…

【新华妙笔-注册/登录安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

使用vscode+expo+Android夜神模拟器运行react-native项目

1.进入夜神模拟器安装路径下的bin目录 2.输入命令,连接Android Studio 启动夜神模拟器后, 打开安装目录的bin文件夹执行下面的命令,只需执行一次) nox_adb.exe connect 127.0.0.1:62001adb connect 127.0.0.1:62001 3.运行项目…

Linux进阶:软件安装、网络操作、端口、进程等

软件安装 yum 和 apt 均需要root权限 CentOS系统使用: yum [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y,自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&…

linux先创建文件夹后指定创建文件夹用户

1、创建文件夹,然后创建用户并指定用户目录,然后修改目录所有权给该目录 # 创建 /home/test 目录 mkdir /home/test # 设置权限(确保有适当的读写权限) chown root:root /home/test chmod 700 /home/test # 创建 xl 用户并指定家…