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 相关文章推荐
Uchome1.2 1.5 代码学习 common.php
Apr 24 PHP
php中cookie的使用方法
Mar 29 PHP
php使用ereg验证文件上传的方法
Dec 16 PHP
JavaScript实现滚动栏效果的方法
Apr 27 PHP
PHP中addslashes与mysql_escape_string的区别分析
Apr 25 PHP
PHP基本语法实例总结
Sep 09 PHP
PHPCMS手机站伪静态设置详细教程
Feb 06 PHP
php简单中奖算法(实例)
Aug 15 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
php微信公众号开发之欢迎老朋友
Oct 20 PHP
PHP SESSION机制的理解与实例
Mar 22 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 PHP
PHP正则表达式之RCEService回溯
微信小程序结合ThinkPHP5授权登陆后获取手机号
PHP遍历数组的6种方式总结
Nov 17 #PHP
关于PHP数组迭代器的使用方法实例
php双向队列实例讲解
Nov 17 #PHP
如何解决php-fpm启动不了问题
Nov 17 #PHP
一次项目中Thinkphp绕过禁用函数的实战记录
You might like
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
Smarty中调用FCKeditor的方法
2014/10/27 PHP
PHP的自定义模板引擎
2017/03/24 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
javascript 写类方式之四
2009/07/05 Javascript
javascript 三种编解码方式
2010/02/01 Javascript
解析js原生方法创建表格效率测试
2013/07/08 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
JavaScript实现Flash炫光波动特效
2015/05/14 Javascript
使用Chrome浏览器调试AngularJS应用的方法
2015/06/18 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
python保存二维数组到txt文件中的方法
2018/11/15 Python
详解python和matlab的优势与区别
2019/06/28 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
Python callable内置函数原理解析
2020/03/05 Python
python通过cython加密代码
2020/12/11 Python
图解CSS3制作圆环形进度条的实例教程
2016/05/26 HTML / CSS
html5 Canvas画图教程(5)—canvas里画曲线之arc方法
2013/01/09 HTML / CSS
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
写求职信要注意什么问题
2014/04/12 职场文书
中学生演讲稿
2014/04/26 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
货款欠条范本
2015/07/03 职场文书
职工培训工作总结
2015/08/10 职场文书