题目
分析
根据题目指向,这题是反序列化漏洞。
分析代码:
class xctf{
public $flag = '111'; // 变量flag初始化为111
public function __wakeup(){ // “__wakeup”:PHP魔术方法,在序列化后立即被调用
exit('bad requests'); // 输出“bad requests”
}
?code= // 不完整
代码中的 “__wakeup” 函数
显然题示代码并不完整,括号未闭合,代码里也未出现 unserialize() 函数。
我们构造序列化代码,命名为 serialize.php,代码如下:
<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}
// 创建新对象用于序列化xctf函数
$serxctf = new xctf();
echo(serialize($serxctf));
?>
安装并配置 phpStudy,运行 serialize.php,得到序列化值:
如果直接将序列化值传入 code,则会直接触发 “__wakeup” 函数:
因此需要绕开 “__wakeup” 函数,这里我们将数据类型 O 改为 z 使字符串被回收:
得到 flag。
Flag
cyberpeace{b2ab1035acae9b3d153389706cc2296c}
参考
PHP 代码审计-CTF Wiki
PHP中private、public、protected的区别详解-周伯通之草堂-博客园
PHP反序列化漏洞-LuckySec
(简单实用小技巧)在浏览器如何打开php文件-✧* ꧁柠檬ヤ汽水꧂✧*-CSDN
PHP 序列化(serialize)格式详解-leonzhang2008-CSDN
绕过__wakeup() 反序列化 合集-Jay 17-CSDN