Hash Length Extension Attacks

catalogue

1. Hash函数的内部原理
2. 漏洞原理

 

1. Hash函数的内部原理

0x1: 分组、Padding

哈希函数以区块为单位操作数据。比如说,MD5, SHA1, SHA256的区块长度是512 bits 。大多数message的长度不会刚好可以被哈希函数的区块长度整除。这样一来,message就必须被填充(padding)至区块长度的整数倍

以MD5为例,首先算法将消息以512-bit(就是64字节)的长度分组。最后一组必然不足512-bit,这时候算法就会自动往最后一组中填充字节,这个过程被称为padding

xxxxxxxxxxxreport.pdf\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xA8

在本例所用的SHA1算法中,哈希值由五组整数构成。一般我们看到的形式是把这五个整数转换为16进制然后连接到一起。运行算法时,初始值(又叫registers)被设置为这组数

1. 67452301
2. EFCDAB89
3. 98BADCFE
4. 10325476
5. C3D2E1F0

紧接着,填充message,再将其分割为512bits的区块。算法轮流操作每个区块,进行一系列的计算并更新registers的值。一旦完成了这些运算,registers里的值就是最终的哈希值

Relevant Link:

 

2. 漏洞原理

MD5 Length扩展Padding攻击的目的是在不知道原始md5(secrect)的secrect的前提下,直接得到md5(secrect || padding || m')的新MD5 HASH

1. 类型MD5这种本来就是要对message进行分组,并逐个遍历所有分组,进行轮询运算的,所以HASH算法的运算次数是随着message的增加而线性增加的
2. 而Padding一段全零的数据对原始message的HASH计算结果是没有影响的(Padding到一个分组的整数倍)
3. 对MD5 HASH来说,是以轮为基本单位的,每一轮计算都会得到一组"中间值",分别保存在一组寄存器(register)中,因此从本质上看,即使是MD5(secrect)得到的最终结果,我们也可以将它看成是一个"中间态计算结果"
4. 跟在padding后面的'm,相当于对原始message增加一轮HASH轮运算

在这里m' 是任意数据, || 是连接符,可以为空。padding是 secret 最后的填充字节。md5的padding字节包含整个消息的长度,因此,为了能够准确的计算出padding的值,secret的长度也是我们需要知道的

所以要实施Length Extension Attack,就需要找到MD5(secret)最后压缩计算得到的值,并根据secrect的长度算出当前分组剩下需要填充的padding,然后在padding后面加上我们想要extend的内容,加入到下一轮的MD5压缩算法中去,算出最终我们需要的值

0x1: 漏洞利用场景

1. 通过某种方式,我们已知MD5(secret)的值
2. 在另一个输入点需要验证MD5(secret+other1+other2)的值
3. 我们不需要知道secret的值,就可以直接通过已经获取的MD5(secret)得到MD5(secret+other1+other2)的值

Relevant Link:

http://www.freebuf.com/articles/web/31756.html
http://netifera.com/research/flickr_api_signature_forgery.pdf
http://www.2cto.com/Article/201109/105056.html

 

Copyright (c) 2016 LittleHann All rights reserved

 

你可能感兴趣的:(Hash Length Extension Attacks)