PHP在處理哈希字符串時,
會利用”!=”或”==”來對哈希值進行比較,它把每一個以”0E”開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以后,其哈希值都是以”0E”開頭的,那么PHP將會認為他們相同,都是0。
"==="和"!=="即strict比較符,只有在類型相同時才相等。"=="和"!="即non-strict比較符,會在類型轉換后進行比較。
此外0 == 字符會被認為是正確的,可以繞過驗證
例子1:bugku的碰撞題目
md5 collision(NUPT_CTF)
輸入一個a,但我們不知道其確切的值,就用md5碰撞來繞過:
字母數字混合類(MD5值):
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
大寫字母類:
QLTHNDT
0e405967825401955372549139051580
QNKCDZO
0e830400451993494058024219903391
EEIZDOI
0e782601363539291779881938479162
純數字類:
240610708
0e462097431906509019562988736854
繞過以后返回flag值
例子2:
題目的php代碼,需要傳兩個參數v1和v2,v1必須為字母,v2必須為數字,如果兩者的MD5值相同,打印flag
用到上面提到的MD5碰撞數,就能返回flag