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!

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

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

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

相关文章

repo介绍(二)

这篇文章来实例操作 安装repo&#xff0c;参考repo介绍这一节创建repo存放default.xml 的git仓库 初始化repo&#xff0c;repo init -u https://gitee.com/angerial/repo-test.git 这个时候会在当前目录生成如下文件 参考repo组成&#xff0c;修改.repo/manifest.xml,这里我的…

springmvc环境搭建以及常见问题解决

1.新建maven工程 a) 打开eclipse&#xff0c;file->new->project->Maven->Maven Project b) 下一步 c) 选择创建的工程为webapp&#xff0c;下一步 d) 填写项目的group id和artifact id。一般情况下&#xff0c;group id写域名的倒序&#xff0c;artifact id…

eclipse build workspace太慢或者 js出错问题解决

1.js文件错误解决办法 右键项目->properties->Builders(注&#xff1a;JavaScript Validator也会引起 build workspace太慢) 2.Eclipse 一直不停 building workspace完美解决总结&#xff08;来自: http://blog.163.com/shadow_wolf/blog/static/18346909720145279519222…

springmvc+jpa实现分页的两种方式

1.工具类 public final class QueryTool {public static PageRequest buildPageRequest(int pageNumber, int pageSize, String sortType){Sort sort null;if("auto".equals(sortType)) {sort new Sort(Direction.DESC, "ctime");} else {sort new Sort…

不使用session,借助redis实现验证码

1.首先看一下基本的流程 2.看一下代码 注&#xff1a;其中用到的一些工具类&#xff0c;可以到我的github上去下载 https://github.com/hjzgg/usually_util/tree/master/utils windows 下的 redis下载 https://github.com/hjzgg/redis 获取验证码的tooken RequestMapping(value…

PS批处理的使用

一、 前言 做开发的时候&#xff0c;最多的时候就是图片的使用了。有时候图片的处理都按照同样的步骤&#xff0c;比如说统一将图片的大小调整为固定大小&#xff0c;或者统一在所有的图片的的某个位置上加入文字或者小图片等等&#xff0c;这时候PS的批处理可以帮你完成这些重…

exe4j的使用

下载&#xff1a;http://download.cnet.com/exe4j/3000-2070_4-144405.html 参考&#xff1a;http://blog.chinaunix.net/uid-25749806-id-4380850.html 注&#xff1a;打包成jar包的一般就是src目录&#xff0c;其他目录放到目标文件夹中&#xff0c;目录结构如下 如何解决exe…

android表白app

一、前言 马上就要520和521了&#xff0c;是不是还有像我一样的单身狗啊。我就知道有&#xff0c;所以这两天简单写了这个小程序&#xff08;其实是替别人写的&#xff09;&#xff0c;虽然我并不会用去骗女孩子&#xff08;因为最近太忙了&#xff0c;实习完之后要搞毕设&…

webpack+react+es6开发模式

一、前言 实习了两个月&#xff0c;把在公司用到的前端开发模式做个简单的整理。公司里前端开发模式webpackreactreduxes6&#xff0c;这里去掉了redux。 webpack, react, redux等学习网址&#xff1a;http://www.cnblogs.com/hujunzheng/p/5405780.html 二、简单的步骤条组件 …

git命令分类图

转载于:https://www.cnblogs.com/hujunzheng/p/5560826.html

数据结构算法模拟系统

一、前言 学习数据结构已经有很长时间了&#xff0c;加上之前搞过一段时间的ACM&#xff0c;虽然搞得并不怎么样吧&#xff0c;但是喜欢的东西不能放弃&#xff0c;一直打算写一个算法模拟系统&#xff0c;对常用的一些算法进行简单的模拟&#xff0c;于是我的毕业设计就这样诞…

推荐几款jquery图片切换插件

一、前言 毕业季到了&#xff0c;大家都在匆匆忙忙的记录大学里最美好的时光&#xff0c;照片中各种花式、各种姿势都涌现出来了。这么多的照片怎么展示出来给自己的好友看呢&#xff1f;有人选择做成视频&#xff0c;有人选择ps之后做成图片集&#xff0c;而我选择利用静态网页…

c语言表白

马上就要520了&#xff0c;不少小伙伴们一定开始想尽各种办法进行表白了…那么身为奔跑在程序员道路上的我们也一定要有独特的表白方法&#xff01; 下面是一段表白代码&#xff0c;请直接搬去用吧&#xff01;&#xff01;&#xff01; #include <stdio.h> void change…

python表白

马上就要520了&#xff0c;不少小伙伴们一定开始想尽各种办法进行表白了…那么身为奔跑在程序员道路上的我们也一定要有独特的表白方法&#xff01; 下面是一段表白代码&#xff0c;请直接搬去用吧&#xff01;&#xff01;&#xff01; import turtle import timedef hart_ar…

git revert和reset区别

1.在github上建立测试项目并克隆到本地 2.本地中新建两个文本文件 3.将a.txt commit并push到远程仓库 执行 git add a.txt, git commit -m "a.txt", git push 4.将b.txt提交到本地仓库&#xff0c;不执行push 通过gitk命令查看提交历史如下&#xff1a; 情景&#xf…

sorl6.0+jetty+mysql搭建solr服务

1.下载solr 官网&#xff1a;http://lucene.apache.org/solr/ 2.目录结构如下 3.启动solr&#xff08;默认使用jetty部署&#xff09; 在path路径下将 bin文件夹对应的目录加入&#xff0c;然后输入 solr start&#xff08;或者 solr start -p port&#xff0c;指定端口启动&am…

Maven中安装本地Jar包到仓库中或将本地jar包上传

摘要 maven install 本地jar命令格式 mvn install:install-file -DgroupId<group_name> -DartifactId<artifact_name> -Dversion<version_no> -Dfile<path_of_the_local_jar> -Dpackagingjar -DgeneratePomtrue 示例 mvn install:install-file -Dgroup…

二维码登录原理及生成与解析

一、前言 这几天在研究二维码的扫码登录。初来乍到&#xff0c;还有好多东西不懂。在网上看到有人写了一些通过QRCode或者Zxing实现二维码的生成和解码。一时兴起&#xff0c;决定自己亲手试一试。本人是通过QRCode实现的&#xff0c;下面具体的说一下。 二、二维码原理 基础知…

knockout+echarts实现图表展示

一、需要学习的知识 knockout, require, director, echarts, jquery。简单的入一下门&#xff0c;网上的资料很多&#xff0c;最直接就是进官网校习。 二、效果展示 三、require的配置 require.config.js中可以配置我们的自定义模块的加载。 require.config({baseUrl: ".&…

React中使用Ant Table组件

一、Ant Design of React http://ant.design/docs/react/introduce 二、建立webpack工程 webpackreact demo下载 项目的启动&#xff0c;参考 三、简单配置 1.工程下载下来之后&#xff0c;在src目录下新建目录“table”&#xff0c;新建app.js&#xff0c;内容如下。 import R…