前几天第二届强网杯看到这样子的一道题目
if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
die("success!");
}
两次的比较均用了严格的比较,无法通过弱类型的比较去绕过(弱类型的总结可以看这里 织梦前台任意用户密码修改漏洞分析 ),
那么我们有没有可能在短时间内构造两个不一样的字符串,但是MD5是一样的呢。
答案是肯定的。 埃因霍温理工大学(Technische Universiteit Eindhoven)的Marc Stevens
使用的是“构造前缀碰撞法”(chosen-prefix collisions)来进行哈希碰撞。
理论依据依旧是王小云所使用的攻击方法。不过有所改进 。他们碰撞出来两个程序文件的MD5一致,
却又都能正常运行,并且可以做完全不同的事情。
随后他们编写的快速MD5 碰撞生成器
有了这个神器后,我们就可以来构建两个MD5一样,但是内容完全不一样的字符串了。
创建一个文本文件。写入1 。命名为init.txt
运行fastcoll 输入以下参数。 -p 是源文件 -o 是输出文件
fastcoll_v1.0.0.5.exe -p init.txt -o 1.txt 2.txt
运行,几秒钟以后 我们的文件就生成好了
<?php
function readmyfile($path){
$fh = fopen($path, "rb");
$data = fread($fh, filesize($path));
fclose($fh);
return $data;
}
echo '二进制hash '. md5( (readmyfile("1.txt")));
echo "<br><br>\r\n";
echo 'URLENCODE '. urlencode(readmyfile("1.txt"));
echo "<br><br>\r\n";
echo 'URLENCODE hash '.md5(urlencode (readmyfile("1.txt")));
echo "<br><br>\r\n";
echo '二进制hash '.md5( (readmyfile("2.txt")));
echo "<br><br>\r\n";
echo 'URLENCODE '. urlencode(readmyfile("2.txt"));
echo "<br><br>\r\n";
echo 'URLENCODE hash '.md5( urlencode(readmyfile("2.txt")));
echo "<br><br>\r\n";
可以看到,二进制的hash一样。 但是实际内容不一样。
最后 加上
if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
die("success!");
}
可以看到成功输出 success
提交 ,成功通过
MD5的攻击 还有