[MRCTF2020]Ezpop

首先,看到题目就已经知道,应该是一个反序列化的题,打开环境,发现有三个类:

这里先进行一个简单的分析,Modifier类是进行文件包含的,根据提示我们知道flag在flag.php中,因此我们肯定是要用到这里的文件包含的,然后是show类,这里有三种魔术方法,触发条件也已经注释上了,然后是Test类:

这里我们想要做的是读取flag.php,然后就要触发invoke魔术方法,而想要触发invoke魔术方法就就是类被当作是函数调用,也就是要触发Test类中的__get魔术方法,而想要触发这个魔术方法,就要访问类中的私有属性或者是不存在的属性,也就是触发Show类中的toString魔术方法,而想要触发这个魔术方法,就是对象也就是类,被当成字符串使用。也就是Show类中的wakeup魔术方法,而想要触发该魔术方法就要使用反序列化函数,而恰好,我们通过get传参执行的就是反序列化函数。这样就构造了一个完整的pop链。这时我们从终点反向推,构造的序列化代码如下:

解释一下,我们传参pop会触发__wakeup魔术方法,然后检测到a对象的source属性是b对象,这样就会触发__toString魔术方法,从而执行读取b对象的str属性的source属性,而我们的b对象的str属性值为Test对象,而这个对象中不存在source属性,就会触发Test对象中的__get魔术方法,而我们的Test对象中的p属性的值是Modifier对象,这样在执行的时候,把这个对象当成函数执行,这样就触发了,Modifier对象中的__invoke魔术方法,从而执行我们的包含flag.php操作。

在执行之后,我们得到的是:

这时我们就要想办法读取该页面的源代码,我们知道这里的过滤有:/gopher|http|file|ftp|https|dict|

因此这里构造:

这样来读取flag.php的源码:

然后base64解码即可:

相关推荐
BingoGo2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack4 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo4 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack5 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082855 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe5 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5