• 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

      

       

     

  • 相关阅读:
    富文本的一般处理方式,document.getElementById('富文本的ID').contentWindow.document.body.innerHTML = '%s'" %(content)
    本地搭建Jenkins
    if __name__ == '__main__'是什么意思?如何理解?看到一个很有用的解答
    关于执行webdriver.Chrome; 报错WebDriverException: Message: unknown error: Element is not clickable at point (1085, 103)
    【转载】学习总结——接口测试基础
    fiddler使用——配置抓取https,出现提示“禁用解密”“单击配置”
    算法(二叉树-矩阵-堆排序)
    算法(递归)---写的很乱
    ES6高级技巧(二)
    ES6高级使用技巧(reduce,filter篇)
  • 原文地址:https://www.cnblogs.com/piaomiaohongchen/p/10659359.html
Copyright © 2020-2023  润新知