1._wakeup()函数的定义:
__wakeup()
是 PHP 中一个特殊的魔术方法。它在反序列化一个对象时被自动调用,允许开发者在对象从序列化格式还原为可用的 PHP 对象之前对其进行某些特殊处理。这个方法可以接受任意的参数,但在实际使用中,它通常不需要参数。
2._wakeup()函数的作用:
__wakeup()
方法的目的是在对象反序列化后执行一些特定的操作,以还原对象的状态或执行其他必要的逻辑。这个方法可以用来初始化一些无法在序列化字符串中保存的成员变量、建立数据库连接、重新计算缓存数据等。
3._wakeup()函数的举例:
下面是一个简单的示例,展示了__wakeup()
方法的用法:
class MyClass {
private $data;
public function __construct($data) {
$this->data = $data;
}
public function __wakeup() {
// 在反序列化后执行的操作
$this->data = 'Restored Data';
echo "Object has been restored.\n";
}
}
// 序列化对象
$object = new MyClass('Original Data');
$serialized = serialize($object);
// 反序列化对象
$restored = unserialize($serialized);
在上述示例中,MyClass
类定义了一个私有属性$data
和一个__wakeup()
方法。当对象被反序列化后,__wakeup()
方法会被调用,将$data
属性的值设置为"Restored Data",并输出一条消息。
需要注意的是,__wakeup()
方法在反序列化时自动调用,而不是通过代码直接调用。这意味着它不应该在常规的程序流程中手动调用,而是由序列化和反序列化函数(如serialize()
和unserialize()
)自动触发。
4._wakeup()函数的绕过:
(1)当反序列化字符串中,表示属性个数的值⼤于真实属性个数时,会绕过 __wakeup 函数的执⾏。
标准序列化结果
O:4:"User":2:{s:8:"username";s:4:"wenda";s:8:"password";s:4:"wenda";}
将2改为3 绕过__Wakeup魔法函数
O:4:"User":3:{s:8:"username";s:4:"wenda";s:8:"password";s:4:"wenda";}
(2)使用C绕过
使用C代替O能绕过_wakeup(),但那样的话只能执行construct()函数或者destruct()函数,无法添加任何内容
注意:使用C绕过有版本要求
以上为常见的绕过方法 更深入的参考大佬文章: