对象序列化
- O代表object(若是A,则代表数组)
- 7代表对象名字占7个字符
- 3 代表三个参数
- s -> string i -> int
serialize 序列化
unserialize 反序列化
补充知识
__sleep() 和 __wakeup():
__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。
与之相反,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。
__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
__serialize() 和 __unserialize():
serialize() 函数会检查类中是否存在一个魔术方法 __serialize()。如果存在,该方法将在任何序列化之前优先执行。它必须以一个代表对象序列化形式的 键/值 成对的关联数组形式来返回,如果没有返回数组,将会抛出一个 TypeError 错误。
-
__construct()当一个对象创建时被调用
-
__destruct()当一个对象销毁时被调用
-
__toString()当一个对象被当作一个字符串使用
-
__sleep() 在对象在被序列化之前运行
-
__wakeup将在序列化之后立即被调用
__wakeup()绕过
反序列化时,如果表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup( )的执行。
影响版本:
PHP before 5.6.25
7.x before 7.0.10
只有xctf类
- unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup
方法,预先准备对象需要的资源。
故需绕过__wakeup()
利用漏洞绕过