关于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%a2

array2=%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的理解,纯小白,如有错误,欢迎指正

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SQL学习进阶】从入门到高级应用(九)

文章目录 子查询什么是子查询where后面使用子查询from后面使用子查询select后面使用子查询exists、not existsin和exists区别 union&union alllimit &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f495;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面…

计算机视觉与模式识别实验1-2 图像的形态学操作

文章目录 &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1;1.图像膨胀2.图像腐蚀3.膨胀与腐蚀的综合使用4.对下面二值图像的目标提取骨架&#xff0c;并分析骨架结构。 &#x1f9e1;&#x1f9e1;全部代码&#x1f9e1;&#x1f9e1; &#x1f9e1;&#x1f9e1…

Unity实现简单的第一人称控制

先看效果 实现方式 1.首先创建一个脚本 2.编辑脚本内容 付上脚本代码 private float RotationX 0;public float speed 2f;//移动速度// Use this for initializationvoid Start(){Cursor.lockState CursorLockMode.Locked;//锁定鼠标到中心点Cursor.visible false;//隐藏鼠…

前端Vue小兔鲜儿电商项目实战Day03

一、Home - 整体结构搭建和分类实现 1. 页面结构 ①按照结构新增5个组件&#xff0c;准备最简单的模板&#xff0c;分别在Home模块的入口组件中引入 src/views/Home/components/ HomeCategory.vue HomeBanner.vue HomeNew.vue HomeHot.vue HomeProduct.vue <script …

eNSP学习——OSPF的DR与BDR

目录 相关命令 原理概述 实验内容 实验目的 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建基本的OSPF网络 3、查看默认情况下的DR/BDR状态 4、根据现网需求影响DR/BDR选举 相关命令 [R4]int g0/0/0 [R4-GigabitEthernet0/0/0]ospf network-type p2mp //在接…

Golang:使用Base64Captcha生成数字字母验证码实现安全校验

Base64Captcha可以在服务端生成验证码&#xff0c;以base64的格式返回 为了能看到生成的base64验证码图片&#xff0c;我们借助gin go get -u github.com/mojocn/base64Captcha go get -u github.com/gin-gonic/gin文档的示例看起来很复杂&#xff0c;下面&#xff0c;通过简…

部署专属网页版ChatGPT-Next-Web

背景 工作学习中经常使用chat-gpt, 需求是多端使用gpt问答&#xff0c;因此搭建一个网页版本方便多个平台使用。最后选择了 ChatGPT-Next-Web 部署说明 一键部署自己的web页面&#xff0c;因为是使用免费的vercel托管的&#xff0c;vercel节点在全球都有&#xff0c;理论上突…

服务器怎么被远程桌面连接不上,远程桌面连接不上服务器的问题有效解决方案

远程桌面连接不上服务器是一个极其严重的问题&#xff0c;它可能直接影响到我们的工作效率、数据安全&#xff0c;甚至是整个业务运营的顺畅。因此&#xff0c;这个问题必须得到迅速且有效的解决。 当我们尝试远程桌面连接服务器时&#xff0c;可能会遇到连接不上的情况。这其中…

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

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

使用el-tab,el-tab-pane循环使用循环后不显示下划线问题

在vue项目中使用element-UI el-tab里的el-tab-pane是循环出来的&#xff0c;但是循环出来后选中tab不显示下划线了 文章目录 问题问题展示效果问题代码问题原因 解决方案解决后效果解决方案1代码 解决方案2代码 问题 问题展示效果 问题代码 <el-tabs v-model"activeNa…

Python中的魔法函数

大家好&#xff0c;Python作为一种高级编程语言&#xff0c;以其简洁、优雅和易读性而闻名。然而&#xff0c;Python的强大之处不仅仅在于其语法的简洁性&#xff0c;还在于其灵活的面向对象编程范式。在Python中&#xff0c;有一类特殊的方法被称为“魔法函数”&#xff0c;它…

【并查集】专题练习

题目列表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 模板 836. 合并集合 - AcWing题库 #include<bits/stdc.h> using lllong long; //#define int ll const int N1e510,mod1e97; int n,m; int p[N],sz[N]; int find(int a) {if(p[a]!a) p[a]find(p[a]);return p[a…

C++_list简单源码剖析:list模拟实现

文章目录 &#x1f680;1. ListNode模板&#x1f680;2. List_iterator模板(重要)&#x1f331;2.1 List_iterator的构造函数&#x1f331;2.2 List_iterator的关于ListNode的行为 &#x1f680;3. Reverse_list_iterator模板(拓展)&#x1f680;4. List模板(核心)&#x1f331…

更换固件后飞控OSD叠显不对/叠显不显示/叠显乱码问题

笔者用的飞控型号为SpeedyBeeF405V4的飞控&#xff0c;OSD叠显芯片型号为AT7456E。 我的这款飞控是支持两款固件的&#xff0c;INAV和BetaFlight。 开始飞控的默认固件为BetaFlight&#xff0c;切换INAV固件后&#xff0c;进行OSD调整&#xff0c;但发现水平线无法正常显示&…

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

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

ROS2在RVIZ2中加载机器人urdf模型

参考ROS2-rviz2显示模型 我这边用的solid works生成的urdf以及meshes&#xff0c;比参考的方法多了meshes 问题一&#xff1a;Error retrieving file [package://rm_dcr_description/meshes/leftarm_link7.STL]: Package [rm_dcr_description] does not exist 这个是urdf模型中…

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

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

【Linux】Linux环境基础开发工具_3

文章目录 四、Linux环境基础开发工具2. vim3. gcc和g动静态库的理解 未完待续 四、Linux环境基础开发工具 2. vim vim 怎么批量化注释呢&#xff1f;最简单的方法就是在注释开头和结尾输入 /* 或 */ 。当然也可以使用快捷键&#xff1a; Ctrl v 按 hjkl 光标移动进行区域选择…

用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--------------------------------------------------------*…

JVM 常见配置参数

JVM 配置常见参数 Java虚拟机的参数&#xff0c;在启动jar包的时候通过java 命令指定JVM参数 -options表示Java虚拟机的启动参数&#xff0c;class为带有main()函数的Java类&#xff0c;args表示传递给主函数main()的参数。 一、系统查看参数: -XX:PrintVMOptions可以在程序…