hash长度扩展攻击

哈希(hash)长度扩展攻击

看了网上许多哈希长度扩展攻击的文章,我比较笨,所以看了一个晚上,结合网上好多篇文章最终才看懂。于是,在这里做一个关于哈希长度扩展攻击的总结。

MD5算法

首先先放一张md5算法加密的过程图。
hash长度扩展攻击
补位

展开哈希扩展攻击的关键 !!!
在md5算法中,首先对数据进行首先需要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N*512+448,N为一个非负整数,N可以是零。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。

计算

经过这两步的处理,信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。每次的运算都由前一轮的128位结果值和第i块512bit值进行运算。初始的128位值为初试链接变量,由第一次获得的哈希值挨个字节逆序填入。
算法的具体细节不在此一一赘述。

MD5算法机制的利用

这里用江科大2020新生赛的某道题来举例

hash长度扩展攻击

我们已知$this->sess=md5($this->token.$this->username),所以$sess为20个未知字符与‘admin’组成的字符串的md5值。这里先用?来代替未知字符。查看初始cookie可知的md5值为``。这道题目,或者说这种题目的关键就是充分利用已知的md5值。

``username=``_COOKIE[‘username’];
``sess=``_COOKIE[‘session’];

由上面两行代码可知username`与sess通过修改cookie来赋值。因为```this->token为未知量,所以我们即使修改了```username的值,也无法获得与之对应的md5值。所以这里我们就需要利用md5算法分组运算的机制。‘????????????????????admin’`的md5值既然是已知的,那我们就把它作为第一段(512bit)的加密内容,这样我们就可以以它的md5值来求得用于第二段加密运算的初始序列。然后我们会发现要是能把字符串扩展到512bit以上,并保证第一段的md5算法运算结果不改变,那么我们在不知道第一段的加密内容的情况下仍然能够求得整体的md5值。

所以我们首先要做的就是模仿md5算法的补位方式来进行补位。这里以16进制来举例

根据最开始的算法图,在加密内容的后方加100000直到448位,剩下64位储存数据长度信息。即16进制中在数据后方加%80%00%00直到剩下最后8个字节表示长度及上图中的%C8%00%00%00%00%00%00%00。至此,第一段内容补位完成,第一段加密后的md5即为初始的$sess的值。然后将ae8b63d93b14eadd1adb347c9e26595a分成8字节唯一组的四组,ae8b63d9,3b14eadd,1adb347c,9e26595a。然后对他们进行小段排序,得到第二段的初始序列。

A=0xd9638bae
B=0xddea143b
C=0x7c34db1a
D=0x5a59269e

之后在字符串上加上第二段的内容,内容随意。

????????????????????admin%80%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

将我们求出来的ABCD序列作为初始序列,对Hacker这个字符串进行md5加密。
得到md5值:

bdbe1c6fb9d921e4ba3d9d4072b702f7

修改cookie:

username=admin%80%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%00%00Hacker
session=bdbe1c6fb9d921e4ba3d9d4072b702f7

complated。

上一篇:【Java-6】多线程-3


下一篇:《深入理解Java虚拟机》学习笔记(二)