广州天河建站公司,互联网营销师报考费用,网页制作图片切换,设计有特色的网站作为一个信息安全的人#xff0c;打各个学校的CTF比赛是比较重要的#xff01;
最近一个朋友发了道题目过来#xff0c;发现有道题目比较有意思#xff0c;这里跟大家分享下
这串代码的大致意思是#xff1a;
这段代码首先引入了一个名为flag.php的文件打各个学校的CTF比赛是比较重要的
最近一个朋友发了道题目过来发现有道题目比较有意思这里跟大家分享下
这串代码的大致意思是
这段代码首先引入了一个名为flag.php的文件该文件可能包含一个标志flag。然后使用highlight_file(__FILE__)函数来高亮显示当前文件的源代码。
接下来获取了两个变量$guet和$sec。其中$guet是从GET请求中获取的参数默认值为123456而$sec则是从COOKIE中获取的参数默认值也为123456。
代码中有一段正则表达式/^2023(.*?)GUETSEC$/用于检查$guet是否以2023开头以GUETSEC结尾并且在开头和结尾之间可以包含任意字符。如果满足这个条件那么会进行以下判断
如果$guet的MD5哈希值等于a26f719b36e667992b03a298ad18b1c7则输出$flag的MD5哈希值。如果$guet的整数值等于反转后的$guet的整数值则输出$flag的长度。
接下来如果$guet不为空那么会进行以下判断
如果$sec的MD5哈希值等于$flag与$guet拼接后的MD5哈希值那么输出$flag的值。
最后如果$guet为空则输出Oh no! You cant 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构造是一种创建哈希函数的方法其典型结构包括一个基本的压缩函数和一个填充方案确保输入数据的长度是特定倍数。
哈希长度扩展攻击的原理基于以下几点 可预见的填充 Merkle-Damgård实现使用一个预定义的方式来填充消息以确保信息长度符合要求。通常填充以一个bit的1开始然后是一串0最后是一个表示原始消息长度的64位对于MD5和SHA-1或128位对于某些SHA-2函数的二进制数。攻击者知道这个填充方案。 状态保持 哈希函数在处理信息的时候会将信息分成固定大小的块然后通过压缩函数逐块处理。每块处理结束后压缩函数的输出会成为下一块处理的输入称为链式状态或中间哈希值。最终块处理完成后产生的输出便是整个消息的哈希值。 不需要初始状态 在进行哈希计算时攻击者并不需要知道原始消息的具体内容只需知道原始消息哈希的中间状态或最终状态。 哈哈哈官方回答不是人话这里简单来说就是 想象一下有一个秘密盒子哈希函数这个盒子可以把任何东西数据变成一堆乱码哈希值而且这个过程是单向的就是说你不能从乱码再变回原来的东西。 通常当你把一些东西放进这个盒子时如果想要让盒子正常工作你需要在东西的后面放些填充物比如棉花。这个填充过程是按照一定的规则来的比如先放一点特别的棉花再放一些普通的棉花最后放一点标记原来东西大小的棉花。 哈希长度扩展攻击就是有人发现了这个秘密他们不需要知道你原来放进去的是什么只要知道最后的乱码和你放进去东西的大小他们就能在不打开盒子的情况下在你的东西后面加上更多的东西和填充物然后算出这个新组合的乱码。 这样他们就能假装知道你最初放进去的东西实际上他们只是在你的东西后面加了些自己的东西然后算出了一个看起来合理的乱码。 这种攻击之所以可行是因为填充规则是公开的而且这个秘密盒子在处理东西时有一些可以预测的特点。所以如果别人知道你的乱码和你放进去东西的大小他们就可能利用这些信息进行攻击。 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
真心希望我的文章能够使各位读者有所收获