Hessian序列化,hessian反序列化漏洞

背景和考虑:序列化参数具有枚举属性,在序列化端添加枚举是否可以成功反序列化? 序列化子类。 有与父类同名的参数。 反序列化时,同名参数是否可以成功赋值? 序列化对象可以增加参数,反序列化类可以在不增加参数的情况下成功反序列化吗? 序列化传输中使用的属性应该使用包装器吗? 还是基本型比较好? 为什么要使用序列化和反序列化1 .在程序运行过程中,生成的数据不能总是保存在内存中。 必须临时或永久保存在磁盘、数据库、文件等介质上。 它还可以通过网络发送给合作者。 程序必须从媒体或网络传输中获取原始数据。 在传输过程中只能使用二进制流进行传输。 2 .简单场景,基本类型的数据传输。 通过双方约定参数类型,数据接收端根据既定规则对二进制流进行反序列化。

3 .复杂场景。 传输数据的参数类型包括基本类型、包装类型、自定义类、枚举、时间类型、字符串和容器等。 很难通过约定来反序列化二进制流。 需要共同的协议,双方使用,进行序列化和反序列化。

三种串行化协议与比较

序列化协议

特点

jdk(jdk 自带)

1. 序列化:除了 static、transient类型2. 特点:强类型,安全性高,序列化结果携带类型信息3. 反序列化:基于 Field 机制4. 应用场景:深拷贝

fastjson(第三方实现)

1. 可读性好,空间占用小2. 特点:弱类型,序列化结果不携带类型信息,可读性强。有一些安全性问题3. 反序列化:基于 Field 机制,兼容 Bean 机制4. 应用场景:消息、透传对象

hessian(第三方实现)

1. 序列化:除了 static、transient 类型2. 特点:强类型,体积小,可跨语言,序列化结果携带类型信息3. 反序列化:基于 Field 机制,兼容 Bean 机制4. 应用场景:RPC

比较Father father=new Father (; father.name=’主厨’; father.comment=’川菜馆’; father.simpleInt=1; father.boxint=newinteger(10; father.simpleDouble=1; father.boxdouble=newdouble(10; father.bigdecimal=new bigdecimal ( 11.5 ); 执行结果: jdk序列化结果长度: 626,时间: 55jdk反序列化结果: Father{version=0,name=’厨师’,comment=’川菜馆’,boxInt=10,simpleInt=1 box bigDecimal=11.5}时间: 87hessian序列化结果长度: 182,时间: 56hessian反序列化结果: Father{version=0,name=’厨师,comment=’川菜馆’ bigDecimal=11.5}时间:7Fastjson序列化结果长度: 119,时间: 225Fastjson反序列化结果: Father{version=0,name=’主厨’,name=box double=fastjson序列化结果的长度最短,但需要其他两种的4倍左右的时间。 hessian序列化所需的时间与jdk相差不大,远远短于fastjson序列化所需的时间。 另外,序列化的结果是,与jdk相比,设置空间非常有利。 另外,hessian的反序列化速度最快,时间为其他两种的1/10。 综上所述,hessian在序列化和反序列化的表现中,性能最佳。 Hessian序列化实战实验准备父类publicclassfatherimplementsserializable {/* * *静态类型不序列化*/privatestaticfinallongserialversionuid=1l /** * transient不序列化*/transient int version=0; /**名称*/public String name; /** *备注* /公共字符串命令; /** *包装类型1 */public Integer boxInt; /** *基本类型1 */public int simpleInt; /** *包装类型2 */public Double boxDouble; /** *基本类型2 */public double simpleDouble;/* * * bigdecimal */publicbigdecimalbigdecimal; public father { } @ overridepublicstringtostring { } { return ‘ father } ‘ version=’ version ‘,name=’ ‘ name ‘\comment simpleInt=’ simpleInt ‘,boxDouble=’ boxDouble ‘,simpledouble }子类publicclassonextendsfather {/* * *名称,与father相同/** *自定义类* /公共属性属性; /**枚举* /公共颜色颜色; public Son属性-自定义类publicclassattributesimplementsserializable { privatestaticfinallongserialversionuid=1L; 公共int value; 公共字符串msg; publicattributes ( { } publicattributes ) intvalue,String msg ).value=value; this.msg=msg; }枚举publicenumcolor{red(1,’ red ),yellow ) 2,’ yellow }; 公共int value; 公共字符串msg; Color ( ) color ( intvalue,String msg ) ) { this.value=value; this.msg=msg; }设置要使用的对象和属性

Son son=new Son (; son.name=’厨师’; //仅在父/子类别的同名字段、子类属性中输入son.comment=’川菜馆’; son.simpleInt=1; son.boxint=newinteger(10; son.simpleDouble=1; son.boxdouble=newdouble(10; son.bigdecimal=new bigdecimal ( 11.5; son.color=Color.RED; son.attributes=new attributes ( 11,’ hello ‘; 要执行结果分析,请使用Hessian序列化,将结果写入文件,然后使用vim打开。 十六进制查看,查看命令: %! xxd

00000000:430764746 f2e 536 F6 e 9a 046 e 616 d 6504 c.dto.son . name.000000010:6e61d 6507636 F6 e 740662 f78 name.com ment.6 76961d 0030:78446 f 75626 c 650 c 7369 d 706 c 65446 FX double.simple do 00000040:7562 c650a 574657305 uble.attributes.00000050:636 F6 c66 c66 f6f6f6f6f 72000000 al 0000060:6002 e58 ea8e 5b 88848 e 03 e 507990 . n . 0000070:e9a 6869 a 915 d 0a 5c 430 e 64746 f2e 4174 . c.dto.at 000000080:7472696275746573920576616 c 756503 tributes . value.00000090:6d 7367619 b 0568656 c 6f 430964746 FMS ga . hah olor . nameb.re 000000 B0:4443146 a 6176612 e6d 6174682 e 426967 DC.Java.math.big 00000 c00576616 c 75656304 decimal.valuec.valuec 参考hessian官方文档。 链接: http://Hessian.Caucho.coom

序列化原理序列化规则:1.序列化的类必须实现可序列化接口

2 .静态属性和transient变量不会序列化。

3 .枚举类型序列化后保存枚举变量的名称4 .序列化结果的结构:类定义为: C -类名长类名-属性数- (各设置一个)属性名长属性名-实例化开始标识符- )属性值各设置一个对象

反序列化原理图:

解释:这是以前的序列化文件,可以对着这个结构理解反序列化的过程。

解释:阅读“c”可以了解类的定义,然后开始阅读类名、属性个数和每个属性的名称。 将此类的定义缓存在_classDefs的列表中。

解释:读取序列化文件并获取类名后,将加载该类,并为该类生成反序列化程序。 这里将生成_fieldMap。 key是名为反序列化程序的类中所有属性的名称,value是与属性相对应的反序列化程序。

解释:在阅读从6开始的2位十六进制数时,开始实例化和赋值类。

遗留答案:增加枚举类型将导致无法正常读取反序列化。 原因:作为枚举类型序列化的结果,与枚举属性对应的值是枚举名称。 对于反序列化,枚举类名枚举反射将生成枚举对象。 如果找不到枚举名称,将出现错误。 反序列化是一种子类型,无法正确分配同名属性值。 序列化对象增加参数,反序列化正常运行。 原因:对于反序列化,首先从类名加载同名的类,然后为同名的类生成反序列化器。 与同名类中每个属性对应的反序列化程序存储在map中。 如果要反序列化二进制文件,请从读取的属性名称中获取对应于map的反序列化器。 如果无法检索,则缺省值为NullFieldDeserializer.DESER。 直到读取值时,如果只读取值,不进行set操作,在序列化和反序列化两者中使用对象类型,则更改属性类型,如果序列化方不传输数据,则序列化结果为“n”,可以正常反序列化。 但是,如果一方是基本型,则更改属性类型时,hessian将对基本型使用不同范围的值域,因此无法正常序列化。

参考文献: https://砖局域网. zhi Hu.com/p/44787200https://paper.see bug.org/1131/hessian官方文件:序列化规则http://hessian.caucho.caucho .

剪辑教程

burpsuite漏洞扫描原理,burpsuite漏洞扫描的原理

2022-10-29 2:52:39

剪辑教程

录制有声书用什么录音设备,刚开始录有声书需要什么设备

2022-10-29 3:03:29

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索