官方公众号企业安全新浪微博
FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。
FreeBuf+小程序
在CTF中经常碰见md5相关题目,有的是单独一道,更多的是作为其他题目的一个点。这里整理一下md5相关知识,并给出涉及相关点的题目。
我见到的有以下类型,请师傅们多加补充
1、 md5爆破
2、md5弱比较
3、md5强比较
4、md5强碰撞
5、加密后弱相等
6、解密后的md5字符串有特殊字符
若有遗漏的,欢迎师傅们补充。
md5爆破
substr(md5(captcha), -6, 6) == "5bcba3"
给出md5加密后的几位,可以进行爆破
<?php
for($i=0;$i<10000;$i++){
if(substr(md5($i),-6,6)=="5bcba3"){
echo $i;
break;
}
}
?>
功防世界-SSRF Me
这是涉及到该知识点的题目
md5弱比较
md5弱比较形式:if($a != $b && md5($a) == md5($b))
这里有两种方法
0e绕过
数组绕过
0e绕过:是md5加密后是0exxxxx的形式,在==弱比较时,会被当做科学技术法,众所周知,0的任何次方都是0,自然判断为true
大佬整理的md5加密后0e开头
数组绕过:a[]=a&b[]=b,传入参数为数组则MD5返回NULL,null=null,判断为true,成功绕过
md5强比较
md5强比较形式:if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2']))
0e绕过不能用了,因为强比较时,0exxx不再被当做科学计数法,而是被当做字符串。
数组绕过仍然可以。
md5强碰撞
md5强碰撞形式:if((string)$_POST['a']!==(string)$_POST['b'] && md5($_POST['a'])===md5($_POST['b']))
强碰撞用string强行转换成字符串,从而限制了数组绕过这方法,只能输入字符串。
将a.txt拖到fastcoll_v1.0.0.5.exe上,然后读a_msg1.txt和a_msg2.txt
<?php
$a = file_get_contents("D:\a_msg1.txt");
$b = file_get_contents("D:\a_msg2.txt");
print_r($a . "<br>");
print_r($b . "<br>");
print_r(var_dump($a === $b) . "<br>"); // bool(false)
print_r(var_dump(md5($a) === md5($b)) . "<br>"); // bool(true)
加密后弱相等
形式如下:if ($md5==md5($md5))
可以找0e开头并且md5后仍然0e开头的字符串,这样0==0,就可以绕过了。
这里可以用0e215962017。
buu-朴实无华
师傅们可以尝试一下
md5后含有特殊字符
PHP的md5()函数我们一般指使用一个参数,但它是有两个参数的,第二个参数默认为false
看一下PHP手册
比较一下两种方式的不同
介绍完后,我们来看题目
buu上的一道题
有md5弱比较,强比较和特殊字符3个点
Easy MD5select * from 'admin' where password=md5($pass,true)