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和ACCESS写聊天室(九)
Oct 09 PHP
PHPMailer邮件类利用smtp.163.com发送邮件方法
Sep 11 PHP
封装一个PDO数据库操作类代码
Sep 09 PHP
有关JSON以及JSON在PHP中的应用
Apr 09 PHP
PHP Directory 函数的详解
Mar 07 PHP
PHP连接SQLServer2005的方法
Jan 27 PHP
PHP+APACHE实现网址伪静态
Feb 22 PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 PHP
php 删除指定文件夹的实例讲解
Jul 25 PHP
Laravel模型间关系设置分表的方法示例
Apr 21 PHP
PHP中一个有趣的preg_replace函数详解
Aug 15 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
Mar 01 PHP
PHP正则表达式之RCEService回溯
微信小程序结合ThinkPHP5授权登陆后获取手机号
PHP遍历数组的6种方式总结
Nov 17 #PHP
关于PHP数组迭代器的使用方法实例
php双向队列实例讲解
Nov 17 #PHP
如何解决php-fpm启动不了问题
Nov 17 #PHP
一次项目中Thinkphp绕过禁用函数的实战记录
You might like
IIS+PHP+MySQL+Zend配置 (视频教程)
2006/12/13 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
PHP Cookie学习笔记
2016/08/23 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
2017/11/08 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
Jquery常用技巧收集整理篇
2010/11/14 Javascript
jquery用offset()方法获得元素的xy坐标
2014/09/06 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
用js实现简单算法的实例代码
2016/09/24 Javascript
Bootstrap实现下拉菜单多级联动
2017/11/23 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
python调用fortran模块
2016/04/08 Python
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
Python pandas库中的isnull()详解
2019/12/26 Python
python单例模式的应用场景实例讲解
2021/02/24 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
2021/03/04 Python
Kate Spade美国官网:纽约新兴时尚品牌,以包包闻名于世
2017/11/09 全球购物
餐饮加盟计划书
2014/01/10 职场文书
反腐倡廉警示教育活动总结
2014/05/05 职场文书
医学生求职自荐书
2014/06/12 职场文书
班级读书活动总结
2014/06/30 职场文书
2014年电教工作总结
2014/12/19 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
工程质检员岗位职责
2015/04/08 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python
详解Go语言中Get/Post请求测试
2022/06/01 Golang