備份是個好習慣
http://123.206.87.240:8002/web16/
通過提示 關鍵詞 ’備份‘ 可以聯想到 → 備份文件
備份文件一般都是.bak結尾的
用工具掃一下
這里推薦大佬的工具 yihangwang/SourceLeakHacker
可以看到index.php.bak
訪問一下試試
有一個bak備份文件 ,不多解釋了,下載后打開
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: Norse 5 * Date: 2017/8/6 6 * Time: 20:22 7 */ 8 9 include_once "flag.php"; 10 ini_set("display_errors", 0); //in_set 設置指定配置選項的值 11 $str = strstr($_SERVER['REQUEST_URI'], '?'); //strstr 截取字符串 12 $str = substr($str,1); // 返回字符串的一部分 1為字符串總數的返回開始位 13 $str = str_replace('key','',$str); //在$str 中替換 key 為 '' 14 parse_str($str); //把字符串解析到變量里 這里可以這么理解字符串為key1=1,key2=2 → $key=1;$key2=2 15 echo md5($key1); 16 17 echo md5($key2); 18 if(md5($key1) == md5($key2) && $key1 !== $key2){ 19 echo $flag."取得flag"; 20 } 21 ?>
11行 strstr 獲得URI從'?'往后(包括'?')的字符串 stristr 同strstr用法一樣,不區分大小寫
12行 substr 去掉'?'
13行 str_replace 把字符串中的'key'替換為空可以使用類似這樣的語句:kkeyey 處理
14行 parse_str 把字符串解析到變量中
end 最后需要得到key1,key2不相等而二者md5相等,可以利用php弱類型比較繞過
php弱類
這里稍微提一下php弱類
首先,我們一般說php變量類型8種
標量類型:布爾boolean,整形integer,浮點float,字符string
復雜類型:數組array,對象object
特殊類型:資源resource,空null
與別的語言不同,php是一個弱類型的語言
==表示的是等於 ,只要數值等於就可以了,類型無所謂的
就是說上面列舉的那些類型 之間相互比較 只看值就行了 不用看類型
php弱類型語言總的類型判斷
php一個數字和一個字符串進行比較或者進行運算時,PHP會把字符串轉換成數字再進行比較。
PHP轉換的規則的是:若字符串以數字開頭,則取開頭數字作為轉換結果,若無則輸出0。
那么回過頭來看題目(-_-)
這一題需要構造的是 $key1 == $key2
構造的要求是md5值相同,但未計算md5的值不同的繞過。
那我們就來構造 O(∩_∩)O
介紹一批md5開頭是0e的字符串,
0e在比較的時候會將其視作為科學計數法,所以無論0e后面是什么,
0的多少次方還是0。md5('240610708') == md5('QNKCDZO')成功繞過!
QNKCDZO 0e830400451993494058024219903391 s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s1885207154a 0e509367213418206700842008763514
構造payload:?kkeyey1=QNKCDZO&kkeyey2=240610708
參考 :