根据这篇文章[1],
因为处理hash字符串时,PHP会将每一个以 0E开头的哈希值解释为0,那么只要传入的不同字符串经过哈希以后是以 0E开头的,那么PHP会认为它们相同
基本的原理是这样的,但更严谨的字符串格式是,0e
开头,同时后面都是数字,不能包含其他字符的字符串,md5 值才会相等。
<?php $a = "s878926199a"; $b = "s155964671a"; print_r($a . "-->" . md5($a) . "<br>"); print_r($b . "-->" . md5($b) . "<br>"); // s878926199a-->0e545993274517709034328855841020 // s155964671a-->0e342768416822451524974117254469 print_r(var_dump(md5($a) == md5($b)) . "<br>"); // bool(true) // 数字 vs 数字 $a1 = "0e33"; $b1 = "0e89"; print_r(var_dump($a1 == $b1) . "<br>"); // bool(true) // 数字 vs 字母 $a3 = "0eadd"; $b3 = "0e232"; print_r(var_dump($a3 == $b3) . "<br>"); // bool(false) // 数字 vs 数字/字母 $a4 = "0ea34343dd"; $b4 = "0e232"; print_r(var_dump($a4 == $b4) . "<br>"); // bool(false)
常见的 md5 值是 0e
开头且后面均为数字的字符串
s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s1885207154a 0e509367213418206700842008763514 s1502113478a 0e861580163291561247404381396064 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s155964671a 0e342768416822451524974117254469 s1184209335a 0e072485820392773389523109082030 s1665632922a 0e731198061491163073197128363787 s1502113478a 0e861580163291561247404381396064 s1836677006a 0e481036490867661113260034900752 s1091221200a 0e940624217856561557816327384675 s155964671a 0e342768416822451524974117254469 s1502113478a 0e861580163291561247404381396064 s155964671a 0e342768416822451524974117254469 s1665632922a 0e731198061491163073197128363787 s155964671a 0e342768416822451524974117254469 s1091221200a 0e940624217856561557816327384675 s1836677006a 0e481036490867661113260034900752 s1885207154a 0e509367213418206700842008763514 s532378020a 0e220463095855511507588041205815 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s214587387a 0e848240448830537924465865611904 s1502113478a 0e861580163291561247404381396064 s1091221200a 0e940624217856561557816327384675 s1665632922a 0e731198061491163073197128363787 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s1665632922a 0e731198061491163073197128363787 s878926199a 0e545993274517709034328855841020 240610708 0e462097431906509019562988736854 314282422 0e990995504821699494520356953734 571579406 0e972379832854295224118025748221 903251147 0e174510503823932942361353209384 1110242161 0e435874558488625891324861198103 1320830526 0e912095958985483346995414060832 1586264293 0e622743671155995737639662718498 2302756269 0e250566888497473798724426794462 2427435592 0e067696952328669732475498472343 2653531602 0e877487522341544758028810610885 3293867441 0e471001201303602543921144570260 3295421201 0e703870333002232681239618856220 3465814713 0e258631645650999664521705537122 3524854780 0e507419062489887827087815735195 3908336290 0e807624498959190415881248245271 4011627063 0e485805687034439905938362701775 4775635065 0e998212089946640967599450361168 4790555361 0e643442214660994430134492464512 5432453531 0e512318699085881630861890526097 5579679820 0e877622011730221803461740184915 5585393579 0e664357355382305805992765337023 6376552501 0e165886706997482187870215578015 7124129977 0e500007361044747804682122060876 7197546197 0e915188576072469101457315675502 7656486157 0e451569119711843337267091732412 QLTHNDT 0e405967825401955372549139051580 QNKCDZO 0e830400451993494058024219903391 EEIZDOI 0e782601363539291779881938479162 TUFEPMC 0e839407194569345277863905212547 UTIPEZQ 0e382098788231234954670291303879 UYXFLOI 0e552539585246568817348686838809 IHKFRNS 0e256160682445802696926137988570 PJNPDWY 0e291529052894702774557631701704 ABJIHVY 0e755264355178451322893275696586 DQWRASX 0e742373665639232907775599582643 DYAXWCA 0e424759758842488633464374063001 GEGHBXL 0e248776895502908863709684713578 GGHMVOE 0e362766013028313274586933780773 GZECLQZ 0e537612333747236407713628225676 NWWKITQ 0e763082070976038347657360817689 NOOPCJF 0e818888003657176127862245791911 MAUXXQC 0e478478466848439040434801845361 MMHUWUV 0e701732711630150438129209816536
当两个 md5 进行比较时,若参数是不同的数组,那么 ==
和 ===
比较的结果均为 True
// param.php?a=[1]&b=[2]
利用 fastcoll 进行 md5 碰撞,生成两个字面值不同但 md5 相同的字符串。
新建一个空的 txt 文档。
然后拖到 exe 上,自动生成两个文件。
得到两个文件,通过代码读取即可。
<?php $a = file_get_contents('D:tmp\a_msg1.txt'); $b = file_get_contents('D:tmp\a_msg2.txt'); print_r($a . "<br>"); print_r($b . "<br>"); print_r(var_dump($a === $b) . "<br>"); // bool(false) print_r(var_dump(md5($a) === md5($b)) . "<br>"); // bool(true)
md5 碰撞面对一些绕过非常有用,例如通过参数上传一句话木马[2]。
https://zhuanlan.zhihu.com/p/123235283 ↩︎
https://www.cnblogs.com/Riv3r1and/p/13795704.html ↩︎