BUUCTF在線評測BUUCTF 是一個 CTF 競賽和訓練平臺,為各位 CTF 選手提供真實賽題在線復現等服務。https://buuoj.cn/challenges#[MRCTF2020]Ez_bypass啟動靶機
有提示F12,那查看一下源碼。和頁面顯示的代碼一樣的,就是格式更規范而已
include 'flag.php';
$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if(isset($_GET['gg'])&&isset($_GET['id'])) {$id=$_GET['id'];$gg=$_GET['gg'];if (md5($id) === md5($gg) && $id !== $gg) {echo 'You got the first step';if(isset($_POST['passwd'])) {$passwd=$_POST['passwd'];if (!is_numeric($passwd)){if($passwd==1234567){echo 'Good Job!';highlight_file('flag.php');die('By Retr_0');}else { echo "can you think twice??"; }}else{ echo 'You can not get it !';}}else{ die('only one way to get the flag');}
}else { echo "You are not a real hacker!"; }
}else{ die('Please input first');}
} You are not a real hacker!
代碼講述了get方法傳遞兩個參數 gg 和 id ,使得它們的MD5值 強相等(===),但它們本身值并不相同。
而且使用post方法傳遞了一個 passwd 參數,并且需要確保這個參數值不是純數字,還得使得參數值與 1234567 弱相等(==)
那么我們首先構造url傳參 :?gg[]=s878926199a&id[]=s155964671a
解釋一下:為什么這里我們參數傳遞的是數組,而不是直接傳遞字符串?
?
由于代碼要求兩個參數值的MD5值要 強相等(===)
? ? ? ? 如果我們傳遞的是?gg=s878926199a&id=s155964671a
? ? ? ? 那么這兩個值的MD5分別是
????????????????0e545993274517709034328855841020
????????????????0e342768416822451524974117254469
????????在進行比較時,這兩個值是不相等的,就會返回 false
??????? 然鵝當傳遞的值是數組時,進行MD5運算,兩個都會返回Null???
??????? null===null? 返回 true
?
如果,代碼中MD5值的比較使用的是 弱相等(==)
那么就可以直接傳遞字符串
??????? 原因是在弱比較時,php會將 0e 開頭的字符串解釋為科學計數法的 0。
????????并且如果 0e 后續全是數字的話,php會認為它們是相等的
再使用post方法傳遞 ? ? passwd=1234567\????
1234567\?
1234567a
1234567+
1234567-?
1234567* ?
都可以(不要使用 . 會被看成是小數點)
這樣寫 是因為使用的是弱相等?
當php看到一個字符串與一個數字進行弱比較時,它會將這個字符串看成一個數字,當讀取到非數字的部分它就會停止,所以這些非數字字符得放在1234567的后面
獲得flag{5ab68b16-b084-4f10-8530-06f5726d5f53}
?