哈希长度拓展攻击
md5数据填充原理
首先讲一下md5在数据填充上的原理
以位(Bit)为单位,字节序为小端字节。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中
1、数据填充
对消息进行数据填充,使消息的长度对512取模得448,设消息长度为X,即满足X mod 512=448。根据此公式得出需要填充的数据长度。(448,960.......)
填充方法:在消息后面进行填充,填充第一位为1,其余为0。
2、添加消息长度
在第一步结果之后再填充上原消息的长度,可用来进行的存储长度为64位。如果消息长度大于264,则只使用其低64位的值,即(消息长度 对 264取模)。
在此步骤进行完毕后,最终消息长度就是512的整数倍。
3.数据运算
对消息进行分组以及padding后,MD5算法开始依次对每组消息(填充好的消息按照64字节分组)进行压缩,经过64轮数学变换。
之后对消息的运算有兴趣可以自行了解。
四个初始化向量
A 01 23 45 67 0x67452301
B 89 AB CD EF 0xEFCDAB89
C FE DC BA 98 0x98BADCFE
D 76 54 32 10 0x10325476
最后一轮产生的链变量经过高低位互换(如:aabbccdd -> ddccbbaa)后就是我们计算出来的 md5 值。
哈希长度拓展攻击
当md5加密参数存在用户可控变量时
(md5(secret+args); args可控)
我们可以通过手动填充args部分,添加(控制)最后一组明文,并根据上一次加密的结果逆向再和库中固定的加密轮密钥来演算出我们新添加的一组明文的加密结果,进而推出最后的新密文。
简单地说就是用户可以用过控制args变量来来控制最后的加密结果md5(....)而不需要知道secret值。
一个例子
<?php
$secret = "aaaaabbbbbccccc";
$username="admin";
$password = $_POST["password"];
if($COOKIE["getmein"] === md5($secret . urldecode($username . $password))){
echo "Congratulations! You are a registered user.\n";
die ("The flag is ". $flag);
}else{
die("Your cookies don't match up! STOP HACKING THIS SITE.");
}
$secret长度为15,后面的$username长度为5,合在一起是20,就叫secret吧
我们现在有了md5(secret+"admin")的值,要求md5(secret+输入的password) === md5(secret+真的password),而password可以由我们自己POST传入,满足哈希扩展攻击条件。
签名(哈希值)是571580b26c65f306376d4f64e53cb5c7
hashpump
HashPump是一个借助于OpenSSL实现了针对多种散列函数的攻击的工具,支持针对MD5、CRC32、SHA1、SHA256和SHA512等长度扩展攻击。而MD2、SHA224和SHA384算法不受此攻击的影响,因其部分避免了对状态变量的输出,并不输出全部的状态变量。
安装
$ git clone https://github.com/bwall/HashPump.git
$ apt-get install g++ libssl-dev
$ cd HashPump
$ make
$ make install
使用hashpump
# hashpump
Input Signature: 571580b26c65f306376d4f64e53cb5c7
Input Data: admin
Input Key Length: 20
Input Data to Add: ginger
得到
6f6dbe54ea8977af775a484eb7b23eb1
admin\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\xc8\x00\x00\x00\x00\x00\x00\x00ginger
第一个是新的签名,把它设置到cookies的getmein里。
第二个先把\x替换为%后,post提交
就可以得到flag
参考
Everything you need to know about hash length extension attacks

浙公网安备 33010602011771号