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中文字符截取防乱码
Mar 28 PHP
PHP中的命名空间相关概念浅析
Jan 22 PHP
分享一则PHP定义函数代码
Feb 26 PHP
PHP下载生成的csv文件及问题总结
Aug 06 PHP
微信获取用户地理位置信息的原理与步骤
Nov 12 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 PHP
php 使用redis锁限制并发访问类示例
Nov 02 PHP
Zend Framework过滤器Zend_Filter用法详解
Dec 09 PHP
php格式化时间戳
Dec 17 PHP
PHP中使用OpenSSL生成证书及加密解密
Feb 05 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
PHP+Apache环境中如何隐藏Apache版本
Nov 24 PHP
PHP正则表达式之RCEService回溯
微信小程序结合ThinkPHP5授权登陆后获取手机号
PHP遍历数组的6种方式总结
Nov 17 #PHP
关于PHP数组迭代器的使用方法实例
php双向队列实例讲解
Nov 17 #PHP
如何解决php-fpm启动不了问题
Nov 17 #PHP
一次项目中Thinkphp绕过禁用函数的实战记录
You might like
新浪新闻小偷
2006/10/09 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
国产PHP开发框架myqee新手快速入门教程
2014/07/14 PHP
tp5修改(实现即点即改)
2019/10/18 PHP
让复选框只能选择一项的方法
2013/10/08 Javascript
js查找某元素中的所有图片地址的方法
2014/01/16 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
2015/03/26 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
详解js中call与apply关键字的作用
2016/11/21 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
2016/12/29 Javascript
Vue中img的src属性绑定与static文件夹实例
2017/05/18 Javascript
redux中间件之redux-thunk的具体使用
2018/04/17 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
2018/08/07 Javascript
JS实现求5的阶乘示例
2019/01/21 Javascript
[47:53]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#2COL VS Spirit
2016/03/02 DOTA
[01:11:08]Winstrike vs NB 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
TensorFlow如何实现反向传播
2018/02/06 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
python数据处理 根据颜色对图片进行分类的方法
2018/12/08 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
Python文件操作方法详解
2020/02/09 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
德国药房apodiscounter中文官网:德国排名前三的网上药店
2019/06/03 全球购物
测试工程师岗位职责
2013/11/28 职场文书
团队精神演讲稿
2013/12/31 职场文书
初三开学计划书
2014/04/27 职场文书
教师一帮一活动总结
2014/07/08 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL