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 相关文章推荐
解析CI的AJAX分页 另类实现方法
Jun 27 PHP
php使用百度ping服务代码实例
Jun 19 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
Feb 10 PHP
android上传图片到PHP的过程详解
Aug 03 PHP
简单介绍win7下搭建apache+php+mysql开发环境
Aug 06 PHP
php删除数组中重复元素的方法
Dec 22 PHP
PHP大神的十大优良习惯
Sep 14 PHP
php中序列化与反序列化详解
Feb 13 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
Mar 16 PHP
PHP实现搜索时记住状态的方法示例
May 11 PHP
php用xpath解析html的代码实例讲解
Feb 14 PHP
PHP7 其他语言层面的修改
Mar 09 PHP
PHP正则表达式之RCEService回溯
微信小程序结合ThinkPHP5授权登陆后获取手机号
PHP遍历数组的6种方式总结
Nov 17 #PHP
关于PHP数组迭代器的使用方法实例
php双向队列实例讲解
Nov 17 #PHP
如何解决php-fpm启动不了问题
Nov 17 #PHP
一次项目中Thinkphp绕过禁用函数的实战记录
You might like
PHP语法速查表
2006/12/06 PHP
php图片上传类 附调用方法
2016/05/15 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
php格式文件打开的四种方法
2018/02/24 PHP
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
javascript文件中引用依赖的js文件的方法
2014/03/17 Javascript
jquery常用操作小结
2014/07/21 Javascript
Jquery动态添加输入框的方法
2015/05/29 Javascript
js跨域请求数据的3种常用的方法
2015/12/01 Javascript
JS表格组件神器bootstrap table详解(强化版)
2016/05/26 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
vue按需加载实例详解
2019/09/06 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
2020/10/29 Javascript
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
python每次处理固定个数的字符的方法总结
2013/01/29 Python
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
Python中的生成器和yield详细介绍
2015/01/09 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
python3.5绘制随机漫步图
2018/08/27 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
Python实现壁纸下载与轮换
2020/10/19 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
检讨书格式
2019/04/25 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
如何理解及使用Python闭包
2021/06/01 Python