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
php中的md5()的安全问题的更多相关文章
- 简单讲解iOS应用开发中的MD5加密的相关使用<转>
这篇文章主要介绍了iOS应用开发中的MD5加密的相关使用,示例代码基于传统的Objective-C,需要的朋友可以参考下 一.简单说明 1.说明 在开发应用的时候,数据的安全性至关重要,而仅仅用POS ...
- 简单讲解iOS应用开发中的MD5加密的相关使用
简单讲解iOS应用开发中的MD5加密的相关使用 作者:文顶顶 字体:[增加 减小] 类型:转载 时间:2015-12-19 我要评论 这篇文章主要介绍了iOS应用开发中的MD5加密的相关使用, ...
- springmvc中request的线程安全问题
SpringMvc学习心得(四)springmvc中request的线程安全问题 标签: springspring mvc框架线程安全 2016-03-19 11:25 611人阅读 评论(1) 收藏 ...
- javascript中使用md5函数
javascript中使用md5函数 这对于js来讲本来是没有的,现在可以自己定义一个md5的函数,达到加密效果. var hexcase = 0; function hex_md5(a) { if ...
- c#兼容 PHP中的md5
原文:c#兼容 PHP中的md5 由于工作需要,需要使用C#去对一个php程序做二次开发.在登录验证的时候,发现一个小问题. 就是用C#写的md5算法得出的结果和php的md5()得出的结果有时候会不 ...
- java中使用MD5进行加密 BASE64Encoder 编码
原文地址:http://www.cnblogs.com/weiwangnuanyang/articles/4326336.html java中使用MD5进行加密 在各种应用系统的开发中,经常需 ...
- java中使用MD5加密的算法
MD5,全名Message Digest Algorithm 5,中文名为消息摘要算法第五版,为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.以下是JAVA语言中使用MD5加密的工具 ...
- java中使用MD5进行加密
java中使用MD5进行加密 在各种应用系统的开发中,经常需要存储用户信息,很多地方都要存储用户密码,而将用户密码直接存储在服务器上显然是不安全的,本文简要介绍工作中常用的 MD5加密算法,希 ...
- C#统计目录中文件MD5值
1. [代码]统计目录中文件MD5值 using System.IO;using System.Security.Cryptography;using System.Collections;using ...
随机推荐
- AJAX获取JSON WEB窗体代码
1.添加引用 using System.Web.Services; 2.添加方法 [WebMethod] public static string getFoodClasses(int parentI ...
- jQueryMobile 網頁使用 ASP.NET Web API 服務
微軟的 ASP.NET Web API 框架,能以 RESTful 輕量級的架構風格,建立 HTTP 服務,讓多種不同的用戶端,如: 手機.平板.電腦(PC),透過 HTTP 的 GET.POST.P ...
- deepin linux 学习笔记(二)——文本编辑器
目录 deepin linux 学习笔记(二)--文本编辑器 前言 nano 小巧的命令行编辑器 通用 编辑 定位 排版 配置 vim 思路独特的超级编辑器 命令模式 插入模式 底线模式(末行模式) ...
- 使用免费 mongodb数据库 + 免费node.js服务器搭建小程序接口
由于微信的小程序只支持不带端口的域名接口,不支持IP地址和接口,所以我们需要映射到80端口并绑定备案过的域名才能被微信小程序访问到.简单点就是接口需要 https 协议才行,找了许久的免费的数据库与n ...
- Scala之eq,equals,==的区别
一.简介 根据官方API的定义: final def ==(arg0: Any): Boolean The expression x == that is equivalent to if (x eq ...
- Go语言打造以太坊智能合约测试框架(level3)
传送门: 柏链项目学院 第三课 智能合约自动化测试 之前课程回顾 我们之前介绍了go语言调用exec处理命令行,介绍了toml配置文件的处理,以及awk处理文本文件获得ABI信息.我们的代码算是完成了 ...
- 在Windows7中的DPI与主题的问题
测试环境Windows7x64,vb6.0 测试在XP系统下,DPI计算似乎没问题 Screen.TwipsPerPixelX=1440/DPI=1440/96=15Screen.TwipsPerPi ...
- C# -- 使用 DriveInfo 获取磁盘驱动器信息
C# -- 使用 DriveInfo 获取磁盘驱动器信息 1. 代码实现 class Program { static void Main(string[] args) { GetComputerDi ...
- jquery-hide//一段hide代码实现异步隐藏
(本篇博客没有什么参考价值,只用于自己未来复习.) 说白了就是通过“父亲”实现异步 代码: <!DOCTYPE html> <html> <head> <sc ...
- linux系统ubuntu18.04安装mysql(5.7)
本文是参考mysql官网整理而成,顺便把一些遇到的问题记载下来. ①将MySQLAPT存储库添加到系统的软件存储库列表中 ---->下载APT存储库(下载链接) ---->安装APT存 ...