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,不用COM,生成excel文件
Oct 09 PHP
php5.5中类级别的常量使用介绍
Oct 02 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
Jan 06 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 PHP
destoon实现公司新闻详细页添加评论功能的方法
Jul 15 PHP
WordPress自定义时间显示格式
Mar 27 PHP
php获取图片信息的方法详解
Dec 10 PHP
PHP7标量类型declare用法实例分析
Sep 26 PHP
THinkPHP获取客户端IP与IP地址查询的方法
Nov 14 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
Oct 17 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
Jun 10 PHP
PHP的简单跳转提示的实现详解
Mar 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中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
JavaScript 事件记录使用说明
2009/10/20 Javascript
Javascript学习笔记一 之 数据类型
2010/12/15 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
javascript动态加载实现方法一
2012/08/22 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
2013/08/21 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
js实现指定时间倒计时效果
2019/08/26 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
Vue中key的作用示例代码详解
2020/06/10 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
python处理文本文件并生成指定格式的文件
2014/07/31 Python
利用python批量检查网站的可用性
2016/09/09 Python
使用Python脚本和ADB命令实现卸载App
2017/02/10 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
英国百安居装饰建材网上超市:B&Q
2016/09/13 全球购物
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
汽车销售顾问求职自荐信
2014/01/01 职场文书
党员创先争优承诺书
2014/03/26 职场文书
学校四风对照检查材料
2014/08/28 职场文书
学生不讲诚信检讨书
2014/09/29 职场文书
2014年学校体育工作总结
2014/12/08 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书
关于开学的感想
2015/08/10 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python
Python数据分析之pandas读取数据
2021/06/02 Python
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
2023/05/08 MySQL