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脚本的10个技巧(4)
Oct 09 PHP
php 中include()与require()的对比
Oct 09 PHP
php 设计模式之 单例模式
Dec 19 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
Jun 24 PHP
解析smarty 截取字符串函数 truncate的用法介绍
Jun 20 PHP
解析获取优酷视频真实下载地址的PHP源代码
Jun 26 PHP
使用PHP接收POST数据,解析json数据
Jun 28 PHP
PHP实现过滤掉非汉字字符只保留中文字符
Jun 04 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
May 04 PHP
php连接微软MSSQL(sql server)完全攻略
Nov 27 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
May 23 PHP
PHP常用函数之格式化时间操作示例
Oct 21 PHP
PHP正则表达式之RCEService回溯
微信小程序结合ThinkPHP5授权登陆后获取手机号
PHP遍历数组的6种方式总结
Nov 17 #PHP
关于PHP数组迭代器的使用方法实例
php双向队列实例讲解
Nov 17 #PHP
如何解决php-fpm启动不了问题
Nov 17 #PHP
一次项目中Thinkphp绕过禁用函数的实战记录
You might like
PHP在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
javascript实现的元素拖动函数宿主为浏览器
2014/07/21 Javascript
node.js中的fs.chownSync方法使用说明
2014/12/16 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
js实现类似菜单风格的TAB选项卡效果代码
2015/08/28 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
原生JavaScript实现轮播图
2021/01/10 Javascript
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
Python实现带下标索引的遍历操作示例
2019/05/30 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
Python如何操作office实现自动化及win32com.client的运用
2020/04/01 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
台湾母婴用品购物网站:Infant婴之房
2018/06/15 全球购物
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
母亲节感恩活动记录
2014/03/16 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
学校运动会简讯
2015/07/20 职场文书
五一放假通知怎么写
2015/08/18 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android