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 相关文章推荐
初探PHP5
Oct 09 PHP
PHP4实际应用经验篇(3)
Oct 09 PHP
简单的过滤字符串中的HTML标记
Dec 25 PHP
php 服务器调试 Zend Debugger 的安装教程
Sep 25 PHP
php数组函数序列之array_flip() 将数组键名与值对调
Nov 07 PHP
php计算十二星座的函数代码
Aug 21 PHP
解析PHP提交后跳转
Jun 23 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
Oct 29 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
Jul 06 PHP
PHP substr()函数参数解释及用法讲解
Nov 23 PHP
PHP操作Redis数据库常用方法示例
Aug 25 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 PHP
PHP正则表达式之RCEService回溯
微信小程序结合ThinkPHP5授权登陆后获取手机号
PHP遍历数组的6种方式总结
Nov 17 #PHP
关于PHP数组迭代器的使用方法实例
php双向队列实例讲解
Nov 17 #PHP
如何解决php-fpm启动不了问题
Nov 17 #PHP
一次项目中Thinkphp绕过禁用函数的实战记录
You might like
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
基于jQuery的模仿新浪微博时间的组件
2011/10/04 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
利用jQuery和CSS将背景图片拉伸
2015/10/16 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
12个超实用的JQuery代码片段
2015/11/02 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
简单实现AngularJS轮播图效果
2020/04/10 Javascript
js实现动态增加文件域表单功能
2018/10/22 Javascript
Vue-CLI项目中路由传参的方式详解
2019/09/01 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
pygame播放音乐的方法
2015/05/19 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
Python八皇后问题解答过程详解
2019/07/29 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
python如何从键盘获取输入实例
2020/06/18 Python
浅谈PyTorch中in-place operation的含义
2020/06/27 Python
幼儿园教学管理制度
2014/02/04 职场文书
应届电子商务毕业自荐书范文
2014/02/11 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
报关报检委托书
2014/04/08 职场文书
2014年幼师工作总结
2014/11/22 职场文书
2015年世界无烟日活动方案
2015/05/04 职场文书
创业计划书之个人工作室
2019/08/22 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python
解析目标检测之IoU
2021/06/26 Python
浅析Python OpenCV三种滤镜效果
2022/04/11 Python
centos7安装mysql5.7经验记录
2022/05/02 Servers