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!

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

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

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

相关文章

NFC读卡------ci522

1、NFC及卡片 NFC是近距离无线通讯技术&#xff0c;是一种非接触式识别和互联技术&#xff0c;可以在移动设备、消费类电子产品、PC和智能控件工具间进行近距离无线通信。NFC提供了一种简单、触控式的解决方案&#xff0c;可以让消费者简单直观地交换信息、访问内容与服务。 …

Java内存区域与内存溢出异常

Java与C++之间有一堵由内存分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 2.1 概述 对于从事C、C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的“皇帝”,又是从事最基础工作的劳动人民——即拥有每一个对象的“所有权”,又…

用栈和队列分别实现求解迷宫问题(c++,c)

求解迷宫问题&#xff1a;给定一个迷宫要求输出其路径。 给出的迷宫如下&#xff08;可自行更改&#xff09; 可用两种方法实现1.栈2.队列 用栈只能找到路但路不是最简的最简的要用队列实现 用栈实现&#xff08;解析都在代码里了&#xff09; c&#xff08;实现&#xff0…

rhel7/centos7升级openssh到openssh9.5-p1

openssh9.3-p2以下版本有如下漏洞 在rhel7.4/7.5/7.6均做过测试。 本文需要用到的rpm包如下&#xff1a; https://download.csdn.net/download/kadwf123/88652359 升级步骤 1、升级前启动telnet ##升级前启动telnet服务 yum -y install telnet-server yum -y install xinetd…

四、UART_阻塞发送中断接收

1、开发环境 (1)Keil MDK: V5.38.0.0 (2)MCU: mm320163D7P 2、实验目的&原理图 2.1、实验目的 (1)上位机串口助手给MCU发送信息&#xff0c;MCU串口通过通过串口助手接收后&#xff0c;将接收到的内容通过串口助手发送到上位机。 (2)串口在whil循环中每隔1秒发送一次…

制作自己的 Docker 容器

软件开发最大的麻烦事之一&#xff0c;就是环境配置。用户必须保证操作系统的设置&#xff0c;各种库和组件的安装&#xff0c;只有它们都正确&#xff0c;软件才能运行。docker从根本上解决问题&#xff0c;软件安装的时候&#xff0c;把原始环境一模一样地复制过来。 以 koa-…

Python 序列之列表

系列文章目录 Python序列之元组 Python序列之列表 系列文章目录[TOC](Python序列之列表) 前言一、序列是什么&#xff1f;二、列表1.列表简介2.列表创建&#xff08;1&#xff09;[]创建&#xff08;2&#xff09;list创建&#xff08;3&#xff09;range()创建整数列表&#…

VS2010推荐字体设置

fixedsys excelsior是VS2010推荐字体。下载地址为 链接&#xff1a;https://pan.baidu.com/s/16OFbjBEF35zRfQe04Jfuag 提取码&#xff1a;wzjj下载成功后将ttf文件复制粘贴到C盘Windows中的font文件夹中自动安装指定字体&#xff0c;此时就可以在VS2010的工具&#xff0c;选…

多维时序 | MATLAB实CNN-Mutilhead-Attention卷积神经网络融合多头注意力机制多变量时间序列预测

多维时序 | MATLAB实CNN-Mutilhead-Attention卷积神经网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实CNN-Mutilhead-Attention卷积神经网络融合多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | …

下定决心了,从字节跳动离职

今天在脉脉上看到这么一条内容&#xff1a; 看完感触很深&#xff0c;想起了我在帝都上班的那几年时光。 我记得我去帝都上班的时候&#xff0c;第一次坐帝都的地铁&#xff0c;那时候是找工作面试&#xff0c;在地铁里第一次感受到了大城市的上班速度&#xff0c;每个人都急匆…

龙芯杯个人赛串口——做一个 UART串口——RS-232

文章目录 Async transmitterAsync receiver1. RS-232 串行接口的工作原理DB-9 connectorAsynchronous communicationHow fast can we send data? 2.波特率时钟生成器Parameterized FPGA baud generator 3.RS-232 transmitter数据序列化完整代码&#xff1a; 4.RS-232 receiver…

Dijkstra(迪杰斯特拉)算法总结

知识概览 Dijkstra算法适用于解决所有边权都是正数的最短路问题。Dijkstra算法分为朴素的Dijkstra算法和堆优化版的Dijkstra算法。朴素的Dijkstra算法时间复杂度为&#xff0c;适用于稠密图。堆优化版的Dijkstra算法时间复杂度为&#xff0c;适用于稀疏图。稠密图的边数m和是一…

tensorboard可视化——No dashboards are active for the current data set.

No dashboards are active for the current data set. 出现问题的原因是事件的路径未用绝对路径&#xff0c;tensorboard --logdir./runs --port6007 改为tensorboard --logdirD:\Code\Python\Study\CL\hat-master\hat-master\run s\one --port6007就好了

浅谈Dubbo核心概念及架构流程

浅谈Dubbo核心概念及架构流程 前言重要概念1、SPI2、ServiceBean3、URL4、Invoker 整体流程1、架构图2、调用链路 笔者碎碎言&#xff0c;我们学习Dubbo应该学的是什么&#xff1f; 笔者是一名业务开发&#xff0c;认为一切目的都要为我们的目标服务&#xff0c;即日常工作有帮…

Android 13 - Media框架(26)- OMXNodeInstance(三)

上一节我们了解了OMXNodeInstance中的端口定义&#xff0c;这一节我们一起来学习ACodec、OMXNode、OMX 组件使用的 buffer 到底是怎么分配出来的&#xff0c;以及如何关联起来的。&#xff08;我们只会去了解 graphic buffer的创建、input bytebuffer的创建、secure buffer的创…

20231223使用Rockchip原厂的Android11调通Firefly的AIO-3399J开发板上的AP6356S

20231223使用Rockchip原厂的Android11调通Firefly的AIO-3399J开发板上的AP6356S 2023/12/23 14:14 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2…

[Angular] 笔记 8:list/detail 页面以及@Input

1. list 页面 list/detail 是重要的 UI 设计模式。 vscode terminal 运行如下命令生成 detail 组件&#xff1a; PS D:\Angular\my-app> ng generate component pokemon-base/pokemon-detail --modulepokemon-base/pokemon-base.module.ts CREATE src/app/pokemon-base/p…

SQL进阶:子查询

一般情况下,我们都是直接对表进行查询,但有时候,想要的数据可能通过一次select 获取不到,需要嵌套select,这样就形成了子查询。 子查询可以位于查询语句的任意位置,主要的注意点在于用于不同的位置,和不同的关键字一起使用时,需要注意返回的列的数量和行的数量。 位于…

大一C语言查缺补漏 12.24

遗留问题&#xff1a; 6-1 1 在C语言中&#xff0c;如果要保留小数的话&#xff0c;一定要除以2.0&#xff0c;而不是2。 设整型变量m,n,a,b的值均为1&#xff0c;执行表达式&#xff08;m a>b&#xff09;||(n a<b)后&#xff0c;表达式的值以及变量m和n的值是&#…

redis怎么查看bigkey

通过docker-compose启动一个redis服务器 docker-compose.yml文件的内容如下&#xff1a; version: 3 services:redis:image: redisports:- 6379:6379docker-compose up -d 启动redis容器 在服务器上安装redis-cli工具 这里我是ubuntu服务器&#xff0c;centos用yum代替apt安…