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 相关文章推荐
apache php模块整合操作指南
Nov 16 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
Feb 28 PHP
PHP函数in_array()使用详解
Aug 20 PHP
php数组排序usort、uksort与sort函数用法
Nov 17 PHP
php将csv文件导入到mysql数据库的方法
Dec 24 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
Dec 23 PHP
php使用ftp实现文件上传与下载功能
Jul 21 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
ThinkPHP5框架缓存查询操作分析
May 30 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
Aug 15 PHP
laravel5.1框架model类查询的实现方法
Oct 08 PHP
laravel 之 Eloquent 模型修改器和序列化示例
Oct 17 PHP
PHP正则表达式之RCEService回溯
微信小程序结合ThinkPHP5授权登陆后获取手机号
PHP遍历数组的6种方式总结
Nov 17 #PHP
关于PHP数组迭代器的使用方法实例
php双向队列实例讲解
Nov 17 #PHP
如何解决php-fpm启动不了问题
Nov 17 #PHP
一次项目中Thinkphp绕过禁用函数的实战记录
You might like
php上传文件的增强函数
2010/07/21 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
PHP实现加强版加密解密类实例
2015/07/29 PHP
js玩一玩WSH吧
2007/02/23 Javascript
JS date对象的减法处理实现代码
2010/12/28 Javascript
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
jquery中radio checked问题
2015/03/16 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
jquery.map()方法的使用详解
2015/07/09 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
JS表格组件神器bootstrap table详解(强化版)
2016/05/26 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
Python中的字典遍历备忘
2015/01/17 Python
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
基于Python和Scikit-Learn的机器学习探索
2017/10/16 Python
在django admin中添加自定义视图的例子
2019/07/26 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
Django实现文件上传下载功能
2019/10/06 Python
python让函数不返回结果的方法
2020/06/22 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
课改先进个人汇报材料
2014/01/26 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
小学英语课后反思
2014/04/26 职场文书
创优争先心得体会
2014/09/11 职场文书
亮剑观后感600字
2015/06/05 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
win10键盘驱动怎么修复?Win10键盘驱动修复小技巧
2022/04/06 数码科技