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

  

   

原文地址:https://www.cnblogs.com/piaomiaohongchen/p/10659359.html

时间: 2024-08-29 04:12:48

php中的md5()的安全问题的相关文章

asp中的md5/sha1/sha256算法收集

对于asp这种古董级的技术,这年头想找一些有用的资料已经不容易了,下面是一些常用的加密算法: md5 (将以下代码另存为md5.inc) + ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

MD5的好处及linux中文件MD5校验和的应用

MD5算法简介: MD5全称是报文摘要算法(Message-Digest Algorithm5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的"指纹"(或称"报文摘要"),不同的文件产生相同的报文摘要的可能性是非常非常之小的. Message Digest Algorithm MD5为计算机安全领域广泛使用的一种散列函数,MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.它是用复杂的数学算法求得的一个12

JAVA中使用MD5加密工具类实现对数据的加密处理

1.MD5工具类 package com.ssm.util; import java.security.MessageDigest; public class MD5Util { //将字节数组转成十六进制字符串 private static String byteArrayToHexString(byte b[]) { StringBuffer resultSb = new StringBuffer(); for (int i = 0; i < b.length; i++) resultSb.

javascript中使用md5函数

javascript中使用md5函数 这对于js来讲本来是没有的,现在可以自己定义一个md5的函数,达到加密效果. var hexcase = 0; function hex_md5(a) { if (a == "") return a; return rstr2hex(rstr_md5(str2rstr_utf8(a))) } function hex_hmac_md5(a, b) { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(a), s

C#统计目录中文件MD5值

1. [代码]统计目录中文件MD5值 using System.IO;using System.Security.Cryptography;using System.Collections;using System.Windows.Forms; IDataObject iData = Clipboard.GetDataObject();   if (iData.GetDataPresent(DataFormats.Text))   {string filepath=(string)iData.G

java中使用MD5加密的算法

MD5,全名Message Digest Algorithm 5,中文名为消息摘要算法第五版,为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.以下是JAVA语言中使用MD5加密的工具类. import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Util { /** * 对字符串进行MD5摘要加密,返回结果与MySQL的MD5函数一致 *

在swift中使用md5

在swift中使用md5 by 伍雪颖 在ProjectName-Bridging-Header.h中添加 #import<CommonCrypto/CommonCrypto.h> extension String { var MD5:String { let cString =self.cStringUsingEncoding(NSUTF8StringEncoding) let length =CUnsignedInt( self.lengthOfBytesUsingEncoding(NSU

c#兼容 PHP中的md5

原文:c#兼容 PHP中的md5 由于工作需要,需要使用C#去对一个php程序做二次开发.在登录验证的时候,发现一个小问题. 就是用C#写的md5算法得出的结果和php的md5()得出的结果有时候会不一样. 导致有些账号的密码验证不能通过.后来网上找了一下,在国外一个网站上找到了答案. C#常用的MD5算法. public static string MD5(string password) { byte[] textBytes = System.Text.Encoding.Default.Ge

密码存储中MD5的安全问题与替代方案

md5安全吗?有多么地不安全?如何才能安全地存储密码?... md5安全吗? 经过各种安全事件后,很多系统在存放密码的时候不会直接存放明文密码了,大都改成了存放了 md5 加密(hash)后的密码,可是这样真的安全吗? 这儿有个脚本来测试下MD5的速度, 测试结果: [[email protected] tools]# php speed-of-md5.php Array ( [rounds] => 100 [times of a round] => 1000000 [avg] => 0