初学关于md5碰撞bypass

发布于 2022-02-01  186 次阅读


CTF中有几个MD5绕过的技巧,这里总结一下:
1.先看第一段代码:
$str1 = $_GET['str1'];
$str2 = $_GET['str2'];
if (md5($str1) == md5($str2)) {
die('OK');
}
这个其实不是MD5函数的锅,而是php弱类型比较产生的漏洞

想要满足这个判断只需要构造出MD5值为0e开头的字符串,这样的话弱类型比较会认为是科学技术法,0的多少次方都是0,因此可以绕过。
有一些字符串的MD5值为0e开头,这里记录一下:
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
还有MD5和双MD5以后的值都是0e开头的

CbDLytmyGm2xQyaLNhWn
770hQgrBOjrcqftrlaZk
7r4lGXCH2Ksu2JNT3BYM
2.接下来看第二段代码
$str1 = $_GET['str1'];
$str2 = $_GET['str2'];
if (md5($str1) === md5($str2)) {
die('OK');
}
因为是强类型比较,用0e开头的字符串是没办法绕过的了,但是PHP自身的特性使得可以提交一个数组

而md5函数传入数组的返回值都是NULL,这样就可以绕过强类型比较了

所以这里用GET传入?str1[]=1&str2[]=2就行了
3.第三段代码
$str1 = (string)$_GET['str1'];
$str2 = (string)$_GET['str2'];
if (md5($str1) === md5($str2)) {
die('OK');
}
由于强制类型转换,传数组就不可行了,这里就需要MD5碰撞

对于需要两个内容不同但是MD5值相同的文件,使用Fastcoll就可以了,再用url编码一下,get传参就行了

原文地址:https://www.cnblogs.com/Silkage/p/12987248.html