md5弱类型的比较算是ctf中比较老的一个考点了,但是现在很多ctf中还是在出现,那么就借强网杯这道题来总结一下吧,也方便自己和他人在需要的时候查看。

The First Easy Md5 Challenge
查看源代码:

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

“==”不严格比较,只比较值,不比较类型
直接用md5()函数处理0e字符的缺陷来绕过
payload:

1
param1=QNKCDZO&param2=s878926199a


The Second Easy Md5 Challenge
查看源代码:

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

“===”严格比较,既比较值,也比较类型。
通过md5()不能正确处理数组元素来绕过

1
2
3
4
5
6
7
8
9
<?php
$a[]=123;
$b = md5($a);
echo $b;
$b[]=456;
if (md5($a)===md5($b))
{
echo "hello man";
}

运行结果:

虽然有三个警告,但是还是输出了hello man

值得一提的是,在sha1()函数中,也同样存在这种问题:

1
2
3
4
5
6
7
8
9
<?php
$a[]=123;
$b = sha1($a);
echo $b;
$b[]=456;
if (sha1($a)===sha1($b))
{
echo "hello man";
}

运行结果:

payload:

1
param1[]=123&param2[]=456


Md5 Revenge Now!
依旧是查看源代码:

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

严格比较,但是在第一个比较中进行了string类型的强制转换,因此这里不能用传入数组了,因为数组类型进行string类型强制转化之后为字符串”Array”,不等的条件就不成立了。
这时想起了一个事例,在进行某个网站登陆的时候,一个人不小心输入了错误的密码,却成功的登陆了,原因就是输入的错误的密码的md5值和正确的密码的md5值相同,因此在进行md5加密过后的判断相等。
所以这里我们也要使用md5碰撞找到两个不同的字符串,加密后的md5值相同。
这里要用到一个工具:fastcoll
通过该工具,可以得到两个md5值相同的文件
该工具的食用方法如下:
1.切换到该工具的目录,然后创建一个文件abc.bin
2.按住shift然后右击鼠标打开dos命令窗口
3.执行如下命令:

然后该目录下会生成两个文件:

然后我们可以用winhex来打开这两个文件:

然后右击内容,选择:
edit->copyAll->GREPhex
然后可以得到:
abc_msg1.bin

1
\xF6\xF2\xD9\x58\x80\x00\xCA\x9F\xF6\x66\xD4\x88\xD2\x34\x2C\x4F\x21\x51\xAE\xF1\x44\x63\x6F\x49\x2C\x72\x3A\xD2\x2B\xB0\xB3\x11\x40\x23\xED\xEA\x52\x23\x1C\x71\x6B\x26\xC5\x1B\xE6\x35\xA2\x79\x01\x4A\x01\xB3\x89\x4B\x96\xC3\xCF\x5B\xB6\x64\xFC\xA7\xE1\x7B\x7B\x9B\x84\x77\x12\x56\xFC\xF6\x6E\xE6\xD7\xDD\x46\x27\x40\x4C\xC7\x14\x17\x11\x0F\x1C\x25\x8F\x6E\x89\x8F\x5F\x4B\x5D\xAF\x41\xAD\x54\xB1\x8E\x04\x85\x72\xB6\x1D\x92\xEF\xD8\x5A\xC2\x5D\x3F\x7F\xD3\x57\x97\x3C\x1C\xC5\x1D\x12\x39\xD0\xF8\xB8\xC1\x01\x1D

abc_msg2.bin

1
\xF6\xF2\xD9\x58\x80\x00\xCA\x9F\xF6\x66\xD4\x88\xD2\x34\x2C\x4F\x21\x51\xAE\x71\x44\x63\x6F\x49\x2C\x72\x3A\xD2\x2B\xB0\xB3\x11\x40\x23\xED\xEA\x52\x23\x1C\x71\x6B\x26\xC5\x1B\xE6\xB5\xA2\x79\x01\x4A\x01\xB3\x89\x4B\x96\xC3\xCF\x5B\xB6\xE4\xFC\xA7\xE1\x7B\x7B\x9B\x84\x77\x12\x56\xFC\xF6\x6E\xE6\xD7\xDD\x46\x27\x40\x4C\xC7\x14\x17\x91\x0F\x1C\x25\x8F\x6E\x89\x8F\x5F\x4B\x5D\xAF\x41\xAD\x54\xB1\x8E\x04\x85\x72\xB6\x1D\x92\xEF\xD8\x5A\x42\x5D\x3F\x7F\xD3\x57\x97\x3C\x1C\xC5\x1D\x12\x39\xD0\x78\xB8\xC1\x01\x1D

然后上面这两个通过md5加密后的md5值是相等的。

最后更新: 2018年03月29日 22:29

原始链接: http://drac0nids.top/2018/03/24/md5三连/

× 请我吃糖~
打赏二维码