[BJDCTF2020]Easy MD5

一只本本發表於2024-11-20

開啟輸入字元後提交沒有回顯,檢視header發現有hint。重點是md5函式,用法: md5(*string*, *raw*=FALSE),當只接受一個引數時會返回字串的md5值,當把第二個引數的值設定為TRUE,會返回生成md5值的二進位制格式,即根據ascii碼值轉碼。
根據這個特性,就存在一個漏洞,如果password=md5($pass,true)湊巧構成了一個永真條件,是不是就可以繞過密碼了?對吧。
有這樣一個字串:ffifdyop,他md5(ffifdyop,true)='or'6�]��!r,��b
可以觀察到出現了or 6,6為非零數在php在代表true

輸入ffifdyop,點選提交查詢,進入下一個頁面

什麼都沒有,直接檢視網頁原始碼,最上面有一行被註釋的程式碼,顯然是提示

這裡要求a,b引數不相等,但md5值要相等。我們知道php==比較是弱型別比較,另外還有一個漏洞為如果傳入的不是字串類似會報錯從而返回0,可以傳入兩個陣列。這裡php版本為7.3.13,嘗試了這個漏洞行不通。
弱型別比較繞過中的hash比較,當兩個字串都為科學計數法的形式時,返回為true
這裡用QNKCDZO和s878926199a,payload為a=QNKCDZO&b=s878926199a

注意這裡md5比較是強型別比較,這裡就得換payload了。要求引數不相等,但md5碼要相等。我們就利用md5無法處理陣列,然後都返回null,null=null(php中null和FALSE的值相等)然後就繞過了這個。

輸入payload:param1[]=1&param2[]=a即可得到flag,注意這裡為POST型別