php中hash比较缺陷
文章目录
哈希算法(Hash Algorithm)又称散列算法、散列函数、哈希函数,哈希算法主要有
MD4
、MD5
、SHA
php中处理hash时的缺陷
我们比较 hash字符串的时候,常常用到 等于( ==
)、不等于( !=
)来进行比较
一个hash的值如果是以0e
开头,并且后面全是数字的话,在php中这种特殊的hash(也就是所谓的Magic Hash
),会被解析为科学计数法0 x 10^n
,即和0相等
所以如果两个不同的密码经过哈希以后,其哈希值都是以0e
开头的,那么php将会认为他们相同,都是0
此外,0 ==
字符会被认为是正确的,可以绕过验证
强弱类型比较
==
弱类型比较中,字符'0e123'
和字符'0e456'
虽然是字符类型,但是因为==
比较不比较数据类型,只比较值,结果都是0,所以相等,返回true===
强类型比较中,字符'0e123'
和字符'0e456'
在比较数据类型的时候就被当作字符类型,而字符'0e123'
和字符'0e456'
当然不相等,所以返回false
这种缺陷在PHP程序中使用哈希算法加密(如md5
、md4
、SHA1
等)进行有关强弱类型比较的地方很容易被用来进行绕过,在CTF题目中算是比较常见的
Magic Hashes
-
hash以0e开头
Plaintext MD5 Hash 240610708 0e462097431906509019562988736854 QLTHNDT 0e405967825401955372549139051580 QNKCDZO 0e830400451993494058024219903391 PJNPDWY 0e291529052894702774557631701704 NWWKITQ 0e763082070976038347657360817689 NOOPCJF 0e818888003657176127862245791911 MMHUWUV 0e701732711630150438129209816536 MAUXXQC 0e478478466848439040434801845361 IHKFRNS 0e256160682445802696926137988570 GZECLQZ 0e537612333747236407713628225676 GGHMVOE 0e362766013028313274586933780773 GEGHBXL 0e248776895502908863709684713578 EEIZDOI 0e782601363539291779881938479162 DYAXWCA 0e424759758842488633464374063001 DQWRASX 0e742373665639232907775599582643 BRTKUJZ 00e57640477961333848717747276704 ABJIHVY 0e755264355178451322893275696586 aaaXXAYW 0e540853622400160407