当前位置: 首页 > news >正文

hash长度扩展攻击

作为一个信息安全的人,打各个学校的CTF比赛是比较重要的!

最近一个朋友发了道题目过来,发现有道题目比较有意思,这里跟大家分享下

这串代码的大致意思是:

这段代码首先引入了一个名为"flag.php"的文件,该文件可能包含一个标志(flag)。然后使用highlight_file(__FILE__)函数来高亮显示当前文件的源代码。

接下来,获取了两个变量:$guet$sec。其中,$guet是从GET请求中获取的参数,默认值为'123456',而$sec则是从COOKIE中获取的参数,默认值也为'123456'。

代码中有一段正则表达式/^2023(.*?)GUETSEC$/,用于检查$guet是否以"2023"开头,以"GUETSEC"结尾,并且在开头和结尾之间可以包含任意字符。如果满足这个条件,那么会进行以下判断:

  1. 如果$guet的MD5哈希值等于'a26f719b36e667992b03a298ad18b1c7',则输出$flag的MD5哈希值。
  2. 如果$guet的整数值等于反转后的$guet的整数值,则输出$flag的长度。

接下来,如果$guet不为空,那么会进行以下判断:

如果$sec的MD5哈希值等于$flag$guet拼接后的MD5哈希值,那么输出$flag的值。

最后,如果$guet为空,则输出"Oh no! You can't do this!"。

这道题目的原理是:hash长度扩展攻击,这里先介绍个脚本方法爆破,这是我最初使用的脚本:

因为要爆破的其实就中间的三个字母(一共十四个,已经知道11个)所以比较简单,

<?php

// 固定的前后缀
$prefix = '2023';
$suffix = 'GUETSEC';
// 目标MD5哈希值
$targetMd5 = 'a26f719b36e667992b03a298ad18b1c7';
// 总长度为14,已知前缀和后缀总长度为10,所以中间部分长度为3
$middleLength = 14 - strlen($prefix) - strlen($suffix);

// 生成可能的中间部分字符集,例如所有可打印ASCII字符
$charset = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

// 遍历所有可能的中间部分
for ($i = 0; $i < pow(strlen($charset), $middleLength); $i++) {
    // 生成中间部分
    $middle = '';
    $current = $i;
    for ($j = 0; $j < $middleLength; $j++) {
        $middle = $charset[$current % strlen($charset)] . $middle;
        $current = intval($current / strlen($charset));
    }

    // 组合全字符串
    $guet = $prefix . $middle . $suffix;

    // 检查MD5哈希
    if (md5($guet) === $targetMd5) {
        echo "Found: $guet";
        break;
    }
}

?>

第一个绕过就搞定了,这里由于就只要求中间的三个字母,因为已经知道了开头结尾,所以可以使用我的脚本进行爆破。

这里我高兴坏了!心想都已经拿到flag的MD5形式了,那不就可以直接拿到flag了!直接MD5解密,但是现实给我泼了一盆狠狠的冷水!!!

MD5是一种广泛使用的哈希函数,它产生一个128位(16字节)的哈希值。通常呈现为一个32字符的十六进制数。它是一种单项函数,这意味着从MD5哈希值是不可能(在实践中)直接得到原始数据的。换句话说,MD5不是加密过程;它是一个单向散列函数,没有一个反向的过程能够从散列值中恢复出准确的原始输入。

如果已知的MD5哈希值是"437a413ace6757019e0a0c5ead62c9f9",除非通过暴力破解法——即尝试大量可能的输入值并对每个值进行散列,直到找到与已知散列值匹配的输入,否则无法得知$flag的内容,但是这个运算量实在太大,实战根本不可能完成,我只能抛弃脚本爆破这条路!

第二个if绕过:

本地测试发现2023e-4GUETSEC,只要GUETSEC前面的数字大于’2023’(长度为4),经过 intval()``函数
转化后与strrev( 2023e-4GUETSEC)相等为0,即可绕过

接下来才是本文的重点!!!

如果$sec的MD5哈希值等于$flag$guet拼接后的MD5哈希值,那么输出$flag的值。

这里已经知道结果flag是42位,而且已经知道了flag的MD5形式,437a413ace6757019e0a0c5ead62c9f9,,直接使用Hashpump,这里就是哈希函数扩展攻击:

哈希长度扩展攻击(也称为哈希长度扩充攻击或者Hash Extension Attack)是一种针对使用Merkle-Damgård构造的哈希函数(如MD5, SHA-1, SHA-256)的加密攻击。Merkle-Damgård构造是一种创建哈希函数的方法,其典型结构包括一个基本的压缩函数和一个填充方案,确保输入数据的长度是特定倍数。

哈希长度扩展攻击的原理基于以下几点:

  1. 可预见的填充: Merkle-Damgård实现使用一个预定义的方式来填充消息,以确保信息长度符合要求。通常填充以一个bit的'1'开始,然后是一串'0',最后是一个表示原始消息长度的64位(对于MD5和SHA-1)或128位(对于某些SHA-2函数)的二进制数。攻击者知道这个填充方案。

  2. 状态保持: 哈希函数在处理信息的时候,会将信息分成固定大小的块,然后通过压缩函数逐块处理。每块处理结束后,压缩函数的输出会成为下一块处理的输入(称为"链式状态"或"中间哈希值")。最终块处理完成后产生的输出便是整个消息的哈希值。

  3. 不需要初始状态: 在进行哈希计算时,攻击者并不需要知道原始消息的具体内容,只需知道原始消息哈希的中间状态或最终状态。         

  4.  哈哈哈,官方回答不是人话,这里简单来说就是:

  5. 想象一下,有一个秘密盒子(哈希函数),这个盒子可以把任何东西(数据)变成一堆乱码(哈希值),而且这个过程是单向的,就是说你不能从乱码再变回原来的东西。

    通常,当你把一些东西放进这个盒子时,如果想要让盒子正常工作,你需要在东西的后面放些填充物,比如棉花。这个填充过程是按照一定的规则来的,比如先放一点特别的棉花,再放一些普通的棉花,最后放一点标记原来东西大小的棉花。

    哈希长度扩展攻击就是有人发现了这个秘密:他们不需要知道你原来放进去的是什么,只要知道最后的乱码和你放进去东西的大小,他们就能在不打开盒子的情况下,在你的东西后面加上更多的东西和填充物,然后算出这个新组合的乱码。

    这样他们就能假装知道你最初放进去的东西,实际上他们只是在你的东西后面加了些自己的东西,然后算出了一个看起来合理的乱码。

    这种攻击之所以可行,是因为填充规则是公开的,而且这个秘密盒子在处理东西时有一些可以预测的特点。所以,如果别人知道你的乱码和你放进去东西的大小,他们就可能利用这些信息进行攻击。

  6. hashump的使用:在kali上下载就好

$ hashpump -h
HashPump [-h help] [-t test] [-s signature] [-d data] [-a additional] [-k keylength]HashPump生成字符串以利用易受哈希长度扩展攻击的签名。-h --help显示此消息。-t --test运行测试以验证每个算法是否正常运行。-s --signature来自已知消息的签名。-d --data来自已知消息的数据。-a --additional您要添加到已知消息的信息。-k --keylength 用于对原始消息进行签名的密钥的长度(以字节为单位)。
-s 是指知道的哈希值
-k 是进行签名的长度
-d 已知的数据
-a 添加上去的已知数据

接下来就可以直接得出flag,因为MD5是不可逆的,除非你已经知道了flag形式的MD5,还知道了flag的很多内容,只有几个字符不知道的那种(想想也知道不可能!)

接下来就可以直接拿到flag!

真心希望我的文章能够使各位读者有所收获!

相关文章:

hash长度扩展攻击

作为一个信息安全的人&#xff0c;打各个学校的CTF比赛是比较重要的&#xff01; 最近一个朋友发了道题目过来&#xff0c;发现有道题目比较有意思&#xff0c;这里跟大家分享下 这串代码的大致意思是&#xff1a; 这段代码首先引入了一个名为"flag.php"的文件&am…...

设计模式--命令模式

实验16&#xff1a;命令模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解命令模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用命令模式解决实际问题。 [实验任务]&#xff1a;多次撤销和重复的命令模式 某系…...

单例模式的七种写法

为什么使用单例&#xff1f; 避免重复创建对象,节省内存,方便管理;一般我们在工具类中频繁使用单例模式; 1.饿汉式(静态常量)-[可用] /*** 饿汉式(静态常量)*/ public class Singleton1 {private static final Singleton1 INSTANCE new Singleton1();private Singleton1(){}…...

ElasticSearch入门介绍和实战

目录 1.ElasticSearch简介 1.1 ElasticSearch&#xff08;简称ES&#xff09; 1.2 ElasticSearch与Lucene的关系 1.3 哪些公司在使用Elasticsearch 1.4 ES vs Solr比较 1.4.1 ES vs Solr 检索速度 2. Lucene全文检索框架 2.1 什么是全文检索 2.2 分词原理之倒排索引…...

【FPGA】分享一些FPGA视频图像处理相关的书籍

在做FPGA工程师的这些年&#xff0c;买过好多书&#xff0c;也看过好多书&#xff0c;分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…...

AUTOSAR从入门到精通-车载以太网(四)

目录 前言 原理 车载以太网发展历史 为何选择车载以太网...

MySQL报错:1054 - Unknown column ‘xx‘ in ‘field list的解决方法

我在操作MySQL遇到1054报错&#xff0c;报错内容&#xff1a;1054 - Unknown column Cindy in field list&#xff0c;下面演示解决方法&#xff0c;非常简单。 根据箭头指示&#xff0c;Cindy对应的应该是VARCHAR文本数字类型&#xff0c;字符串要用引号&#xff0c;所以解决方…...

【Android 13】使用Android Studio调试系统应用之Settings移植(四):40+个依赖子模块之ActionBarShadow

文章目录 一、篇头二、系列文章2.1 Android 13 系列文章2.2 Android 9 系列文章2.3 Android 11 系列文章三、子模块AS移植3.1 AS创建目标3.2 创建ActionBarShadow(1)使用VS Code打开org_settings/SettingsLib目录(2)ActionBarShadow的Manifest.xml(3)ActionBarShadow的An…...

nosql-redis整合测试

nosql-redis整合测试 1、创建项目并导入redis2、配置redis3、写测试类4、在redis中创建key5、访问80826、在集成测试中测试方法 1、创建项目并导入redis 2、配置redis 3、写测试类 4、在redis中创建key 5、访问8082 6、在集成测试中测试方法 package com.example.boot3.redis;…...

智能化中的控制与自动化中的控制不同

智能化中的控制相对于自动化中的控制更加灵活、智能、综合和学习能力强。智能化控制系统能够根据实际情况进行自主决策和优化&#xff0c;适用范围更广&#xff0c;效果更好。 首先&#xff0c;智能化控制系统能够根据外部环境的变化和实时数据的反馈来自主调整和优化控制策略&…...

java练习题之多态练习

1&#xff1a;关于多态描述错误的是(D) A. 父类型的引用指向不同的子类对象 B. 用引用调用方法&#xff0c;只能调用引用中声明的方法 C. 如果子类覆盖了父类中方法&#xff0c;则调用子类覆盖后的方法 D. 子类对象类型会随着引用类型的改变而改变 2&#xff1a;class Supe…...

[原创][R语言]股票分析实战[4]:周级别涨幅趋势的相关性

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…...

esp32使用lvgl,给图片取模显示图片

使用LVGL官方工具。 https://lvgl.io/tools/imageconverter 上传图片&#xff0c;如果想要透明效果&#xff0c;那么选择 输出格式C array&#xff0c;点击Convert进行转换。 下载.c文件放置到工程下使用即可。...

R语言使用scitb包10分钟快速绘制论文基线表

scitb包目前进行了升级到1.7版本了&#xff0c;我做了一个操作视频&#xff0c;如何快速绘制基线表。 scitb包绘制基线表 可以配套看下我的关于scitb包文章理解一下 scitb包1.6版本发布&#xff0c;一个为制作专业统计表格而生的R包...

类和对象

1 类定义&#xff1a; class ChecksumAccumulator {// class definition goes here } 你就能创建 ChecksumAccumulator 对象&#xff1a;new CheckSumAccumulator 注&#xff1a;1scala类中成员默认是public类型&#xff0c;若设为私有属性则必须加private关键字。在scala中是…...

Py之tensorflow-addons:tensorflow-addons的简介、安装、使用方法之详细攻略

Py之tensorflow-addons&#xff1a;tensorflow-addons的简介、安装、使用方法之详细攻略 目录 tensorflow-addons的简介 tensorflow-addons的安装 tensorflow-addons的使用方法 1、使用 TensorFlow Addons 中的功能&#xff1a; tensorflow-addons的简介 TensorFlow Addon…...

STM32G4x FLASH 读写配置结构体(LL库下使用)

主要工作就是把HAL的超时用LL库延时替代&#xff0c;保留了中断擦写模式、轮询等待擦写&#xff0c;我已经验证了部分。 笔者用的芯片为STM32G473CBT6 128KB Flash&#xff0c;开环环境为CUBEMXMDK5.32&#xff0c;因为G4已经没有标准库了&#xff0c;笔者还是习惯使用标准库的…...

【AI提示词人物篇】创新艺术未来,让科技改变想象空间

AI 绘画学习难度和练习技巧 学习绘画的技巧 学习能难度&#xff1a; 外貌特征&#xff1a;AI需要学习识别和理解各种外貌特征&#xff0c;如发型、肤色、眼睛颜色等。这可能需要大量的训练数据和复杂的模型架构。 镜头提示&#xff1a;AI需要学习理解不同镜头提示的含义&…...

登录shell与非登录shell、交互式与非交互式shell的知识点详细总结

一、登录shell与非登录shell 1.登录shell定义&#xff1a;指的是当用户登录系统时所取的那个shell&#xff0c;登录shell属于交互式shell。 登陆shell通常指的是&#xff1a;用户通过输入用户名/密码&#xff08;或证书认证&#xff09;后启动的shell.例如&#xff1a; 当时…...

【教学类-42-02】20231224 X-Y 之间加法题判断题2.0(按2:8比例抽取正确题和错误题)

作品展示&#xff1a; 0-5&#xff1a; 21题&#xff0c;正确21题&#xff0c;错误21题42题 。小于44格子&#xff0c;都写上&#xff0c;哪怕输入2:8&#xff0c;实际也是5:5 0-10 66题&#xff0c;正确66题&#xff0c;错误66题132题 大于44格子&#xff0c;正确66题抽取44*…...

轻量Http客户端工具VSCode和IDEA

文章目录 前言Visual Studio Code 的插件 REST Client编写第一个案例进阶&#xff0c;设置变量进阶&#xff0c;设置Token IntelliJ IDEA 的 HTTP请求构建http脚本HTTP的环境配置结果值暂存 前言 作为一个WEB工程师&#xff0c;在日常的使用过程中&#xff0c;HTTP请求是必不可…...

机器学习或深度学习的数据读取工作(大数据处理)

机器学习或深度学习的数据读取工作&#xff08;大数据处理&#xff09;主要是.split和re.findall和glob.glob运用。 读取文件的路径&#xff08;为了获得文件内容&#xff09;和提取文件路径中感兴趣的东西(标签) 1&#xff0c;“glob.glob”用于读取文件路径 2&#xff0c;“.…...

Rust 生命周期

Rust 第17节 生命周期 先看一段错误代码 /* //一段错误的代码 // Rust 编译时会报错&#xff1b; */let r;{let x 5;r &x;}println!("{}",r);Rust 在编译时使用 借用检查器&#xff0c; 比较作用域来检查所有的借用是否合法&#xff1b; 很明显&#xff1b;r…...

【论文解读】CNN-Based Fast HEVC Quantization Parameter Mode Decision

时间&#xff1a;2019 年 级别&#xff1a;SCI 机构&#xff1a;南京信息工程大学 摘要 随着多媒体呈现技术、图像采集技术和互联网行业的发展&#xff0c;远程通信的方式已经从以前的书信、音频转变为现在的音频/视频。和 视频在工作、学习和娱乐中的比例不断提高&#xff0…...

在Linux上安装CLion

本教程将指导你如何在Linux系统上安装CLion&#xff0c;下载地址为&#xff1a;https://download.jetbrains.com.cn/cpp/CLion-2022.3.3.tar.gz。以下是详细的安装步骤&#xff1a; 步骤1&#xff1a;下载CLion 首先&#xff0c;你需要使用wget命令从提供的URL下载CLion的tar…...

R语言贝叶斯网络模型、INLA下的贝叶斯回归、R语言现代贝叶斯统计学方法、R语言混合效应(多水平/层次/嵌套)模型

目录 ㈠ 基于R语言的贝叶斯网络模型的实践技术应用 ㈡ R语言贝叶斯方法在生态环境领域中的高阶技术应用 ㈢ 基于R语言贝叶斯进阶:INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析 ㈣ 基于R语言的现代贝叶斯统计学方法&#xff08;贝叶斯参数估…...

多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测

多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测 目录 多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多…...

Oracle 学习(1)

Oracle简介 Oracle是殷墟&#xff08;yīn Xu&#xff09;出土的甲骨文&#xff08;oracle bone inscriptions&#xff09;的英文翻译的第一个单词&#xff0c;在英语里是“神谕”的意思。Oracle公司成立于1977年&#xff0c;总部位于美国加州&#xff0c;是世界领先的信息管…...

华为HCIA认证H12-811题库新增

801、[单选题]178/832、在系统视图下键入什么命令可以切换到用户视图? A quit B souter C system-view D user-view 试题答案&#xff1a;A 试题解析&#xff1a;在系统视图下键入quit命令退出到用户视图。因此答案选A。 802、[单选题]“网络管理员在三层交换机上创建了V…...

Nginx Unit 1.27.0 发布

目录 介绍 更新内容 将 HTTP 请求重定向到 HTTPS 为纯路径 URI 提供可配置的文件名 完整的更新日志 其他 平台更新 介绍 Nginx Unit 是一个动态应用服务器&#xff0c;能够与 Nginx Plus 和 Nginx 开源版并行或独立运行。Nginx Unit 支持 RESTful JSON API&#xff0c;…...