[php代码审计] 哈希长度拓展攻击

已知:

1、 salt的长度。

2、 message==“adminadmin”。

3、 MD5(salt+message)的值。

求:      

MD5(salt+message+填充数据+任意字符串)的值。

解:

 设salt = “1234567890abcdef”;则salt+message==“1234567890abcdefadminadmin”;如下图:

 

字符串“1234567890abcdefadminadmin”的总共26字节( 26字节 * 8bit/字节 = 208bit)。26%64!=56,则进行补位,第一步补到长度为56字节。hex(80)加若干hex(00)直到56字节长度。如图:

 

然后在其后添加8个字节的长度描述符(原始字符串的位长度)。26字节 * 8bit/字节=208bit=0xd0。如图:

 

 

 

MD5计算时,将补位后的数据进行分组,每组64字节。然后使用初始registers值和第一个分组作为输入,进行“复杂的数学变换”,生成registers,如果只有一组,那么组产生的registers稍微变换就是该字符串最终的哈希值。否则第一组产生的resigters会加入到下一分组的计算,直至分组全部计算完成,最终产生的registers稍微变换就是该字符串最终的哈希值。

我们知道了MD5(salt+message)的哈希值就能推出在计算(salt+message)的哈希时最终产生的registers,那么MD5(salt+message+填充数据+任意数据)会进行如下操作:

分组一:salt+message+填充数据。

分组一的registers我们已知(因为该分组的哈希值已知)。

分组二:任意数据+填充数据二。

该分组计算时的registers和分组数据(任意数据+填充数据二)都是已知的,那么我们就能计算出该分组的哈希值(也就是“salt+message+填充数据+任意数据“的哈希值)。

posted @ 2017-07-28 11:34  S3c0ldW4ng  阅读(253)  评论(0编辑  收藏  举报