php-MD5()函数漏洞

一、数字与字符串之间的比较

var_dump( 0 == "a" ); true
var_dump( "0" == "a" );false

php把字母开头的字符串转化为整型时,转化为0, 前面数字后面字母的话就只取到第一个字母出现的位置之前的数字。
二、MD5函数漏洞

$_GET['name'] != $_GET['password']
MD5($_GET['name']) == MD5($_GET['password'])

要求满足上述条件则
那么要求name和password数值不同但是MD5相同,在这里可以利用绕过。
PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,那么PHP将会认为他们相同,都是0。
GET传入a=QNKCDZO&b=240610708就能绕过了
(MD5加密后和sha1加密后0E开头的字符串百度有很多)
三、弱口令

if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
        die("success!");
    }

在php中=为完全等于运算,不仅比较值,而且还比较值的类型,只有两者一致才为真。再次使用a=QNKCDZO&b=240610708就不行了,因为a和b类型不同
而在PHP中
md5([1,2,3]) == md5([4,5,6]) == NULL
[1] !
[2] && md5([1]) === md5([2])
所以GET传入a[]=1&b[]=2就能够绕过了
四、MD5碰撞

if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
        die("success!);
}

要求构造param1和param2不同,但是MD5相同,也就是说要求传入两个MD5相同的不同字符串。

Param1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
Param2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

MD5值相同使用谷歌可以搜到相当多被巧妙构造出的二进制文件,其MD5相同,注意一点,post时一定要urlencode!!!
使用fastcoll_v1.0.0.5工具可以生成两个具有相同MD5的文件,但是文件却是不同的。
参考链接:
https://blog.csdn.net/wy_97/article/details/79088218
https://blog.csdn.net/qq_19980431/article/details/83018232

发布了2 篇原创文章 · 获赞 2 · 访问量 177

猜你喜欢

转载自blog.csdn.net/qq_42250840/article/details/104526488