PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化


Posted in PHP onApril 11, 2022
<?php
//flag is in flag.php
//WTF IS THIS?
//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95
//And Crack It!
class Modifier {
    protected  $var;
    public function append($value){
        include($value);
    }
    public function __invoke(){
        $this->append($this->var);
    }
}
class Show{
    public $source;
    public $str;
    public function __construct($file='index.php'){
        $this->source = $file;
        echo 'Welcome to '.$this->source."<br>";
    }
    public function __toString(){
        return $this->str->source;
    }
    public function __wakeup(){
        if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
            echo "hacker";
            $this->source = "index.php";
        }
    }
}
class Test{
    public $p;
    public function __construct(){
        $this->p = array();
    }
    public function __get($key){
        $function = $this->p;
        return $function();
    }
}
if(isset($_GET['pop'])){
    @unserialize($_GET['pop']);
}
else{
    $a=new Show;
    highlight_file(__FILE__);
}

一大段代码,随意瞟一眼看见wakeup等魔法方法,我就知道要利用反序列化了,还有include文件包含漏洞,但这里考的不是如何绕过反序列化,而是我不知道的序列化POP链。

根据学习,以下是我的心得:

__invoke:当尝试将该函数所存在的对象用函数方法调用时触发

__construct:当一个对象被创建时调用,类似于构造函数

__toString:当对象被当作字符串使用时调用

__wakeup:当调用unserialize反序列化的时候提前调用

__get:当调用不可访问的属性时调用该函数(1、私有属性,2、没有初始化的属性)

现在我们要利用include读取flag.txt,就肯定要调用invoke,就必须把这三个类联系在一起,因为Show类里面有wakeup函数,include函数在modifier里面,肯定是最后一个看,因此我们要从Show类里面看起(先定义一下$a=new Show()):

public function __toString(){
        return $this->str->source;
    }
public function __wakeup(){
        if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
            echo "hacker";
            $this->source = "index.php";
        }

wakeup函数里面是一个正则表达式,目前对我们没有多大用处,toString这个函数如果被调用了(目前不知道怎么调用这个函数就先跳过),会返回$this->str->source;这时我们想到,如果$this->str代表的是一个Test类呢

public function __get($key){
        $function = $this->p;
        return $function();
    }

因为Test类中没有source这个属性,因此会调用get方法,就这样可以把Show和Test连接在一起,我们可以构造一个这个:$a->str=new Test();调用get方法后,很明显是一个将$this->看成一个对象,用函数的方法调用,因此来引发invoke方法

public function append($value){
        include($value);
    }
public function __invoke(){
        $this->append($this->var);
    }

因此我们继续构造:$a->str->p=new Modifier();这里需要用到var属性,我们就可以将var赋值为php://filter/read=convert.base64-encode/resource=flag.php,因为这里没有过滤,就可以放心用。

现在问题就是怎么开始调用toString()这个函数,看了别人的wp说可以再实例化一次,$b=new Show($a);因为Show里面的construct函数是$file='index.php'参数,如果不传参的话就会使默认值,当我们把$a这个对象传入后,this->source=$a,然后遇到正则表达式,因为正则表达式是对字符串进行过滤嘛,因此$a被当作了字符串,因此引发了toString这个函数。

最终我们的构造是 

PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化

这里有点烦的就是由protect属性,要加%00*%00,这里我学了一个小技巧,我们可以给他进一步url编码,可以无视那些不可见字符,urlencode()

PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化

将编码后的传入pop参数

PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化

PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化

 又知道一个pop序列化链的知识。


Tags in this post...

PHP 相关文章推荐
php实现首页链接查询 友情链接检查的代码
Jan 05 PHP
PHP array 的加法操作代码
Jul 24 PHP
yii框架源码分析之创建controller代码
Jun 28 PHP
php中global和$GLOBALS[]的分析之一
Feb 02 PHP
基于PHP遍历数组的方法汇总分析
Jun 08 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
Jun 18 PHP
php动态生成函数示例
Mar 21 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
Aug 21 PHP
PHP获取当前所在目录位置的方法
Nov 26 PHP
PHP中Closure类的使用方法及详解
Oct 09 PHP
php操作路径的经典方法(必看篇)
Oct 04 PHP
深入浅出讲解:php的socket通信原理
Dec 03 PHP
PHP正则表达式之RCEService回溯
微信小程序结合ThinkPHP5授权登陆后获取手机号
PHP遍历数组的6种方式总结
Nov 17 #PHP
关于PHP数组迭代器的使用方法实例
php双向队列实例讲解
Nov 17 #PHP
如何解决php-fpm启动不了问题
Nov 17 #PHP
一次项目中Thinkphp绕过禁用函数的实战记录
You might like
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
关于PHP中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
php2html php生成静态页函数
2008/12/08 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
Laravel 5.2 文档 数据库 ―― 起步介绍
2019/10/21 PHP
js小数运算出现多位小数如何解决
2015/10/08 Javascript
获取阴历(农历)和当前日期的js代码
2016/02/15 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
2017/07/18 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
vue渲染方式render和template的区别
2020/06/05 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
Python数据结构与算法之图结构(Graph)实例分析
2017/09/05 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
python将视频转换为全字符视频
2019/04/26 Python
python中的decimal类型转换实例详解
2019/06/26 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
GANT葡萄牙官方商店:拥有美国运动服传统的生活方式品牌
2018/10/18 全球购物
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
留学推荐信怎么写
2014/01/25 职场文书
庆七一活动方案
2014/01/25 职场文书
宣传活动总结范文
2014/07/01 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
公司更名通知函
2015/04/24 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
python playwright 自动等待和断言详解
2021/11/27 Python