前言

前几天第二届强网杯看到这样子的一道题目

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

两次的比较均用了严格的比较,无法通过弱类型的比较去绕过(弱类型的总结可以看这里 织梦前台任意用户密码修改漏洞分析 ),

那么我们有没有可能在短时间内构造两个不一样的字符串,但是MD5是一样的呢。

答案是肯定的。 埃因霍温理工大学(Technische Universiteit Eindhoven)的Marc Stevens

使用的是“构造前缀碰撞法”(chosen-prefix collisions)来进行哈希碰撞。

理论依据依旧是王小云所使用的攻击方法。不过有所改进 。他们碰撞出来两个程序文件的MD5一致,

却又都能正常运行,并且可以做完全不同的事情。

GoodbyeWorld-colliding.exe

HelloWorld-colliding.exe

随后他们编写的快速MD5 碰撞生成器

fastcoll_v1.0.0.5.exe.zip
源代码

有了这个神器后,我们就可以来构建两个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的攻击 还有

源链接

Hacking more

...