在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
汇总下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 如果设置第二个参数为true,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。 就是说返回16个字节 漏洞测试demo: md5_login.html
<html> <head>用户登录</head> <form name="LoginForm" method="post" action="md5_loop.php" onSubmit="return InputCheck(this)"> <p> <label for="username" class="label">用户名:</label> <input id="username" name="username" type="text" class="input" /> <p/> <p> <label for="password" class="label">密 码:</label> <input id="password" name="password" type="password" class="input" /> <p/> <p> <input type="submit" name="submit" value=" 确 定 " class="left" /> </p> </form> </html>
md5_loop.php
<?php $username=$_POST['username']; $password=$_POST['password']; error_reporting(0); $link = mysql_connect('localhost', 'root', 'root'); if (!$link) { die('Could not connect to MySQL: ' . mysql_error()); } // 选择数据库 $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('<pre>' . mysql_error() . '</pre>' ); if($result = mysql_fetch_array($check_query)){ echo "login true"; } else { exit('登录失败!点击此处 <a href="javascript:history.back(-1);">返回</a> 重试'); } //$row1 = mysql_fetch_row($result); //var_dump($row1); mysql_close($link); ?> 当用户输入任意账号和密码ffifdyop 就可以登录系统:
任意登录原理讲解: 首先是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
|
2022-08-30
2022-07-30
2022-08-17
2022-11-06
2022-08-18
请发表评论