初探反序列化漏洞

什么是反序列化?
序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
serialize()序列化
unserialize()反序列化
案例:
image.png
序列化的结果
image.png
序列化的结果
image.png
O代表是object对象,对象名有4个字符,对象名为”Test”:3 指有三个属性,s:4说明有4个字符,属性名为name,值是字符串类型,值为”Tom”…

为什么会产生这个漏洞?

PHP将所有以一(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以一为前缀。
常见的魔术方法:

  1. __construct()当一个对象创建时被调用
  2. __destruct()当一个对象销毁时被调用
  3. __toString()当一个对象被当作一个字符串使用
  4. __sleep()在对象在被序列化之前运行
  5. __wakeup将在反序列化之后立即被调用

案例:
image.png
image.png
image.png
image.png

简单CTF实例

image.png
image.png
image.png

特殊属性的反序列化

序列化为了能把整个类对象的各种信息完完整整的压缩,格式化,也会将属性的权限序列化进去。但不同类型的属性会有不同的格式

  1. Public 权限

可以内部调用,实例调用等

  1. Private权限

被private修饰的只能是同一个类的可以访问

  1. Protected权限

对继承的类开放,没继承的类不开放