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中HTTP方式下的Gzip压缩传输方法举偶
Feb 15 PHP
PHP 可阅读随机字符串代码
May 26 PHP
PHP+JS+rsa数据加密传输实现代码
Mar 23 PHP
sphinx增量索引的一个问题
Jun 14 PHP
ThinkPHP CURD方法之page方法详解
Jun 18 PHP
ThinkPHP登录功能的实现方法
Aug 20 PHP
PHP中判断文件存在使用is_file还是file_exists?
Apr 03 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 PHP
如何使用php等比例缩放图片
Oct 12 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
May 30 PHP
php快速导入大量数据的实例方法
Sep 23 PHP
PHP正则表达式之RCEService回溯
微信小程序结合ThinkPHP5授权登陆后获取手机号
PHP遍历数组的6种方式总结
Nov 17 #PHP
关于PHP数组迭代器的使用方法实例
php双向队列实例讲解
Nov 17 #PHP
如何解决php-fpm启动不了问题
Nov 17 #PHP
一次项目中Thinkphp绕过禁用函数的实战记录
You might like
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
Jquery 获取表单text,areatext,radio,checkbox,select值的代码
2009/11/12 Javascript
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
javascript URL编码和解码使用说明
2010/04/12 Javascript
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
javascript操作excel生成报表全攻略
2014/05/04 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
2016/09/28 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
2017/02/20 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
js事件机制----捕获与冒泡机制实例分析
2020/05/22 Javascript
javascript实现简单页面倒计时
2021/03/02 Javascript
django1.8使用表单上传文件的实现方法
2016/11/04 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
Python多进程fork()函数详解
2019/02/22 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
使用Python串口实时显示数据并绘图的例子
2019/12/26 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
python中字典增加和删除使用方法
2020/09/30 Python
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
美工的岗位职责
2013/11/14 职场文书
环境科学专业个人求职的自我评价
2013/11/28 职场文书
函授自我鉴定范文
2014/02/06 职场文书
安全生产承诺书范文
2014/05/22 职场文书
公司授权委托书范文
2014/08/02 职场文书
房屋租赁合同解除协议书
2014/10/11 职场文书
优秀党员事迹材料
2014/12/18 职场文书
小学教师教育随笔
2015/08/14 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android