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 和 HTML
Oct 09 PHP
解析func_num_args与func_get_args函数的使用
Jun 24 PHP
取得单条网站评论以数组形式进行输出
Jul 28 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
Nov 18 PHP
使用 PHPStorm 开发 Laravel
Mar 24 PHP
PHP register_shutdown_function()函数的使用示例
Jun 23 PHP
PHP实现微信发红包程序
Aug 24 PHP
PHP引用返回用法示例
May 28 PHP
php中bind_param()函数用法分析
Mar 28 PHP
PHP实现的登录页面信息提示功能示例
Jul 24 PHP
PHP程序员学习使用Swoole的理由
Jun 24 PHP
PHP关于foreach复制知识点总结
Jan 28 PHP
PHP正则表达式之RCEService回溯
微信小程序结合ThinkPHP5授权登陆后获取手机号
PHP遍历数组的6种方式总结
Nov 17 #PHP
关于PHP数组迭代器的使用方法实例
php双向队列实例讲解
Nov 17 #PHP
如何解决php-fpm启动不了问题
Nov 17 #PHP
一次项目中Thinkphp绕过禁用函数的实战记录
You might like
php 小乘法表实现代码
2009/07/16 PHP
php身份证号码检查类实例
2015/06/18 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
js用Date对象处理时间实现思路及代码
2013/01/31 Javascript
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
由浅入深剖析Angular表单验证
2016/07/14 Javascript
JsChart组件使用详解
2018/03/04 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
[02:48]DOTA2英雄基础教程 暗夜魔王
2013/12/12 DOTA
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
python删除某个字符
2018/03/19 Python
python实现简易动态时钟
2018/11/19 Python
Python闭包和装饰器用法实例详解
2019/05/22 Python
Apache,wsgi,django 程序部署配置方法详解
2019/07/01 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
2013/01/09 HTML / CSS
HTML5触摸事件实现移动端简易进度条的实现方法
2018/05/04 HTML / CSS
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
高中自我评价分享
2013/12/05 职场文书
金融行业务员的自我评价
2013/12/13 职场文书
建议书的格式
2014/05/12 职场文书
就业协议书
2014/09/12 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
领导参观欢迎词
2015/01/26 职场文书
通知格式
2015/04/27 职场文书
高质量“欢迎词”
2019/04/03 职场文书
goland 清除所有的默认设置操作
2021/04/28 Golang