?更多网络安全干货内容:点此获取
———————
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
序列化的实现方法:
反序列化
通俗的说,就是现在流行面向对象开发,万物皆对象。比如一个student对象有着很多属性,我们在用的时候可以这么赋值,以PHP为例一个stu对象,有很多属性,name,sex等等,是json格式,如下:
$stu1?=?new?Stu(); $stu1->name=“GGG' $stu1->sex=?true; $stu1->age?=?18; $stu1->score?=?89.9; |
这样的数据,很占空间,所以在临时存储时,会序列化成一种便于存储的字符串格式,如:Array{?“name":"GGG",“age”?:18,“SEX”?:true,“score”?:89.9}。这样用的时候,再序列化回来,使用serialize()和unserialize()函数来来回回转这就是序列化和反序列化。
序列化通常被用于:
对反序列化的利用是有点困难的。因为在不更改或调整底层可被利用代码的情况下,现成的反序列化漏洞很难被使用。
这一问题包括在Top?10的行业调查中,而不是基于可量化的数据。
有些工具可以被用于发现反序列化缺陷,但经常需要人工帮助来验证发现的问题。希望有关反序列化缺陷的普遍性数据将随着工具的开发而被更多的识别和解决。
反序列化缺陷的影响不能被低估。它们可能导致远程代码执行攻击,这是可能发生的最严重的攻击之一。业务影响取决于应用程序和数据的保护需求。
序列化和反序列化本身并不存在问题,但当输入的反序列化的数据可被用户控制,那么攻击者即可通过构造恶意输入,让反序列化产生非预期的对象,在此过程中,执行构造的任意代码漏洞代码。
示例如下:
//读取输入流,并转换对象 InputStream?in=request.getlnputStream(); ObjectlnputStream?ois?=?new?ObjectlnputStream(in): //恢复对象 ois.readObject(); ois.close(); |
可能导致两种主要类型的攻击:
反序列化缺陷还可能导致拒绝服务、访问控制攻击。
唯一安全的架构模式是不接受来自不受信源的序列化对象,也不使用只允许原始数据类型的序列化介质。如果做不到以上要求,可以考虑使用下述方法——
??更多内容:??????OWASP TOP 10 之敏感数据泄露