2022-08-10 20:42:32
浏览数 (1)
MD5函数介绍 语法
md5(string,raw )
参数描述string必需。要计算的字符串。raw可选。默认不写为FALSE:32位16进制的字符串。TRUE:16位原始二进制格式的字符串MD5函数漏洞 代码语言: javascript
复制 $str1 = $_GET['str1'];
$str2 = $_GET['str2'];
if (md5($str1) == md5($str2)){
echo 'OK';
}
php弱类型比较产生的漏洞想要满足这个判断只需要构造出MD5值为0e开头的字符串,这样的话弱类型比较会认为是科学技术法,0的多少次方都是0,因此可以绕过 有一些字符串的MD5值为0e开头,这里记录一下QNKCDZO 240610708 s878926199a s155964671a s214587387a 还有MD5和双MD5以后的值都是0e开头的CbDLytmyGm2xQyaLNhWn 770hQgrBOjrcqftrlaZk 7r4lGXCH2Ksu2JNT3BYM PHP特性 代码语言: javascript
复制 $str1 = $_GET['str1'];
$str2 = $_GET['str2'];
if (md5($str1) === md5($str2)) {
echo 'OK';
}
因为是强类型比较,用0e开头的字符串是没办法绕过的了,但是PHP自身的特性使得可以提交一个数组,而md5函数传入数组的返回值都是NULL,这样就可以绕过强类型比较了。所以这里用GET传入?str1[]=1&str2[]=2就行了补充:md5()或者sha1()之类的函数计算的是一个字符串的哈希值,对于数组则返回false,如果 MD5碰撞 代码语言: javascript
复制 $str1 = (string)$_GET['str1'];
$str2 = (string)$_GET['str2'];
if (md5($str1) === md5($str2)) {
echo 'OK';
}
由于强制类型转换,传数组就不可行了,这里就需要MD5碰撞,对于需要两个内容不同但是MD5值相同的文件,使用Fastcoll(工具下载)就可以了 绕过md5()来构造攻击语句 代码语言: javascript
复制 select * from 'admin' where password=md5($pass,true)
ffifdyop这个点的原理是 ffifdyop
这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c (对应ascii字符串'or'6É]™é!r,ùíb
),这个字符串前几位刚好是 ‘ or ‘6,
而 Mysql 刚好又会吧 hex 转成 ascii 解释 ,因此拼接之后的形式是select * from ‘admin’ where password=’’ or ‘6xxxxx’。等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数