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 strlen mb_strlen计算中英文混排字符串长度
Jul 10 PHP
PHP JSON格式数据交互实例代码详解
Jan 13 PHP
PHP中全面阻止SQL注入式攻击分析小结
Jan 30 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
Aug 31 PHP
codeigniter框架批量插入数据
Jan 09 PHP
PHP程序员基本要求和必备技能
May 09 PHP
使用symfony命令创建项目的方法
Mar 17 PHP
php文件上传的两种实现方法
Apr 04 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
Jun 30 PHP
浅谈php fopen下载远程文件的函数
Nov 18 PHP
PHP函数rtrim()使用中的怪异现象分析
Feb 24 PHP
CodeIgniter框架验证码类库文件与用法示例
Mar 18 PHP
PHP正则表达式之RCEService回溯
微信小程序结合ThinkPHP5授权登陆后获取手机号
PHP遍历数组的6种方式总结
Nov 17 #PHP
关于PHP数组迭代器的使用方法实例
php双向队列实例讲解
Nov 17 #PHP
如何解决php-fpm启动不了问题
Nov 17 #PHP
一次项目中Thinkphp绕过禁用函数的实战记录
You might like
巧用php中的array_filter()函数去掉多维空值的代码分享
2012/09/07 PHP
php统计文章排行示例
2014/03/04 PHP
微信支付PHP SDK之微信公众号支付代码详解
2015/12/09 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
js null undefined 空区别说明
2010/06/13 Javascript
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
Javascript 两种刷新方法以及区别和适用范围
2017/01/17 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
2017/02/23 Javascript
微信小程序表单验证form提交错误提示效果
2020/06/19 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
python进阶教程之动态类型详解
2014/08/30 Python
Python中将字典转换为列表的方法
2016/09/21 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
在Windows中设置Python环境变量的实例讲解
2018/04/28 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
Python 寻找局部最高点的实现
2019/12/05 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
html5弹跳球示例代码
2013/07/23 HTML / CSS
美国著名首饰网站:BaubleBar
2016/08/29 全球购物
联想台湾官网:Lenovo TW
2018/05/09 全球购物
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
企业党员公开承诺书
2014/03/26 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
房租涨价通知
2015/04/23 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书