class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=
可以看到__wakeup()函数,此函数常用于反序列化当中。
了解序列化与反序列化点这里
但是这里没有对任何字符串进行反序列化,所以我们尝试将该类实例化后再进行序列化。实例化就是使用new申请新空间,此方法适用于类的操作。例如:
class a{
public i=0;
}
$c = new a();
/*此时 $c—>i = 0;*/
/*相当于定义了一个基于a类的对象*/
在php中执行以下代码进行实例化
<?php class xctf{ public $flag = '111'; public function __wakeup(){ exit('bad requests'); } } $a=new xctf(); echo(serialize($a)); ?>
运行结果
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
直接传参后被再次序列化
回顾一下原理(序列化返回的字符串格式)
O:<length>:"<class name>":<n>:{<field name 1><field value 1>...<field name n><field value n>}
O:表示序列化的是对象
< length>:表示序列化的类名称长度
< class name>:表示序列化的类的名称
< n >:表示被序列化的对象的属性个数
< field name 1>:属性名
< field value 1>:属性值
如果直接传参给code会被__wakeup()函数再次序列化,所以要绕过他
利用__wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。
因此修改属性个数即可
the answer is : cyberpeace{eb5deddf4518c6b301ae6099680179a0}