首先看见题之后知道他是反序列化因为看见了__wakeup()魔法函数
一些常见的魔术方法:
__construct() :构造函数,当创建对象时自动调用。
__destruct():析构函数,在对象的所有引用都被删除时或者对象被显式销毁时调用,当对象被销毁时自动调用。
__wakeup():进行unserialize时会查看是否有该函数,有的话有限调用。会进行初始化对象。
__ toString():当一个类被当成字符串时会被调用。
__sleep():当一个对象被序列化时调用,可与设定序列化时保存的属性。
在这里给大家补充一些知识
反序列化漏洞的利用
由于反序列化时unserialize()函数会自动调用wakeup(),destruct(),函数,当有一些漏洞或者恶意代码在这些函数中,当我们控制序列化的字符串时会去触发他们,从而达到攻击。
<?php
class xctf{
public $flag = '111';
public function __wakeup(){ //_wakeup()是魔法函数,被反序列化时立即被调用
exit('bad requests'); //这里没有被反序列化,根本不运行魔法函数
}
}
$a= new xctf(); //创建新对象
print(serialize($a)); //对对象序列化输出
?>
运行代码结果;
这是反序列化的结果
当被反序列化的字符串其中对应的对象的属性个数发生变化时,会导致反序列化失败而同时__wakeup也会失效;
将数字4改成1发现反序列化失败得到了flag
当对象被序列化时,会将对象的属性和属性值存储在序列化的字符串中。当使用unserialize()函数对序列化的字符串进行反序列化时,PHP会尝试将存储的属性和属性值重新赋值给对象。如果反序列化的字符串中的属性个数与对象的属性个数不匹配,PHP会抛出一个错误,反序列化失败。