記一次MD5驗證繞過

格式:flag:{xxx}

解題鏈接: ctf5.shiyanbar.com/web/

via:shiyanbar.com/ctf/2036

本文將藉助實驗吧中的一道web題來簡單的說明如果在特定條件下繞過MD5加密的密碼驗證。

首先,打開題目鏈接,進入一個登錄頁面:

載入超時,點擊重試

隨便輸入幾個萬能密碼進行測試,不成功。然後想到了查看網頁源代碼,看看有沒有存在源碼泄漏的情況:

注釋可以說暴露了一切,稍後簡單分析下。

$password=$_POST[password];
$sql = "SELECT * FROM admin WHERE username = admin and password = ".md5($password,true)."";
$result=mysqli_query($link,$sql);
if(mysqli_num_rows($result)>0){
echo flag is :.$flag;
}
else{
echo 密碼錯誤!;
}

密碼以post方法接收,算是常規操作。而查詢密碼的SQL語句卻有漏洞可以利用。在SQL語句的後半部分,即password後面調用了一個MD5函數,以便與資料庫中加密的密碼進行對照。一般的MD5值是被認為極難破解的,但是該出的MD5函數第二個參數為true,這裡便有文章可做了。

MD5函數第二個參數默認值為false,表示會產生一個32位的常規MD5值。而true,則是原生的16字元的二進位格式,這意味著,這裡有可能人為輸入一個字元串,經加密後的值以二進位格式生成,又被當字元串處理,很可能新的字元串中含有可以構造SQL萬能密碼的or的部分。

正好網上有兩個這樣的字元串,一個是和解題鏈接的文件名一樣的字元串:ffifdyop,另一個是:129581926211651571912466741651878684928。將任意一個輸入進去,即可繞過驗證。(很明顯,這裡更傾向於讓你用ffifdyop)

(這道題感覺好神奇啊,黑客真是無孔不入,這都可以)

一些說明

  1. 關於PHP的MD5函數的一些具體內容,可以參考這裡:w3school.com.cn/php/fun
  2. 文中兩個字元串構造出的字元串是什麼樣的:

content: 129581926211651571912466741651878684928
hex: 06da5430449f8f6f23dfc1276f722738
raw: x06xdaT0Dx9fx8fo#xdfxc1or8
string: T0Do#or8
content: ffifdyop
hex: 276f722736c95d99e921722cf9ed621c
raw: or6xc9]x99xe9!r,xf9xedbx1c
string: or6]!r,b

2中的內容摘自:lovews.xin/index.php/20 3. 關於MD5的一些介紹,可以參考這裡:baike.baidu.com/item/MD

小感慨

漏洞的產生可能來自方方面面,比如此處,因為參數傳遞的問題便導致了SQL注入漏洞的產生,導致看似無法破解的MD5值也淪陷了。可以說,任何疏忽都能給整個系統帶來短板,拉低整個系統的安全性。我覺得每個站長在建站時都要多考慮下安全問題,儘可能降低安全隱患。

推薦閱讀:

查看原文 >>
相關文章