在线结算、在线支付、自动到帐、自动上货、网购批发 专注服务中小企业 会员中心 | 设为首页 | 加入收藏 | 繁体中文
服务热线:400-6966-014 点击这里给我发消息
网站首页软件购买软件动态软件下载常见问题网络加速器快速备案My18高防云My18收银宝空间域名合作商招贤纳士关于我们媒体报道
栏目导航
新闻搜索
热门点击
联系我们
  • 网址:www.we0546.com
  • 邮箱:800093106@b.qq.com
  • 电话:4006966014
  • 地址:山东省东营市东营区西二路471号北海嘉园C座305号

  • 首页新闻中心  
     
    php中md5()的安全问题
    来源:转载 点击数:34次 更新时间:2019-10-6 11:46:21

    文章来源https://www.cnblogs.com/piaomiaohongchen/p/10659359.html

            安全问题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

      

    复制代码
    <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

    【刷新页面】【加入收藏】【打印此文】 【关闭窗口】
    上一篇:欧盟金融事务专员称将制定新法规监管天秤币 下一篇:Paypal或将退出Facebook旗下加密货币Libra项目
     

      友情链接
    腾讯企业QQ招商银行金山360工商银行支付宝财付通
    快递查询东营招聘网绿色软件下载软件盒子天空下载西西软件园太平洋电脑网天极下载多多软件站
    好特下载飞翔下载泡泡网下载ECSHOP非凡软件站ZOL分流下硅谷动力豆豆网it168下
    广告服务 | 联系我们 | 关于我们 | 版权声明 | 友情链接
    Copyright 2009 - 2010 Powered By Zhirui Ver 3.6.5 鲁ICP备13019314号-1
    邮件:800093106@b.qq.com 电话:4006966014  地址:山东省东营市东营区西二路471号北海嘉园C座305号  法律顾问:山东众成仁和律师事务所