• php中的md5()的安全问题


      汇总下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

      

    <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

      

       

     

  • 相关阅读:
    阿里云弹性计算研发团队如何从0到1自建SRE体系
    开创云端时空智能,千寻位置加速三维实景中国建设
    实时复制真实世界,51World用云上数字孪生变革产业
    阿里云弹性计算性能测试负责人三年实战复盘 | 性能测试没那么简单
    阿里技术实战:一些云上资源调度的经验谈
    阿里云第七代云服务器,引领IaaS市场四大趋势
    最新干货!如何深入集群调度与管理?
    E2E性能再攀高峰、安全再加码,阿里云第七代ECS云服务器正式进入公测阶段
    centos7装linux翻译软件
    MySql 5.7中添加用户,新建数据库,用户授权,删除用户,修改密码
  • 原文地址:https://www.cnblogs.com/piaomiaohongchen/p/10659359.html
Copyright © 2020-2023  润新知