实验室的同学给我发了一道题哈希拓展攻击的CTF题,对这个知识点接触的也比较少,因此根据这道CTF题来了解了解哈希长度拓展攻击,借此扩大下自己的知识面。
解题过程
地址: http://cxc.design/53a5734d6c99f89a/
打开后显示:老规矩看下网页源代码:
简单分析下题目,用POST请求传一个参数lover,再设置cookie等于md5($adore. urldecode($now) 并且传入的参数不能为 syclover。
安装 HashPump
1
2
3
4
5
6
7
8
9①kali下输入:
git clone https://github.com/bwall/HashPump
apt-get install g++ libssl-dev
cd HashPump
make
make install
②python下安装:
pip install hashpumpy
此方法需要已经安装libssl-dev根据题目密文为15位,数据是syclover,所以我们直接用HashPump工具跑一下
记得转码,题目要求urldecode,所以\x应该转为%
Burpsuit抓包改包拿到flag
哈希长度拓展攻击
哈希简介
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
攻击原理
0x01
首先了解下Message Authentication codes (MACs) ,翻译过来叫消息验证码,用于服务器验证信息的真实性。对于MACs算法,服务器首先把密文和消息连接在一起,然后用消息摘要算法取摘要。
MD4、MD5、RIPEMD-160、SHA-0、SHA-1、SHA-256、SHA-512、WHIRLPOOL等摘要算法受此攻击,但MD2、SHA-224和SHA-384不受此攻击。
容易受到哈希长度拓展攻击的摘要算法都有一个共同点,那就是它们都基于Merkle–Damgård结构。对于这个算法来说有一个很有意思的点。当我们知道了消息和密文的哈希值(如上题中cookie中已经给出),只要再知道密文的长度(上题中同样给出,长度为15位。)我们就能在消息后面添加信息再经过填充来计算出相应的哈希值,而这个哈希值是可以被服务器所接受的。原因是因为我们是根据服务器所给出的初始值进行计算,就相当于服务器算到了一半,而我们接着算了下去。
当知道hash(secret + message)的值及secret长度的情况下,可以轻松推算出hash(secret + message||padding||m’)。在这里m’是任意数据,||是连接符,可以为空,padding是secret后的填充字节。hash的padding字节包含整个消息的长度,因此,为了能准确计算出padding的值,secret的长度我们也是需要知道的。
哈希长度拓展攻击简单来说就是:当我们知道了密文的哈希值,知道了密文的长度,在不知道密文的情况下我们也可以构造出密文与构造消息的哈希值,而这一串哈希值可以通过服务器的验证。
由上,哈希长度拓展攻击条件:
- 攻击者可以提交数据及哈希值
- 攻击者知道密文的哈希
- 攻击者知道密文的长度
0x02
我们再来看看MD5算法的加密流程,其实和之前写过的AES加密算法差不多。
- 将数据进行分组,长度不够则进行填充。消息长度 mod 512 = 448bit也就是必须填充与AES分组类似
- 填充信息的第一个字节用0x80,剩余数据用0x00。数据采用小段储存方式
- 全部分好后组后进行函数运算。这里也与AES加密算法一样,前一个分组的加密结果作为后一个的向量输入。
由上,我们很好理解到,即使是我们不知道密文是什么,但是同样我们可以构造出初始密文+填充+构造密文的MD5值发送给服务器验证。(原有密文里面已经含有了服务器所需要的密钥。)
参考链接
https://www.cnblogs.com/pcat/p/5478509.html?tdsourcetag=s_pctim_aiomsg