1.序列化、反序列化的理解

之前看过反序列化的漏洞,不算是很系统。昨天和小伙伴正好遇到了一道反序列化的题目,借此总结一下。分俩个部分:

1.序列化、反序列化的理解

2.反序列化漏洞的成因及利用

1.序列化、反序列化的理解

0x01什么是序列化?

序列化: 将数据结构或对象转换成字节序列、二进制串的过程。
反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
注: 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。

0x02用处

让对象脱离运行环境的一种手段,可以有效的实现多平台之间的通信、对象持久化存储。 序列化成字节序列后,便于保存在内存、文件、数据库中,也可以理解为:序列化是指将一个对象转换成一个字符串,如:

O:7:"Logfile":1:    {s:8:"filename";s:10:"source.txt"   ;} 
0x03函数
Java:ObjectOutputStream类的writeObject()、 readObject()
PHP:serialize()、Unserialize()
0x04php序列字符串的模型意义
a - array 数组
b - boolean布尔型
d - double双精度型
i - integer
o - common object一般对象
r - reference
s - string
C - custom object 自定义对象
O - class
N - null
R - pointer reference
U - unicode string unicode编码的字符串
0x05使用场景

1) 一般来说,服务器启动后,就不会再关闭了,但是如果逼不得已需要重启,而用户会话还在进行相应的操作,这时就需要使用序列化将session信息保存起来放在硬盘,服务器重启后,又重新加载。这样就保证了用户信息不会丢失,实现永久化保存。
2) 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便减轻内存压力或便于长期保存。
比如:
最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。
以下都可能需要使用序列化:

• http参数,cookie,sesion,存储方式可能是base64(rO0),压缩后的base64(H4sl),MII等
• Servlets HTTP,Sockets,Session管理器 包含的协议就包括JMX,RMI,JMS,JNDI等(\xac\xed)
• xml Xstream,XMLDecoder等(HTTP Body:Content-Type:application/xml)
• json(Jackson,fastjson) http请求中
0x06PHP中的magic函数

magic函数以_开头。在特定的条件下会自动执行这些magic函数的内容,比如创建、销毁对象的时候。

construct(), destruct()

构造函数与析构函数,创建类销毁类时自动调用。

call(), callStatic()

方法重载的两个函数
__call()是在对象上下文中调用不可访问的方法时触发

__callStatic()是在静态上下文中调用不可访问的方法时触发。

get(), set()

__get()用于从不可访问的属性读取数据。
__set()用于将数据写入不可访问的属性。

isset(), unset()

__isset()在不可访问的属性上调用isset()或empty()触发。
__unset()在不可访问的属性上使用unset()时触发。

sleep(), wakeup()

serialize()检查您的类是否具有魔术名sleep()的函数。如果是这样,该函数在任何序列化之前执行。它可以清理对象,并且应该返回一个数组,其中应该被序列化的对象的所有变量的名称。如果该方法不返回任何内容,则将NULL序列化并发出E_NOTICE。sleep()的预期用途是提交挂起的数据或执行类似的清理任务。此外,如果有非常大的对象,不需要完全保存,该功能将非常有用。

unserialize()使用魔术名wakeup()检查函数的存在。如果存在,该功能可以重构对象可能具有的任何资源。wakeup()的预期用途是重新建立在序列化期间可能已丢失的任何数据库连接,并执行其他重新初始化任务。

__toString()

__toString()方法允许一个类决定如何处理像一个字符串时它将如何反应。

__invoke()

当脚本尝试将对象调用为函数时,调用__invoke()方法。

__set_state()
__clone()
__debugInfo()

发表评论

电子邮件地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部