哈希(hash)长度扩展攻击
看了网上许多哈希长度扩展攻击的文章,我比较笨,所以看了一个晚上,结合网上好多篇文章最终才看懂。于是,在这里做一个关于哈希长度扩展攻击的总结。
MD5算法
首先先放一张md5算法加密的过程图。
补位
展开哈希扩展攻击的关键 !!!
在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新生赛的某道题来举例
我们已知$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。