关于MD5

        首先还是介绍一下关于md5的基本信息

MD5(Message Digest Algorithm 5)是一种常用的哈希函数,用于产生128位(16字节)的哈希值,通常以32个十六进制数字表示。MD5广泛用于计算文件或文本数据的校验和,以验证数据的完整性或唯一性。它由Ronald Rivest设计于1991年,是MD4算法的改进版本。

MD5的特点包括:

  1. 固定长度输出:MD5生成的哈希值长度固定为128位,无论输入数据的大小。

  2. 快速计算:MD5的计算速度相对较快,适用于对大量数据进行哈希运算。

  3. 不可逆性:MD5是一种单向哈希函数,即从哈希值无法还原出原始数据。

  4. 碰撞概率:尽管MD5具有广泛的应用,但由于其算法设计存在漏洞,导致在一些情况下可能出现碰撞(即不同的输入数据产生相同的哈希值)。这种碰撞风险降低了MD5在一些安全性要求较高的场景中的适用性。

        尽管MD5曾经被广泛应用于数据校验、密码存储等领域,但随着计算技术的发展和MD5算法的漏洞被发现,其安全性逐渐受到质疑。因此,在对安全性要求较高的应用中,建议使用更安全的哈希算法,如SHA-256等。

        然后本文,会对md5,强弱比较,碰撞,做出个人的总结。

        首先,是强弱比较:

强比较:使用三个 ''==='' 比较,值和类型都比较

弱比较:使用两个 ''=='' 比较,只比较值不比较类型

举个例子:

a==b   将a,b的值转换成同类型再比较值

a===b 先判断a,b类型,若相同,则比较值,若不相同,则返回false

        以ctf的角度来说,主要的问题,还是去绕过这些比较,然后比较常见的方法有两种:一种是0e绕过,一种是数组绕过

1.0e绕过原理:(一般只用于弱比较)

第一点,

科学记数法是一种记数的方法。

计算器表达10的幂一般是用E或e

如:2 760 000   =    2.76×10^6    =    2.76e6

           所以0e,无论后面跟什么值,都是0

其次,PHP在处理字符串时会出现缺陷,如果字符串为’5e2’,本来只是一个正常字符串,但PHP会认为这是科学计数法里的e,那么PHP进行比较时会将这个字符串按照科学计数法计算,即5e2=5*10^2=500,因此0e100被认为和0相等。md5加密后的哈希值是一串16进制数,因此需要哈希值第一位为0,第二位为e即可,后面不论是什么都认为和0相等。

然后这里是一些常见的0e绕过可能会用到的值:(原值在上,md5值在下)

QNKCDZO
0e830400451993494058024219903391
240610708
0e462097431906509019562988736854
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064

 这种类型呢,可能还会有md5多次加密的题目,因为大佬写的很好,所以这里不再过多赘述,这里是大佬的博客

2.数组绕过原理:(强弱比较通吃)

        无论是PHP弱比较还是强比较,md5()函数无法处理数组,如果传入的是数组,会返回NULL,两个数组经过加密后返回值均为NULL,形成相等,虽然会报错,但是null=null,逻辑关系为True。所以可以输出flag

比如传入md5(a[]=1)==md5(b[]=2),实际上是null==null,所以数组进行md5弱比较时,结果相等

这个的payload构造就相对简单很多了,如下(以get传参为例)

payload:?a[]=1&b[]=2

然后,还有一种强比较的绕过方法:

md5值完全相同的字符绕过:

array1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2array2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

还有一个

3.万能通式ffifdyop 绕过

实例:

select * from 'admin' where password=md5($pass,true)

输入md5('ffifdyop',true)绕过

select * from 'admin' where password=md5 ( ' ffifdyop ' ,true)

md5(string,raw)

绕过原理:

ffifdyop 这个字符串被 md5 哈希了后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是' or '6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是 select * from 'admin' where password= '  ' or '6xxxxx ',等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数。

where password=正确的密码or 1 ,代表永真,那么前面有没有密码都无所谓了

简单说,

select * from admin where password= '    '  or'6<乱码>'

就相当于

select * from admin where password=  '    '      or 1  实现sql注入

当两个条件中有任一个条件满足,“逻辑或”的运算结果就为“真”

逻辑与”相当于生活中说的“并且”,就是两个条件都同时成立的情况下“逻辑与”的运算结果才为“真”。

4.md5碰撞

        简单来讲,就是基于MD5的工作原理,得出以下属性的MD5算法:给定两个输入M和N,如果MD5(M) = MD5(N),也就是说,MD5哈希的M和N是相同的,那么对于任何输入T,MD5(M || T)= MD5(N || T),其中||表示连接。也就是说,如果输入M和N具有相同的散列值,那么向它们添加相同的后缀T将得到两个具有相同散列值的输出。这个属性不仅适用于MD5哈希算法,也适用于许多其他哈希算法。

        因此,可以给生成的两个不同的文件加上相同的后缀,导致的结果就是一个文件的两数组内容相同,另一个则不同,但两文件的MD5哈希值依然相同。

        关于md5碰撞的实验解释,也可以看一下,这个大佬的博客。

然后呢,是一道我觉得比较经典的md5题目实战:

[BJDCTF 2020]easy_md5

进来以后,就只有一个输入框,查看源代码,也并没有发现可疑信息

这里使用bp抓包,看看有没有哪些有限信息,在重放器界面,发现有一个hint

 发现和我写到的第三个知识点有关联,尝试注入,成功进入了下一个界面、

看源码

注释中有提示, 解释一下这段代码:

  1. $a = $GET['a'];:这一行尝试从GET请求的参数中获取名为'a'的值,并将其赋给变量a。但是,代码中有一个错误,应该是`_GET而不是GET`,因此应该是`a = $_GET['a'];`。

  2. $b = $_GET['b'];:类似地,这一行尝试从GET请求的参数中获取名为'b'的值,并将其赋给变量$b。

  3. if($a != $b && md5($a) == md5($b)){:这是一个条件语句,如果a不等于b,并且它们的MD5哈希值相等,则执行条件块内的代码。这里的逻辑是要确保两个变量的值不相等,但它们的MD5哈希值相等。

  4. header('Location: levell14.php');:如果条件满足,即a不等于b但它们的MD5哈希值相等,那么就会将用户重定向到levell14.php页面。

简单来说,弱比较

两种方法,数组绕过

0e绕过

可以进入到下一个界面,根据这个界面,我们可以获得一些代码的信息

是关于强比较

以下是对代码的解读

  • error_reporting(0);:设置错误报告级别为0,即关闭PHP的错误报告。这样做可能是为了隐藏任何潜在的错误消息,增加代码的安全性。(对于信息获取没什么用)

  • include "flag.php";:包含了一个名为flag.php的文件。根据文件名,这个文件可能包含了一些敏感信息,比如一个或多个标志(flag)。

  • highlight_file(__FILE__);:这行代码使用PHP的内置函数highlight_file()来显示当前文件的源代码。这可能是为了方便开发者查看当前脚本的代码。

  • if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){:这是一个条件语句,如果参数param1不等于参数param2,且它们的MD5哈希值相等,就执行条件块内的代码。(三个等号,强比较标志)

  • echo $flag;:如果条件满足,即参数param1不等于参数param2但它们的MD5哈希值相等,那么就会输出变量$flag的值。这意味着如果条件成立,就会泄露flag.php文件中的敏感信息。(flag的输出)

数组绕过 :

成功获得了flag

        然后呢,是知识点和现实攻防的关联,也是我找了一些材料,这里作为补充:

强比较的应用:

  1. 用户认证系统

    • 在用户认证系统中,当用户登录时,通常会将用户提供的密码与数据库中存储的哈希值进行比较。使用强比较确保即使用户提供的密码与数据库中存储的密码不同,但其哈希值相同,也不会导致认证通过,从而提高了系统的安全性。
  2. 文件完整性校验

    • 在软件发布或文件传输过程中,可以使用MD5哈希值来验证文件的完整性。通过强比较,可以确保即使文件内容不同,但其哈希值相同,也不会导致错误的通过验证,从而保证文件的完整性。

弱比较的应用:

  1. 简单的数据验证

    • 在一些简单的场景中,比如表单提交后端验证,可能会使用MD5哈希值来比较两个值是否相等,而不考虑其安全性。例如,验证用户输入的验证码是否正确,可以比较其MD5哈希值,这样可以避免直接暴露原始验证码。
  2. 故障排除和调试

    • 在开发和调试过程中,可能会使用MD5哈希值来比较文件或数据的内容,以便检查是否有更改或损坏。在这种情况下,弱比较可能足够满足需求,因为安全性不是主要关注点。

        需要注意的是,虽然弱比较在某些情况下可能是合适的,但在安全关键的场景下应避免使用MD5进行比较,因为MD5存在碰撞的风险。在这种情况下,应选择更安全的哈希算法,如SHA-256。

举个例子:

强比较:

假设一个网站使用MD5来存储用户密码。当用户注册时,网站会将用户提供的密码经过MD5哈希后存储在数据库中。

  1. 用户Alice注册,她的密码是"password123",网站将其哈希为MD5值:"482c811da5d5b4bc6d497ffa98491e38",然后存储在数据库中。
  2. 用户Bob注册,他的密码也是"password123",网站同样将其哈希为MD5值:"482c811da5d5b4bc6d497ffa98491e38",并且存储在数据库中。

         在这个场景中,MD5的强比较指的是即使两个用户使用相同的密码,它们在数据库中存储的哈希值也是相同的。这意味着即使密码相同,实际存储的是其MD5哈希值,不会直接暴露用户的原始密码。但是,这也增加了碰撞的可能性,因为如果两个用户使用相同的密码,它们的哈希值也会相同,这可能导致安全性问题。

弱比较

假设一个软件发布公司发布了一个软件,并提供了软件文件的MD5哈希值,以供用户下载后验证文件的完整性。

  1. 公司发布软件的文件的MD5哈希值为:"a3b4c5d6e7f8g9h0i1j2k3l4m5n6o7p8"
  2. 用户下载软件文件后,计算其MD5哈希值为:"a3b4c5d6e7f8g9h0i1j2k3l4m5n6o7p8"。

        在这个场景中,MD5的弱比较指的是用户通过比较两个MD5哈希值来验证文件的完整性。虽然MD5存在碰撞的风险,但在这种情况下,攻击者要找到另一个文件,使其MD5哈希值与原始文件相同,并且实际相同的哈希值对应于原始文件的概率较低。因此,MD5在这种用途下仍然可以提供基本的完整性校验。

  以上就是个人对MD5的理解,纯小白,如有错误,欢迎指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享一个 ASP.NET Web Api 上传和读取 Excel的方案

前言 许多业务场景下需要处理和分析大量的数据&#xff0c;而 Excel 是业务人员常用的数据表格工具&#xff0c;因此&#xff0c;将 Excel 表格中内容上传并读取到网站&#xff0c;是一个很常见的功能&#xff0c;目前有许多成熟的开源或者商业的第三方库&#xff0c;比如 NPO…

香港电讯荣获经济通「金融科技大奖」专业认可

香港电讯非常荣幸在《经济通》举办的「2023金融科技大奖」中脱颖而出&#xff0c;获「杰出跨境数码方案」、「杰出网络安全方案&#xff08;商用&#xff09;」和「杰出ESG解决方案」三个重要奖项。 香港电讯拥有丰富的经验及庞大的专业技术团队&#xff0c;一直致力为客户提供…

Spring Security3.0版本

前言&#xff1a; 核心&#xff1a; A >> &#xff1f; >> B &#xff1f;代表判断层&#xff0c;由Security实现 这是之前的版本浓缩&#xff0c;现在3.0版本添加了更匹配的内容描写&#xff0c;匹配了mvc模式 非mvc模式 核心&#xff1a;client&#x…

scp:Linux系统本地与远程文件传输命令

scp 是Linux系统中用于在本地主机和远程主机之间进行文件传输的命令。 详细说明&#xff1a; scp 命令用于安全地将文件从一个主机传输到另一个主机&#xff0c;所有传输数据都是加密的。语法&#xff1a; scp [参数] [源文件路径] [目标主机:目标路径] 参数说明&#xff1a…

2024-05-31 blue-VH-driver-问题分析-有状态的服务-状态的处理

摘要: VH的driver对上层提供的接口&#xff0c;是会保持状态。这个状态&#xff0c;可以分为&#xff0c;查询的数据的状态&#xff0c;主要是为了提供翻页查询的功能。另一种状态&#xff0c;就是订阅。 有状态的服务: 状态是什么? 其实从调用方的角度更好的理解&#xff0c…

【仿真设计】基于STM32的畜牧动物定位及行为检测设计的Proteus仿真

基于STM32的畜牧动物定位及行为检测设计的Proteus仿真 所需器件&#xff1a; Proteus版本&#xff1a;8.15 整体功能&#xff1a; STM32为主控芯片。温度采集并显示到OLED屏幕上进行监测&#xff08;DS18B20传感器&#xff09;。 判定条件&#xff1a;默认为上限为40度&…

数据结构:堆的保姆级教学指南

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 小新的主页&#xff1a;编程版小新-CSDN博客 1.堆的概念 堆是一种特殊的树结构&#xff0c;通常用…

【爱空间_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

C#【进阶】排序进阶

排序进阶 文章目录 插入排序希尔排序归并排序快速排序堆排序 插入排序 #region 知识点一 插入排序的基本原理 // 8 7 1 5 4 2 6 3 9 // 两个区域 // 排序区 // 未排序区 // 用一个索引值做分水岭// 未排序区元素 // 与排序区元素比较 // 插入到合适位置 // 直到未排序区清空 #e…

git使用流程与规范

原文网址&#xff1a;git代码提交流程与规范-CSDN博客 简介 本文git提交流程与规范是宝贵靠谱的经验&#xff0c;它能解决如下问题&#xff1a; 分支差距过大&#xff0c;导致合代码无数的冲突合完代码后发现代码丢失分支不清晰&#xff0c;无法追溯问题合代码耗时很长&…

数据结构的快速排序(c语言版)

一.快速排序的概念 1.快排的基本概念 快速排序是一种常用的排序算法,它是基于分治策略的一种高效排序算法。它的基本思想如下: 从数列中挑出一个元素作为基准(pivot)。将所有小于基准值的元素放在基准前面,所有大于基准值的元素放在基准后面。这个过程称为分区(partition)操作…

Redis 和 Mysql 如何保证两者数据一致性

文章目录 概述解决方案消息队列异步重试 基于 RocketMQ 的可靠性消息通信&#xff0c;来实现最终一致Canal 组件&#xff0c;监控 Mysql 中 binlog 的日志&#xff0c;把更新后的数据同步到 Redis 里面延时双删弱一致性和强一致性Canal详解 概述 在分布式系统中&#xff0c;保…

失之毫厘差之千里之load和loads

起源 最近在读pandas库的一些文档的时候&#xff0c;顺便也会将文档上的一些demo在编辑器中进行运行测试&#xff0c;其中在读到pandas处理Json数据这一节的时候&#xff0c;我还是像往常一样&#xff0c;将文档提供的demo写一遍&#xff0c;结果在运行的时候&#xff0c;直接…

【React篇】组件错误边界处理(组件错误引起的页面白屏)

我们知道在生产环境react错误会导致整个页面崩溃&#xff0c;显示为空白页面。 比如下图的错误&#xff0c;导致了左侧页面直接白屏&#xff1a; 由于某一个组件报错导致整个页面崩溃是很严重的问题&#xff0c;那么我们应该如何去降低代码报错带来的影响呢&#xff1f; 我们…

用HAL库改写江科大的stm32入门-6-3 PWM驱动LED呼吸灯

接线图&#xff1a; 2 :实验目的&#xff1a; 利用pwm实现呼吸灯。 关键PWM定时器设置&#xff1a; 代码部分&#xff1a; int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*…

【再探】设计模式—访问者模式、策略模式及状态模式

访问者模式是用于访问复杂数据结构的元素&#xff0c;对不同的元素执行不同的操作。策略模式是对于具有多种实现的算法&#xff0c;在运行过程中可动态选择使用哪种具体的实现。状态模式是用于具有不同状态的对象&#xff0c;状态之间可以转换&#xff0c;且不同状态下对象的行…

使用shell命令开启隧道转发的方式

1.适用场景 中转电脑可以通公网&#xff0c;也可以通内网&#xff0c;想把内网映射出去&#xff0c;公网其他电脑就可以通过该隧道远程访问内网的情况 2.命令 开隧道&#xff08;21235是自定义的转发端口&#xff09;&#xff1a; ssh -R 21235:内网地址:ssh端口 用户名公网服…

【C语言】基于C语言实现的贪吃蛇游戏

【C语言】基于C语言实现的贪吃蛇游戏 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C语言学习之路 文章目录 【C语言】基于C语言实现的贪吃蛇游戏前言一.最终实现效果一.Win32 API介绍1.1Win32 API1.2控制台程序1.3控制台屏幕上的坐标COORD…

编程学习 (C规划) 6 {24_4_18} 七 ( 简单扫雷游戏)

首先我们要清楚扫雷大概是如何实现的&#xff1a; 1.布置雷 2.扫雷&#xff08;排查雷&#xff09; &#xff08;1&#xff09;如果这个位置是雷就炸了&#xff0c;游戏结束 &#xff08;2&#xff09;如果不是雷&#xff0c;就告诉周围有几个雷 3.把所有不是雷的位置都找…

蓝桥杯单片机第五届国赛题目

前言&#xff1a;针对串口的练手&#xff0c;此处只作代码记录&#xff0c;不进行分析和展示 目录 题目代码底层驱动主程序核心代码 题目 代码 注&#xff1a;EEPROM的五组后丢弃用一个记录次数的变量进行循环即可&#xff0c;我没有写这一部分代码。 底层驱动 IIC unsign…