序列化与反序列化--攻防世界unserialize3

对象序列化

在这里插入图片描述
在这里插入图片描述

  • 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()
在这里插入图片描述
利用漏洞绕过

猜你喜欢

转载自blog.csdn.net/qq_53755216/article/details/114895761