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 相关文章推荐
桌面中心(一)创建数据库
Oct 09 PHP
PHP Smarty生成EXCEL文档的代码
Aug 23 PHP
使用PHP实现二分查找算法代码分享
Jun 24 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
Jun 21 PHP
php调用MySQL存储过程的方法集合(推荐)
Jul 03 PHP
PHP面向对象程序设计之类常量用法实例
Aug 20 PHP
分享PHP守护进程类
Dec 30 PHP
PHP实现多图上传(结合uploadify插件)思路分析
Nov 30 PHP
php设计模式之策略模式应用案例详解
Jun 17 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
Oct 12 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
Oct 16 PHP
PHP扩展安装方法步骤解析
Nov 24 PHP
PHP正则表达式之RCEService回溯
微信小程序结合ThinkPHP5授权登陆后获取手机号
PHP遍历数组的6种方式总结
Nov 17 #PHP
关于PHP数组迭代器的使用方法实例
php双向队列实例讲解
Nov 17 #PHP
如何解决php-fpm启动不了问题
Nov 17 #PHP
一次项目中Thinkphp绕过禁用函数的实战记录
You might like
Zend 输出产生XML解析错误
2009/03/03 PHP
php购物车实现代码
2011/10/10 PHP
php用户注册时常用的检验函数实例总结
2014/12/22 PHP
PHP获取文件相对路径的方法
2015/02/26 PHP
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
js创建数据共享接口——简化框架之间相互传值
2011/10/23 Javascript
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
jquery可见性过滤选择器使用示例
2013/06/24 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
15款jQuery分布引导插件分享
2015/02/04 Javascript
js右下角弹出提示框示例代码
2016/01/12 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
bootstrap paginator分页前后台用法示例
2017/06/17 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
js+css实现打字效果
2020/06/24 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
element中Steps步骤条和Tabs标签页关联的解决
2020/12/08 Javascript
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
浅谈Python基础之I/O模型
2017/05/11 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
2017/09/26 Python
python实现list由于numpy array的转换
2018/04/04 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
Python2和3字符编码的区别知识点整理
2019/08/08 Python
python 实现简易的记事本
2020/11/30 Python
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS
动画「半妖的夜叉姬」新BD特典图公开
2022/03/22 日漫