汇总下php中md5()的安全问题
安全问题1:
1.x=任意字符串 md5('x')=0e***
2.y=任意字符串 md5('y')=0e***
如果x==y,php会返回true,在有些时候可以绕过逻辑判断
x==0 /y==0都为true,有些时候可以用来绕过逻辑判断
原理:php使用==会把两边的数值进行类型转换,0e***都转换成了0
例子var_dump(md5('240610708') == md5('QNKCDZO')); 返回true
修复方案,进行类型匹配使用强等于(===)进行判断
安全问题2:
md5 ( string $str [, bool $raw_output= FALSE ] ) : string
如果设置第二个参数为true,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。
就是说返回16个字节
漏洞测试demo:
md5_login.html
用户名:
密 码:
md5_loop.php
}//选择数据库
$db = mysql_select_db("test", $link);if(!$db)
{echo 'select db error';exit();
}//执行sql
//$password = "admin";
$sql = "SELECT * FROM login WHERE username='$username' and password = '".md5($password,true)."'";var_dump($sql);$check_query=mysql_query($sql) or die('
' . mysql_error() . '
');if($result = mysql_fetch_array($check_query)){echo "login true";
}else{exit('登录失败!点击此处 返回 重试');
}//$row1 = mysql_fetch_row($result);
//var_dump($row1);
mysql_close($link);?>
当用户输入任意账号和密码ffifdyop
就可以登录系统:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5COyQmZ2QzYzkDMiJGZwUjMyYzMiZTN4MTM4UWY4EzNz8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
任意登录原理讲解:
首先是sql语句:
SELECT * FROM login WHERE username='hello' and password=''
如果password万能密码是SELECT * FROM login WHERE username='hello' and password='' or '1'--+
他会提示登录成功,如果是' or '1aaa会进行类型转换,转换成int类型的1,or '1aaa相当于1,那么' or 'a1就相当于0
0相当于false
因为设置md5设置第二个参数是true,那么会自动截取前16个字节的数据
就是:md5('ffifdyop')= 276f722736c95d99e921722cf9ed621c
获取十六个字节=276f722736c95d99
十六个字节转换成字符串就是%27%6f%72%27%36%c9%5d%99
解码
再次带入数据库查询就是:
SELECT * FROM login WHERE username='hello' and password = ''or'6蒥欓!r,b'
mysql中,只要不是0和空等,那就为true。
修复方案:md5+盐(salt)+别设置true
黑盒测试的时候可以尝试:任意账号+密码ffifdyop