PHP Weak type about MD5

主要就是对一些在PHP中MD5值判断的漏洞的积累吧(每次都要查payload很麻烦的

为了方便, 文章中的所有变量都不带$

1. a != b and md5(a) == md5(b)

用==来判断两个变量(这样写肯定会被学长骂的!!!, 怎么绕过呢?
先给出两个字符串吧QNKCDZO240610708 而这两个字符串的MD5值为

1
2
0e830400451993494058024219903391
0e462097431906509019562988736854

PHP在处理哈希字符串时, 它把每一个以“0E”开头的哈希值都解释为0, 具体的原因呢是因为0e开头会被认为是科学计数法, e后面的数会被认为是次幂, 而不管0乘10的几次幂都是0. 所以如果两个不同的密码经过哈希以后, 其哈希值都是以“0E”开头的, 那么PHP将会认为他们相同, 都是0.

2. a !== b and md5(a) === md5(b)

要通过这个判断, 要利用MD5不能处理数组这个漏洞, 就是说当a和b都是数组的时候, md5(a) === md5(b) 会判断为真. 至于怎么让a !== b, a[]=1;b[]=2就行了.

3. (string)a !== (string)b and md5(a) === md5(b)

啊这…这个可以直接去找两个相等md5的字符串.

1
2
3
$Param1="\x4d\xc9\x68\xff\x0e\xe3\x5c\x20\x95\x72\xd4\x77\x7b\x72\x15\x87\xd3\x6f\xa7\xb2\x1b\xdc\x56\xb7\x4a\x3d\xc0\x78\x3e\x7b\x95\x18\xaf\xbf\xa2\x00\xa8\x28\x4b\xf3\x6e\x8e\x4b\x55\xb3\x5f\x42\x75\x93\xd8\x49\x67\x6d\xa0\xd1\x55\x5d\x83\x60\xfb\x5f\x07\xfe\xa2";
$Param2="\x4d\xc9\x68\xff\x0e\xe3\x5c\x20\x95\x72\xd4\x77\x7b\x72\x15\x87\xd3\x6f\xa7\xb2\x1b\xdc\x56\xb7\x4a\x3d\xc0\x78\x3e\x7b\x95\x18\xaf\xbf\xa2\x02\xa8\x28\x4b\xf3\x6e\x8e\x4b\x55\xb3\x5f\x42\x75\x93\xd8\x49\x67\x6d\xa0\xd1\xd5\x5d\x83\x60\xfb\x5f\x07\xfe\xa2";
#008ee33a9d58b51cfeb425b0959121c9

使用的时候记得直接添加到包里面去, 浏览器上输入是无效的