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 简单日历实现代码
Oct 28 PHP
供参考的 php 学习提高路线分享
Oct 23 PHP
使用PHPMyAdmin修复论坛数据库的图文方法
Jan 09 PHP
通过缓存数据库结果提高PHP性能的原理介绍
Sep 05 PHP
PHP实现操作redis的封装类完整实例
Nov 14 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
Apr 11 PHP
php实现三级级联下拉框
Apr 17 PHP
PHP实现适用于自定义的验证码类
Jun 15 PHP
解决微信授权回调页面域名只能设置一个的问题
Dec 11 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
Swoole实现异步投递task任务案例详解
Apr 02 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
Aug 14 PHP
PHP正则表达式之RCEService回溯
微信小程序结合ThinkPHP5授权登陆后获取手机号
PHP遍历数组的6种方式总结
Nov 17 #PHP
关于PHP数组迭代器的使用方法实例
php双向队列实例讲解
Nov 17 #PHP
如何解决php-fpm启动不了问题
Nov 17 #PHP
一次项目中Thinkphp绕过禁用函数的实战记录
You might like
生成卡号php代码
2008/04/09 PHP
常用的php对象类型判断
2008/08/27 PHP
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
PHP图片水印类的封装
2017/07/06 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
iframe调用父页面函数示例详解
2014/07/17 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
JavaScript中Window对象的属性及事件
2015/12/25 Javascript
使用watch监听路由变化和watch监听对象的实例
2018/02/24 Javascript
微信小程序实现多选功能
2018/11/04 Javascript
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
单链表反转python实现代码示例
2018/02/08 Python
Python数组并集交集补集代码实例
2020/02/18 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
2021/01/08 Python
俄罗斯童装网上商店:BebaKids
2020/06/06 全球购物
安全检查验收制度
2014/01/12 职场文书
四查四看剖析材料
2014/02/14 职场文书
2014年感恩母亲演讲稿
2014/05/27 职场文书
旅游专业毕业生自荐书
2014/06/30 职场文书
公司租房协议书范本
2014/10/08 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
护士个人年度总结范文
2015/02/13 职场文书
家长对孩子的寒假评语
2015/10/09 职场文书
服务行业标语口号
2015/12/26 职场文书
python库sklearn常用操作
2021/08/23 Python
JavaScript前端面试组合函数
2022/06/21 Javascript