開啟題目鏈結,沒有發現什麼線索,想到題目名稱「備份」,考慮到一般備份的字尾為.bak,於是訪問
訪問後獲得網頁原始碼:
<?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)
?>
接下來是閱讀php**,我們需要了解幾個其中的函式來讓我們更好的理解題目
strstr(string,search,before_search):
查詢 "search" 在 "string" 中的第一次出現,並返回字串的剩餘部分:
before_search為可選,預設值為 "false" 的布林值,如果設定為 "true",它將返回 search 引數第一次出現之前的字串部分
substr(string,start,length):
返回字串的一部分
start 規定在字串的何處開始返回
length 可選。規定被返回字串的長度,預設是直到字串的結尾
str_replace(find,replace,string,count):
以其他字元替換字串中的一些字元
find 規定要查詢的值
replace 規定替換 find 中的值的值
string 規定被搜尋的字串
count 可選,對替換數進行計數的變數
parse_str(string,array):
把查詢字串解析到變數中
string 規定要解析的字串
array 可選,規定儲存變數的陣列的名稱。該引數指示變數將被儲存到陣列中
**的含義是需要我們給key1和key2賦值,並使key1與key2值不相等,且其md5值相等,既key1和key2為md5碰撞。
唯一的問題是$str = str_replace('key','',$str);
,不過也可以通過輸入』kekeyy』簡單繞過
因此只需要構造url為:
其中a,b為乙個md5碰撞
不過在php中如果md5值是0e開頭的,php會做隱式轉換,當做int型別計算,得到的結果是 0,最後導致0==0,判定為true,因此只需要給key1和key2賦兩個md5值為0e開頭的字串即可
下面提供一些md5開頭為0e的字串
qnkcdzo
s878926199a
s155964671a
s214587387a
s214587387a
取其中兩個構造url即可
除此之外此題還有乙個解法,用下面url也可獲得flag
可能原因是』!=='是強型別比價,而key1被賦值為空字串,而key2未被賦值為null,導致其md5值相同而在比較時由於型別不同而得到結果為true,滿足了判斷條件。 Bugku web 備份是個好習慣
點開後原始碼 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...
Bugku web 備份是個好習慣wireUp
備份是個好習慣 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 subst...
新bugku web16 備份是個好習慣
1.備份是關鍵字,我們可以用御劍掃掃 得到 開啟之後由於題設備份檔案,故加上.bak swp錯誤 之後得到乙個檔案,開啟之後發現 科學計數法是 e 要使兩個數的值相等,以0e開頭的md5值可以繞過限制。構造payload kkeyey1 qnkcdzo kkeyey2 240610708 法二 漏洞...