千家信息网

Ezpop pop序列化链反序列化实例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍了Ezpop pop序列化链反序列化实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Ezpop pop序列化链反序列化实例分析文章都会有所收获,下面
千家信息网最后更新 2026年11月02日Ezpop pop序列化链反序列化实例分析

这篇文章主要介绍了Ezpop pop序列化链反序列化实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Ezpop pop序列化链反序列化实例分析文章都会有所收获,下面我们一起来看看吧。

append($this->var);    }}class Show{    public $source;    public $str;    public function __construct($file='index.php'){        $this->source = $file;        echo 'Welcome to '.$this->source."
"; } 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这个函数。

最终我们的构造是

这里有点烦的就是由protect属性,要加*,这里我学了一个小技巧,我们可以给他进一步url编码,可以无视那些不可见字符,urlencode()

将编码后的传入pop参数

关于"Ezpop pop序列化链反序列化实例分析"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Ezpop pop序列化链反序列化实例分析"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

函数 序列 属性 方法 实例 对象 实例分析 分析 字符 字符串 时调 正则 知识 表达式 内容 参数 篇文章 编码 学习 肯定 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 有格互联网科技 百单网互联网科技有限公司 深圳九邦互联网科技有限公司 金融科技与互联网金融 互联网科技金融公司 易通互联网络科技有限公司 深圳天众互联网科技公司 互联网 视角下的科技创新 美国互联网前沿科技 甘肃拓世互联网科技有限公司 哈尔滨新华互联网科技学院 小米互联网科技园设置 茂名市互联网科技产业园 昊天互联网科技有限公司 宝灵互联网科技有限公司 杭州披云加互联网科技有限公司 山东大美朱楼互联网科技有限公司 互联网科技大佬云集 互联网高科技绘画 小牛互联网科技有限公司地址 互联网络科技 河南云网互联网络科技有限公司 科技企业和互联网企业 互联网科技革命 互联网科技股有哪些 上海宁丞科技互联网 厦门千工互联网科技有限公司 佛山市拉法互联网科技有限公司 黑科技 体验场景 互联网大会 云鲸互联网络科技有限公司
0