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

  

   

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

  1. 简单讲解iOS应用开发中的MD5加密的相关使用<转>

    这篇文章主要介绍了iOS应用开发中的MD5加密的相关使用,示例代码基于传统的Objective-C,需要的朋友可以参考下 一.简单说明 1.说明 在开发应用的时候,数据的安全性至关重要,而仅仅用POS ...

  2. 简单讲解iOS应用开发中的MD5加密的相关使用

      简单讲解iOS应用开发中的MD5加密的相关使用   作者:文顶顶 字体:[增加 减小] 类型:转载 时间:2015-12-19 我要评论 这篇文章主要介绍了iOS应用开发中的MD5加密的相关使用, ...

  3. springmvc中request的线程安全问题

    SpringMvc学习心得(四)springmvc中request的线程安全问题 标签: springspring mvc框架线程安全 2016-03-19 11:25 611人阅读 评论(1) 收藏 ...

  4. javascript中使用md5函数

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

  5. c#兼容 PHP中的md5

    原文:c#兼容 PHP中的md5 由于工作需要,需要使用C#去对一个php程序做二次开发.在登录验证的时候,发现一个小问题. 就是用C#写的md5算法得出的结果和php的md5()得出的结果有时候会不 ...

  6. java中使用MD5进行加密 BASE64Encoder 编码

    原文地址:http://www.cnblogs.com/weiwangnuanyang/articles/4326336.html java中使用MD5进行加密     在各种应用系统的开发中,经常需 ...

  7. java中使用MD5加密的算法

    MD5,全名Message Digest Algorithm 5,中文名为消息摘要算法第五版,为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.以下是JAVA语言中使用MD5加密的工具 ...

  8. java中使用MD5进行加密

    java中使用MD5进行加密     在各种应用系统的开发中,经常需要存储用户信息,很多地方都要存储用户密码,而将用户密码直接存储在服务器上显然是不安全的,本文简要介绍工作中常用的 MD5加密算法,希 ...

  9. C#统计目录中文件MD5值

    1. [代码]统计目录中文件MD5值 using System.IO;using System.Security.Cryptography;using System.Collections;using ...

随机推荐

  1. Struts2笔记_拦截器

    A.拦截器是什么 --- Interceptor:拦截器,起到拦截Action的作用. ---Filter:过滤器,过滤从客户端向服务器发送的请求. ---Interceptor:拦截器,拦截是客户端 ...

  2. es6 字符串的扩展和数值的扩展

    es6字符串的扩展 1. es6新增的一些方法 1.1 includes 判断是否包括在内,返回一个 true or false 1.2 statsWith 判断是否以什么开头,返回一个 true o ...

  3. CSS 三条横线等分

    .header_qian { width: 1.5rem; height: 1.5rem; background: rgba(250, 250, 250,0.7); border-radius: 50 ...

  4. SAP MM '独立/集中'等于1的MTS物料MRP运行后合并需求触发PR

    SAP MM '独立/集中'等于1的MTS物料MRP运行后合并需求触发PR Test data 独立与集中: 1 (仅个别需求) STO 1, 这是一个公司间STO,从国内生产基本转入香港贸易公司, ...

  5. Html5 Canvas介绍

    1. 获取绘图上下文 var mycanvas = document.getElementById('mycanvas'); var context = mycanvas.getContext('2d ...

  6. 关于MySQL集群的一些看法

    作者:Gary Chen链接:https://zhuanlan.zhihu.com/p/20204156来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 市面上的招聘往往 ...

  7. js坚持不懈之17:onmousedown、onmouseup 以及 onclick 事件

    <!DOCTYPE html> <html> <body> <div onmouseover = "mOver(this)" onmous ...

  8. .Net Core 在Linux服务器下部署程序--(4). 前端ReactWeb应用部署

    确认第二步中的软件已经安装完成 Nodejs前端Web服务器 Zip与UnZip压缩包软禁 nrm前端包源管理器 PM2前端Web程序守护进程 创建部署文件夹 如果已经执行过( 3. 租户平台后端程序 ...

  9. Win 10 和 Ubuntu 16.04 双系统,安装完成后,设置默认的启动项

    当安装好了 Windows 和 Ubuntu 双系统之后,默认的启动项是 Ubuntu,我们可以来设置默认的启动项, 开机时,在启动项选择处,可以通过↑↓ 键来选择启动哪个系统,第一行序号是 0 ,第 ...

  10. ios copy和strong,浅拷贝和深拷贝

    copy@property (nonatomic, copy) NSString *name;self.name = mutableString;这时,name对mutableString一个深拷贝, ...