MD5 绕过第二式:数组绕过

文章目录

  • 参考
  • 环境
  • 推荐阅读
  • 强类型比较运算符
  • 雾来
      • 哈希碰撞
      • 目标
  • 王小云院士与白宫密码
      • 王小云院士
      • 两度破译白宫密码
          • 白宫密码
          • 亮剑
          • 十年磨一剑
  • 雾散
      • 曲径通幽
      • Warning
      • PHP 中的数组与 md5()
      • 尝试绕过
      • PHP8 下的致命错误

参考

项目描述
搜索引擎BingGoogle
AI 大模型文心一言通义千问讯飞星火认知大模型ChatGPT
PHP 手册PHP Manual
wsfgrdghPHP8中字符串与数字的比较更智能
PHP RFC 文档Saner string to number comparisons
超模君两度破译“白宫密码”,让美国政府部门崩溃,却称自己是抱娃敲代码的普通妈妈

环境

项目描述
PHP5.5.05.6.87.0.07.2.57.4.98.0.08.2.9

推荐阅读

项目描述
CSDNMD5 绕过第一式:弱比较绕过
CSDNMD5 绕过第二式:数组绕过
CSDNMD5 绕过第三式:ffifdyop

强类型比较运算符

在 PHP 中,强类型比较运算符 是指对操作数进行比较操作时,不单单只比较 操作数的大小,还比较 操作数所属的数据类型是否相同

与强类型比较符相对的是 弱类型比较运算符,弱类型比较运算符是指 PHP 在进行比较操作时,当操作数的数据类型不同时,PHP 将尝试将 依据一定的规则将操作数的数据类型进行统一

举个栗子

<?php# 强类型比较运算符
var_dump('4949' == 4949);
//在 PHP8 版本中运行
//'4949Hello' == 4949
//得到的结果将为 false
var_dump('4949Hello' == 4949);# 弱类型比较运算符
var_dump('4949' === 4949);
var_dump('4949Hello' === 4949);

执行效果

bool(true)
bool(true)
bool(false)
bool(false)

雾来

哈希碰撞

MD5 算法的 哈希输出空间 相对较小,仅有 128 位(仅能容纳 128 位二进制数据),而 输入空间是无限的,这种 输入与输出的不匹配性 导致了哈希碰撞的 可能性。攻击者可以使用 巧妙构造的输入数据,通过精心选择的 碰撞攻击算法,找到 具有相同哈希值的不同输入

目标

在继续讲解前,先来看一段代码。倘若在安全竞赛中你需要绕过一个类似如下 PHP 代码中的判断语句:

<?php$user_input = "I'm a secret.";
$user_input_1 = "I'm a secret too.";if ($user_input !== $user_input_1 && md5($user_input) === md5($user_input_1)) {print('Win');
}

上述代码 允许用户进行两次输入,在后续的判断语句中,PHP 将采用 强类型比较运算符 判断用户的两次输入是否相同 这两次输入的 MD5 哈希结果 是否相同。这意味着 我们需要寻找到 能够产生哈希碰撞的两个数据。这样的数据当然能够从网络中获取到,但想必我们都希望使用一种更为专业🕶的手段解决这个问题🧙🏻‍♂️。并且,从网络中查找到能够发生哈希碰撞的几个数据来绕过判断语句这一方案仅在 $user_input$user_input_1 均为用户的输入数据时生效,假如 $user_input$user_input_1 中的 任意一个变量的内容由 PHP 程序指定,这一方案即土崩瓦解。

王小云院士与白宫密码

王小云院士

王小云(Xiaoyun Wang)院士 是中国首屈一指的密码学专家,因她在 哈希函数密码分析方面 的贡献而广受赞誉。她是几种流行的密码算法潜在弱点的发现者之一,其中包括对 MD5SHA-0SHA-1 哈希函数的攻击。

两度破译白宫密码

白宫密码

基于 Hash 函数的 MD5SHA-1 是由美国标准技术局(National Institute of Standards and Technology,NIST)颁布的,是 当时国际上公认最先进、应用范围最广的两大重要算法。也正如此,MD5SHA-1 被称为白宫密码。

亮剑

2004 年,王小云院士在密码学大会上宣布 四个国际通用 的哈希算法 MD5HAVAL- 128MD4RIPEMD 已被破解,震惊全球👏。在会上,王小云公布了一种方法,可以更有效地找到哈希函数的两个不同输入,这两个输入会产生相同的哈希值(这一现象被称为哈希冲突)

理论上,为了找到能够产生哈希碰撞的另一数据,可能需要尝试的次数接近 280 次方💥。但是,王小云的方法大大减少了这个数字,虽然仍然需要巨大的计算量,但这个方法确实暴露了MD5 的潜在弱点。

美国对于王小云的研究大为震撼,却故作镇定的认为新研究出的 SHA-1 加密算法绝不可能被攻破😈。然而仅在两个月后,SHA-1 便被王小云成功破解。原本在密码界还是一张白纸的中国,一下子成了密码学界不可忽视的新星✨。

十年磨一剑

在现代社会中,短视和即时回报的诱惑无处不在。然而,真正的突破和伟大的成就往往源于深入钻研、持续的努力和对目标的坚韧不拔。王小云成功破译 宫密码正是这样一个令人震撼的例证💖。

密码学的求学道路,王小云走了十年。那十年,当许多人追求短期的荣誉、金钱和地位🎲,王小云却选择了 一条不同的道路,她选择了对自己的研究领域保持深厚的热情和对解决问题的决心。

雾散

曲径通幽

使用王小云院士提供的 MD5 破解方案,可以在 数个小时内(依计算机配置而定)完成 MD5 的破解。但实际上,在我们这个例子中,还无需使用到这一方案。

Warning

Warning 是 PHP 中的一种 异常类型,常产生于一些需要 提醒开发者异常的存在但又没有必要立即停止程序的情况 中。

PHP 中的数组与 md5()

PHP 中的 md5() 函数允许你使用 数组 作为该函数的参数,md5() 函数对于 任何数组 都将返回 NULL。对此,请参考如下示例:

<?php$result = md5([1, 2, 3]);
$result_1 = md5(['Hello', ' ', 'Wrold']);
$result_2 = md5(['One' => 'Hello', 'Two' => ' ', 'Three' => 'World']);var_dump($result);
var_dump($result_1);
var_dump($result_2);

执行效果

上述示例代码中向 md5() 函数传递了 三个不同的数组,在 md5() 函数的处理下,它们都无例外的转化为了 NULL

Warning: md5() expects parameter 1 to be string, array given in C:\test.php on line 4Warning: md5() expects parameter 1 to be string, array given in C:\test.php on line 5Warning: md5() expects parameter 1 to be string, array given in C:\test.php on line 6
NULL
NULL
NULL
PHP Warning:  md5() expects parameter 1 to be string, array given in C:\test.php on line 4
PHP Warning:  md5() expects parameter 1 to be string, array given in C:\test.php on line 5
PHP Warning:  md5() expects parameter 1 to be string, array given in C:\test.php on line 6

尝试绕过

回到我们最初探讨的问题上来:

<?php$user_input = "I'm a secret.";
$user_input_1 = "I'm a secret too.";if ($user_input !== $user_input_1 && md5($user_input) === md5($user_input_1)) {print('Win');
}

想必各位此时已经对上述代码中的判断语句的绕过方式已经有了方案,即将 $user_input$user_input_2 这两个变量赋值为 两个不相等的数组 即可。

对此,我们做出了下述调整:

<?php$user_input = ['One' => 'Hello', 'Two' => ' ', 'Three' => 'World'];
$user_input_1 = [1, 2, 3];if ($user_input !== $user_input_1 && md5($user_input) === md5($user_input_1)) {print('Win');
}

执行结果

能够观察到,我们已经绕过了 MD5 函数的限制,成功执行了 if 语句包含的代码。

PHP Warning:  md5() expects parameter 1 to be string, array given in C:\test.php on line 7
PHP Warning:  md5() expects parameter 1 to be string, array given in C:\test.php on line 7Warning: md5() expects parameter 1 to be string, array given in C:\test.php on line 7Warning: md5() expects parameter 1 to be string, array given in C:\test.php on line 7
Win

PHP8 下的致命错误

不同于其他版本(PHP8 以下版本),PHP8 不允许在 md5() 函数中使用数组。倘若您在 md5() 函数中使用数组,PHP 将抛出 Fatal Error 异常,程序将立即终止。

对于我们刚刚找到的绕过方案:

<?php$user_input = ['One' => 'Hello', 'Two' => ' ', 'Three' => 'World'];
$user_input_1 = [1, 2, 3];if ($user_input !== $user_input_1 && md5($user_input) === md5($user_input_1)) {print('Win');
}

在 PHP 中将得到如下结果:

PHP Fatal error:  Uncaught TypeError: md5(): Argument #1 ($string) must be of type string, array given in C:\test.php:7
Stack trace:
#0 C:\test.php(7): md5(Array)
#1 {main}thrown in C:\test.php on line 7Fatal error: Uncaught TypeError: md5(): Argument #1 ($string) must be of type string, array given in C:\test.php:7
Stack trace:
#0 C:\test.php(7): md5(Array)
#1 {main}thrown in C:\test.php on line 7

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

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

相关文章

JavaScript中如何确定this的值?如何指定this的值?

&#x1f380;JavaScript中的this 在绝大多数情况下&#xff0c;函数的调用方法决定了this的值&#xff08;运行时绑定&#xff09;。this不能在执行期间被赋值&#xff0c;并且在每次函数呗调用时this的值也可能会不同。 &#x1f37f;如何确定this的值&#xff1a; 在非严格…

【React】React组件生命周期以及触发顺序(部分与vue做比较)

最近在学习React&#xff0c;发现其中的生命周期跟Vue有一些共同点&#xff0c;但也有比较明显的区别&#xff0c;并且执行顺序也值得讨论一下&#xff0c;于是总结了一些资料在这里&#xff0c;作为学习记录。 v17.0.1后生命周期图片 初始化阶段 由ReactDOM.render()触发 —…

【Axure】元件库和母版、常见的原型规范、静态原型页面制作

添加现有元件库 点击元件库——载入 当然也可以创建元件库&#xff0c;自己画自己保存 建立京东秒杀母版 静态原型页面的制作 框架 选择以iphone8的界面大小为例&#xff0c;顶部状态栏高度为20 左侧类似于标尺&#xff0c;因为图标、文字离最左侧的间距是不一样的 信…

Nat. Commun. | 大规模高分辨单光子成像

本文由论文作者团队(课题组)投稿 单光子雪崩二极管(Single Photon Avalanche Diode,简称SPAD)阵列因其极佳的单光子灵敏度而受到广泛关注,已广泛应用于量子通信与计算、荧光寿命成像、时间飞行成像等各个领域。与同样具有较高灵敏度的EMCCD和sCMOS相比,SPAD阵列能够在极…

车载ADB环境搭建

ADB是什么 ADB&#xff0c;即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具&#xff0c;它可为各种设备操作提供便利&#xff0c;如安装和调试应用&#xff0c;并提供对 Unix shell&#xff08;可用来在模拟器或连接的设备上运行各种命…

SimpleCG动画示例--汉诺塔动画演示

前言 SimpleCG的使用方法在前面已经介绍了许多&#xff0c;有兴趣的同学如果有去动手&#xff0c;制作一些简单动画应该没多大问题的。所以这次我们来演示一下简单动画。我们刚学习C语言的递归函数时&#xff0c;有一个经典例子相信很多同学都写过&#xff0c;那就是汉诺塔。那…

【C++】多线程的学习笔记——白话文版(bushi

目录 为什么要使用多线程 例子 代码 结果 首先要先学的库——thread库 thread的简介 thread的具体使用方法 基本变量的定义 注意&#xff08;小重点&#xff09; join函数的解读&#xff08;重点&#xff09; detach函数的解读 注意 关于vector和thread是联合使用 …

【DLoopDetector(C++)】DBow2词袋模型loop close学习

0.前言 最近读了两篇论文&#xff0c;论文作者开源了一种基于词袋模型DBoW2库的DLoopDetector算法&#xff0c;自己运行demo测试一下 对应论文介绍&#xff1a;Bags of Binary Words for Fast Place Recognition in Image Sequences 开源项目Github地址&#xff1a;https://gi…

P1541 [NOIP2010 提高组] 乌龟棋(4维背包问题)

[NOIP2010 提高组] 乌龟棋 题目背景 小明过生日的时候&#xff0c;爸爸送给他一副乌龟棋当作礼物。 题目描述 乌龟棋的棋盘是一行 N N N 个格子&#xff0c;每个格子上一个分数&#xff08;非负整数&#xff09;。棋盘第 1 1 1 格是唯一的起点&#xff0c;第 N N N 格是…

C++代码示例:排列数简单生成工具

文章目录 前言代码仓库内容代码&#xff08;有详细注释&#xff09;编译和运行命令结果总结参考资料作者的话 前言 C代码示例&#xff1a;排列数简单生成工具。 代码仓库 yezhening/Programming-examples: 编程实例 (github.com)Programming-examples: 编程实例 (gitee.com) …

GEO生信数据挖掘(四)数据清洗(离群值处理、低表达基因、归一化、log2处理)

检索到目标数据集后&#xff0c;开始数据挖掘&#xff0c;本文以阿尔兹海默症数据集GSE1297为例 目录 离群值处理 删除 低表达基因 函数归一化&#xff0c;矫正差异 数据标准化—log2处理 完整代码 上节围绕着探针ID和基因名称做了一些清洗工作&#xff0c;还做了重复值检查…

牛客网_HJ2_计算某字符出现次数

HJ2_计算某字符出现次数 原题思路代码运行截图收获 原题 HJ2_计算某字符出现次数 思路 把输入的字符串和字符都变成大写或小写&#xff0c;然后逐一计数 代码 #include <cctype> #include <iostream> #include <string> #include <algorithm> usi…

java多线程相关介绍

1. 线程的创建和启动 在 Java 中创建线程有两种方式。一种是继承 Thread 类并重写其中的 run() 方法&#xff0c;另一种是实现 Runnable 接口并重写其中的 run() 方法。创建完线程对象后&#xff0c;调用 start() 方法可以启动线程。 2. 线程的状态 Java 的线程在不同阶段会处于…

C++八股

1、简述一下C中的多态 在面向对象中&#xff0c;多态是指通过基类的指针或引用&#xff0c;在运行时动态调用实际绑定对象函数的行为&#xff0c;与之相对应的编译时绑定函数称为静态绑定。 静态多态 静态多态是编译器在编译期间完成的&#xff0c;编译器会根据实参类型来选择…

自动驾驶技术:现状与未来

自动驾驶技术&#xff1a;现状与未来 文章目录 引言自动驾驶技术的现状自动驾驶技术的挑战自动驾驶技术的未来结论结论 2023星火培训【专项营】Apollo开发者社区布道师倾力打造&#xff0c;包含PnC、新感知等的全新专项课程上线了。理论与实践相结合&#xff0c;全新的PnC培训不…

Vim学习笔记

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录 模式介绍指令概览启动退出移动光标插入删除复制替换撤销搜索信息设置外…

Redis缓存穿透、击穿和雪崩

面试高频 服务的高可用问题&#xff01; 在这里我们不会详细的区分析解决方案的底层&#xff01; Redis缓存概念 Redis缓存的使用&#xff0c;极大的提升了应用程序的性能和效率&#xff0c;特别是数据查询方面。但同时&#xff0c;它也带来了一些问题。其中&#xff0c;最要…

Linux shell编程学习笔记4:修改命令行提示符格式(内容和颜色)

一、命令行提示符格式内容因shell类型而异 Linux终端命令行提示符内容格式则因shell的类型而异&#xff0c;例如CoreLinux默认的shell是sh&#xff0c;其命令行提示符为黑底白字&#xff0c;内容为&#xff1a; tcbox:/$ 其中&#xff0c;tc为当前用户名&#xff0c;box为主机…

【JVM】并发可达性分析-三色标记算法

欢迎访问&#x1f44b;zjyun.cc 可达性分析 为了验证堆中的对象是否为可回收对象&#xff08;Garbage&#xff09;标记上的对象&#xff0c;即是存活的对象&#xff0c;不会被垃圾回收器回收&#xff0c;没有标记的对象会被垃圾回收器回收&#xff0c;在标记的过程中需要stop…

LabVIEW开发光学相干断层扫描系统

LabVIEW开发光学相干断层扫描系统 癌症是一种以异常或受损细胞无法控制生长为特征的疾病&#xff0c;是世界上导致死亡的主要原因之一。以前的研究人员已经表明&#xff0c;患病时组织力学会发生变化。能够同时量化和可视化组织力学和细胞行为有可能弥合我们对这两种癌症驱动特…