Loading

哈希长度扩展攻击

说实话,哈希长度拓展攻击的原理初学者需要下点功夫理解

md5长度拓展攻击

这也是学校入门赛的一道题目,然后才去了解了一下哈希长度拓展攻击,因为拓展攻击适用情况,所以最常见md5,sha1加密
学校的这道题目是关于md5的,而能够实现这种攻击是需要前提条件的
hash=md5(密文)-->forge_hash=(密文+可利用信息)
知道密文MD5和长度

md5算法

对一个字符串md5,首先要进行补位,即他要满足len(字符串二进制) % 512 == 448,或者说是他二进制长度为512的倍数减64
然后要进行补长度,就是他自身长度字节转到bit再转到16进制+若干000直到补长度达到64位
这个时候就能512位进行分组,计算过程是512位进行一次运算,也就是如果消息长度小于512就只需要计算一次,大于512小于1024是计算两次,以此类推。
计算消息摘要必须用补位已经补长度完成之后的消息来进行运算,具体过程,很复杂。。。。下面是重点!
经过一次消息摘要后,上面的链变量将会被新的值覆盖,而最后一轮产生的链变量经过高低位互换(如:123456-> 654321)后就是我们计算出来的md5值

对md5实现过程

下面是这道题目的主要代码

if(stripos($role,"admin")!==false&&$hsh===md5($salt.$_COOKIE["role"])
$hsh=$_COOKIE["hsh"];$role=$_COOKIE["role"];
{if(isset($_COOKIE["role"]))
$salt="xxxxxxxxxxxxx";//len:13
$role="guest";
$auth=false;

hash

看到代码我们可以知道三点,role,secret长度(密文长度),hash
接下来我们进行哈希长度扩展攻击
首先我们可以按照md5算法来手工完成,就是补位->补长度->计算他的链变量(网上有计算代码)->高低位互换

PS:不大于512,计算一次,大于512位,先补全为1024位,类推

另一种方法是使用工具,,,我还是喜欢这一种!。。。。Hashpump

linux下的安装:

	git clone https://github.com/bwall/HashPump
	apt-get install g++ libssl-dev
	cd HashPump
	make
	make install

然后在linux执行hashpump -s c70ab9d039f166c5b5f506a5698ebaa1 -d guest -k 13 -a admin

Hashpump

然后把hash放到hsh,role取下面那一串串,你就绕过变成了admin。

sha1长度拓展攻击

sha1算法

引用freebuf的一段话:

首先,当hash函数拿到需要被hash的字符串后,先将其字节长度整除64,取得余数。如果该余数正好等于56,那么就在该字符串最后添加上8个字节的长度描述符(具体用bit表示)

如果不等于56,就先对字符串进行长度填充,填充时第一个字节为hex(80),其他字节均用hex(00)填充

填充至余数为56后,同样增加8个字节的长度描述符(该长度描述符为需要被hash的字符串的长度,不是填充之后整个字符串的长度)。以上过程,称之为补位。

说白了其实这个sha1和md5是类似的,只是稍有不同!(len(字符串二进制) % 64 == 56)

结尾

这个过程理解起来,感觉的确是一时间可能不能完全理解,不过明白之后可能感觉也很简单了
不过,至于我,还是没完全理解,似懂非懂吧。

posted @ 2017-05-12 22:08  bay1  阅读(387)  评论(0编辑  收藏  举报