MD5碰撞
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
[Sign]做不出ctf题的时候很痛苦,你只能眼睁睁看着其他人领先你