序列化

Java回顾之序列化

大城市里の小女人 提交于 2020-03-04 09:21:57
在这篇文章里,我们关注对象序列化。   首先,我们来讨论一下什么是序列化以及序列化的原理;然后给出一个简单的示例来演示序列化和反序列化;有时有些信息是不应该被序列化的,我们应该如何控制;我们如何去自定义序列化内容;最后我们讨论一下在继承结构的场景中,序列化需要注意哪些内容。   序列化概述   序列化,简单来讲,就是以“流”的方式来保存对象,至于保存的目标地址,可以是文件,可以是数据库,也可以是网络,即通过网络将对象从一个节点传递到另一个节点。   我们知道在Java的I/O结构中,有ObjectOutputStream和ObjectInputStream,它们可以实现将对象输出为 二进制流,并从二进制流中获取对象,那为什么还需要序列化呢?这需要从Java变量的存储结构谈起,我们知道对Java来说,基础类型存储在栈上,复杂类 型(引用类型)存储在堆中,对于基础类型来说,上述的操作时可行的,但对复杂类型来说,上述操作过程中,可能会产生重复的对象,造成错误。   而序列化的工作流程如下:   1)通过输出流保存的对象都有一个唯一的序列号。   2)当一个对象需要保存时,先对其序列号进行检查。   3)当保存的对象中已包含该序列号时,不需要再次保存,否则,进入正常保存的流程。   正是通过序列号的机制,序列化才可以完整准确的保存对象的各个状态。   序列化保存的是对象中的各个属性的值

修复Weblogic的JAVA反序列化漏洞的多种方法

我是研究僧i 提交于 2020-03-04 06:16:31
1. 前言 2016年发在乌云知识库,重新发出来纪念一下。 常见的weblogic的JAVA反序列化漏洞修复方法如下: 1.使用SerialKiller替换进行序列化操作的ObjectInputStream类; 2.在不影响业务的情况下,临时删除掉项目里的 "org/apache/commons/collections/functors/InvokerTransformer.class"文件。 ObjectInputStream类为JRE的原生类,InvokerTransformer.class为weblogic基础包中的类,对上述两个类进行修改或删除,实在无法保证对业务没有影响。如果使用上述的修复方式,需要大量的测试工作。且仅仅删除InvokerTransformer.class文件,无法保证以后不会发现其他的类存在反序列化漏洞。 因此本文针对weblogic的JAVA序列化漏洞进行了分析,对多个版本的weblogic进行了测试,并提出了更加切实可行的修复方法。 2. 为什么选择weblogic的JAVA反序列化漏洞进行分析 1.weblogic与websphere为金融行业使用较多的企业级JAVA中间件; 2.weblogic比websphere市场占有率高; 3.利用websphere的JAVA反序列化漏洞时需要访问8880端口

序列化 和 打印输出流

自作多情 提交于 2020-03-04 05:11:01
序列化和反序列化的概述 序列化就是把对象存储到文件中。 要想实现对象的序列化 ,这个类必须要实现serializable接口(充当一个标记作用) 有了这个标记,在序列化时,系统会自动分配一个序列号(用作校对序列前后,也可手动指定) 对象序列化流 ObjectOutPutStream (对象输出流) 和 ObjectInputStream (对象输入流) ObjectOutPutStream (对象输出流) ObjectOutPutStream 继承自 OutPutStream类 它特有的方法: writerObject() 调用此方法 将对象写入到文件中 // 使用步骤 /*1、先创建一个ObjectOutputStream对象,构造方法传入一个FileOutputStream(指定序列化后输出地址) 2、调用特有方法 wirterObject 方法 写入文件 3、释放资源 */ ObjectOutputStream oos = new ObjectOutputStream ( new FileOutputStream (“c : \\abc . txt”) ) ; oos . writerObject ( new student ( "xiaoming" , 12 ) ) ; // 写入一个自定义对象 student oos . close ( ) ; //3、释放资源

json等序列化模块 异常处理

蹲街弑〆低调 提交于 2020-03-04 02:07:46
今日学习内容如下: 1.序列化模块 什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做 序列化 。 比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来。 但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中。 你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢? 没错序列化的过程就是从dic 变成str(dic)的过程。现在你可以通过str(dic),将一个名为dic的字典转换成一个字符串, 但是你要怎么把一个字符串转换成字典呢? 聪明的你肯定想到了eval(),如果我们将一个字符串类型的字典str_dic传给eval,就会得到一个返回的字典类型了。 eval()函数十分强大,但是eval是做什么的?e官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。 BUT!强大的函数有代价。安全性是其最大的缺点。 想象一下,如果我们从文件中读出的不是一个数据结构,而是一句"删除文件"类似的破坏性语句,那么后果实在不堪设设想。 而使用eval就要担这个风险。 所以,我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)

JAVA常用关键字解释

空扰寡人 提交于 2020-03-03 23:16:35
下表是java中经常会用到的关键字: 一:用于定义访问权限修饰符的关键字: 1) public 公共的 public 关键字是可以应用于类、方法或字段(在类中声明的变量)的访问控制修饰符。可能只会在其他任何类或包中引用 public 类、方法或字段。 2) protected 受保护的 protected 关键字是可以应用于类、方法或字段(在类中声明的变量)的访问控制修饰符。可以 在声明 protected 类、方法或字段的类、同一个包中的其他任何类以及任何子类(无论子类是在哪个包中声明的)中引用这些类、方法或字段。 3) private 私有的 private 关键字是访问控制修饰符,可以应用于类、方法或字段(在类中声明的变量)。只能在声明 private类(不可用于普通类,只用于内部类)、方法或字段的类中引用这些类、方法或字 段。在类的外部或者对于子类而言,它们是不可见的,不能直接使用。 4) 默认的不使用任何关键字 不使用任何修饰符声明的属性和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为public static final,而接口里的方法默认情况下访问权限为public。 二:用于定义类、方法和变量修饰符的关键字 1) abstract 声明抽象 abstract关键字可以修改类或方法。abstract类可以扩展(增加子类),但不能直接实例化。

春眠不觉晓,RCE知多少?

一个人想着一个人 提交于 2020-03-03 17:32:05
前言 读者受众:所有人 阅读要求:30mins 文章中2620还没写完,清水川崎大佬就爆2634了,据说他还藏了很多个0day RCE 简单案例分析RCE    通过Java执行系统命令,与cmd中或者终端上一样执行shell命令,最典型的用法就是使用Runtime.getRuntime().exec(command)或者new ProcessBuilder(cmdArray).start()。 //漏洞源码 public String CommandExec ( HttpServletRequest request ) { String cmd = request . getParameter ( "cmd" ) . toString ( ) ; Runtime run = Runtime . getRuntime ( ) ; String lineStr = "" ; try { Process p = run . exec ( cmd ) ; BufferedInputStream in = new BufferedInputStream ( p . getInputStream ( ) ) ; BufferedReader inBr = new BufferedReader ( new InputStreamReader ( in ) ) ; String tmpStr ;

序列化与反序列化

半腔热情 提交于 2020-03-03 15:49:51
1. 什么是序列化 和 反序列化 序列化:把对象 转换为字节序列 的过程称为对象的序列化。将内存中的对象按照指定的格式输出到输出设备上。 反序列化:把字节序列 恢复为对象 的过程称为对象的反序列化。 2. 什么时候需要序列化 把内存中的对象状态保存到一个 文件 中 或者 一个 数据库 中。 用套接字在网络上传送对象的时候。 3. 如何实现序列化 package sin_2020_03_01 . Serialize ; import java . io . * ; public class TestDemo { public static void main ( String [ ] args ) throws IOException , ClassNotFoundException { serializePerson ( ) ; Person person = deserializePerson ( ) ; System . out . println ( person ) ; } // 反序列化 private static Person deserializePerson ( ) throws IOException , ClassNotFoundException { ObjectInputStream ois = new ObjectInputStream ( new

最强常用开发库- JSON库详解

ぃ、小莉子 提交于 2020-03-03 09:32:20
本文为作者原创,转载请注明出处: https://www.cnblogs.com/pengdai/p/12185594.html 内容目录 JSON简介 JSON是什么 结构与类型 JSON优秀资源 JSON在线解析工具 JSON类库 性能测试对比 FastJson Fastjson 简介 Fastjson 特性 下载和使用 序列化一个对象成JSON字符串 反序列化一个JSON字符串成Java对象 对于日期的处理 Bean和数组转换 设置字段名 设置是否不序列化某字段 设置字段顺序 自定义序列化和反序列化 FastJson漏洞问题 JackSon JackSon简介 Jackson组件 Jackson的使用 序列化一个对象成JSON字符串 反序列化一个JSON字符串成Java对象 常用注解 GSON Gson简介 Gson的目标 Gson的使用 序列化 反序列化 自定义序列化和反序列化机制 参考文章 更多内容 最强常用开发库总结 - JSON库详解 JSON应用非常广泛,对于Java常用的JSON库要完全掌握。@pdai JSON简介 JSON是什么 JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是

protocol buffer的简单使用

旧巷老猫 提交于 2020-03-03 08:37:12
protocol buffer是一个高效的结构化数据存储格式,用来结构化数据的序列化与反序列化。目前支持java、c++、Python 相对于json而言:   数据量跟小   其他的还没看出什么优势 下载地址: protobuf-2.5 , protoc-2.5.0-win32.zip 安装过程: 1、进入解压后的java目录,查看readme.txt 2、把protoc.exe放入到protobuf-2.5中的 3、运行mvn -test 编写protocol buffer需要以下三步 1、定义消息格式文件,以proto结尾    package tutorial; option java_package = "com.example.tutorial"; option java_outer_classname = "PersonProtos"; message Person{ required string name=1; required int32 id=2; optional string email=3; message PhoneNumber{ required string number = 1; optional int32 type=2; } repeated PhoneNumber phone=4; }    2、使用编译器生成java文件   protoc

Hessian 反序列化及相关利用链

久未见 提交于 2020-03-03 07:58:44
作者:Longofo@知道创宇404实验室 时间:2020年2月20日 原文地址: https://paper.seebug.org/1131/#_2 前不久有一个关于Apache Dubbo Http反序列化的漏洞,本来是一个正常功能(通过正常调用抓包即可验证确实是正常功能而不是非预期的Post),通过Post传输序列化数据进行远程调用,但是如果Post传递恶意的序列化数据就能进行恶意利用。Apache Dubbo还支持很多协议,例如Dubbo(Dubbo Hessian2)、Hessian(包括Hessian与Hessian2,这里的Hessian2与Dubbo Hessian2不是同一个)、Rmi、Http等。Apache Dubbo是远程调用框架,既然Http方式的远程调用传输了序列化的数据,那么其他协议也可能存在类似问题,例如Rmi、Hessian等。@pyn3rd师傅之前在twiter发了关于Apache Dubbo Hessian协议的反序列化利用,Apache Dubbo Hessian反序列化问题之前也被提到过, 这篇文章 里面讲到了Apache Dubbo Hessian存在反序列化被利用的问题,类似的还有Apache Dubbo Rmi反序列化问题。之前也没比较完整的去分析过一个反序列化组件处理流程,刚好趁这个机会看看Hessian序列化、反序列化过程,以及