1. 程式人生 > >bugku——備份是個好習慣

bugku——備份是個好習慣

  這道題擱置了快一個月了……今天終於把它給做了,心情還是很舒暢的>-<

  首先開啟題目,只有一串字串,百度了一下發現是個md5加密,關鍵……原字串還是個空字串……(懵逼……)開啟網頁原始碼也一樣,沒有任何提示,這時候,我們可以想到提示肯定是在題目裡!備份是個好習慣~咦,是不是有一個備份檔案呢?在題目的url裡輸入:http://120.24.86.145:8002/web16/index.php.bak,即可下載備份檔案;

  **小知識:**備份檔案的副檔名一般為*.swp,*.bak

  有點靈性做題2333,其實還有另外的兩種比較靠譜的方法:①用御劍掃描;②用原始碼洩露工具(具體不再詳述,之後可能會補上)

  接下來,我們用notepad++開啟這個備份檔案,可以看到裡面的程式碼:

<?php>
/**
 * Created by PhpStorm.
 * User: Norse
 * Date: 2017/8/6
 * Time: 20:22
*/

include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);/*把查詢字串解析到變數中*/
echo md5($key1);

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
    echo $flag."取得flag";
}
<php>

  閱讀程式碼,這裡有幾個函式:

  strstr(string,search,before_search):找到search字串在string中第一次出現的位置,並把後面的字串輸出;before_search如果為true,則返回位置之前的字串;預設為false;

  substr(string,start,length):看引數很容易理解,返回字串的一部分;

  str_replace(find,replace,string,count):在字串sting中找到字串find,並把它替換成replace;

  parse_str(string,array):把查詢字串解析到變數中;

  然後我們可以知道這段程式碼的意思:程式碼從?後開始擷取到str中,也就是變數後開始擷取字串;然後從位置1開始截到字串結束;之後把字串中的kay欄位全用‘ ’替代,這個我們可以通過構造"kekeyy"來繞過;最後把key1和key2解析成變數;

  敲重點程式碼要求我們構造出key1和key2的md5值相等,而它們本身卻不相等,這時候用到一個小知識點:md5無法對陣列進行構造,構造的結果都為NULL,這樣我們只要讓key1和key2是兩個陣列就好



  構造url:http://120.24.86.145:8002/web16/?kekeyy1[]=1&kekeyy2[]=2

  出現flag。