长度延展攻击
长度延展攻击
长度延展攻击介绍
定义:长度延展攻击(Length Extension Attack)是一种利用哈希函数的漏洞进行的攻击,可以通过已知消耗部分的消息中继续拼接新的消息并生成另一个哈希的方法来伪造一个被认为是可信的哈希,并且不需要访问或了解原始签名密钥。
实现过程:
长度延展攻击的具体实现根据使用的哈希函数和攻击场景而不同,这里以MD5哈希函数为例进行说明。
MD5是一种广泛使用的哈希函数,其输入数据块大小为512位,并且支持可变长度的输入消息。利用长度延展攻击,攻击者可以在已知哈希值和消息内容的情况下,实现根据哈希值生成任意恶意消息。下面是一个针对MD5哈希函数的长度延展攻击的具体实现步骤。
- 攻击者拥有已知的哈希值和部分明文消息段。
- 攻击者使用已知的哈希值作为起点,计算哈希函数的内部状态。由于MD5哈希函数的内部状态是对每个512位数据块的压缩,因此攻击者需要对部分已知消息段进行填充,使其长度与512位数据块大小对齐,以重建MD5状态。
- 整个消息包括任意长度的填充字节和恶意数据。这些数据包括原始消息的余量和额外的恶意数据。攻击者构造这个新消息,在原始消息之后追加恶意数据,同时确保新消息的长度满足对齐条件。
- 通过向填充消息中追加伪造的数据块,攻击者可以计算在原始哈希值之后追加恶意数据的新哈希值。
- 攻击者使用新的哈希值,以及额外的消息作为有效贡献,实现对接收者的误导和攻击。
下面通过一个具体的例子,来说明MD5哈希函数的长度延展攻击的过程:
- 假设原始消息为:"hello world"(11字节),哈希值为:"5eb63bbbe01eeed093cb22bb8f5acdc3"
- 首先,攻击者使用该哈希值作为起点并计算出MD5的状态。
- 接下来,攻击者构造一个新的消息,并向其添加恶意数据。假设添加的数据为:" is vulnerable to length extension attack."
- 为了对齐新的消息,攻击者向消息中添加字节,直到它的长度满足512位数据块大小的要求。
- 攻击者使用填充后的消息数据、哈希函数状态以及恶意数据作为输入,计算新的MD5哈希值。在这种情况下,攻击者追加的数据恰好符合哈希函数的输入标准,直接计算即可。
- 攻击者使用新生成的哈希值和恶意数据来欺骗接收者,使锅炉内的后续操作受到影响。
结论:
在上述过程中,攻击者利用了MD5哈希算法的计算逻辑,并且利用其自身处理数据的方式进行欺骗。实际上,关于长度延展攻击的攻击路径是因具体的哈希函数而异,并且实际操作中也需要攻击者根据具体实现方式进行调整。然而,以上的例子说明了MD5哈希算法的漏洞,并展示了可以利用这些漏洞进行可利用的攻击的基本操作过程。
长度延展攻击的ctf试题案例
案例解析
在MD5中,首先算法将消息以512-bit(64bytes)的长度分为了n组。而最后一组必然不足512-bit,这时候算法就会自动往最后一组中填充字节,这个过程被称为Padding。Padding的规则是,在最末一个字节之后补充0x80,其余的部分填充为0x00,而Padding最后的8字节用来表示需要哈希的消息长度。
看上图,我们可以依次分析出以下内容:
第一步:提取信息
首先,明文长度为 \(secret.urldecode("admin"."admin"),前面给出\)secret的长度为15位,也就是该脚本会下发给浏览器一个cookie,字段名为“sample-hash”,值为该明文的md5加密571580b26c65f306376d4f64e53cb5c7。
那么我们可知,flag获取的要求是:传进一个cookie,字段名为“getmein”,使其值等于\(secret.urldecode(\)username. \(password)。MD5加密后的结果且\)password不能为admin。
第二步:进行攻击payload构造填充
按照源码的提示,跟上字符串“adminadmin”,在之前的15个未知位先空出
对其进行字节填充,在末尾加入0x80,0x00,最后的8个字节为哈希的长度15+10=25,16进制为0xC8
使用MD5算法开始依次对每组消息进行压缩,在这过程中会有标准里定义死的的初始化向量,为4个中间值
第三步:长度延展攻击
将原哈希值(571580b26c65f306376d4f64e53cb5c7)拆为四组小端规则反序值如下:
- 0xb2801557
- 0x06f3656c
- 0x644f6d37
- 0xc7b53ce5
参考第二部中填充好的加密运算字符串,向补位后的消息再追加一条消息字符串“Hacker”对这个新字符串进行补位,再利用上一个运算算出的值作为初始向量进行函数运算,最终得到的MD5值为6df6547d222c30afcb9fd3809dc04c13
此时我们可以根据源码直接构造完毕payload如下
\(username="admin",\)password="admin%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%c8%00%00%00%00%00%00%00Hacker",