博客园 首页 私信博主 显示目录 隐藏目录 管理
Live2D

密码学之hash长度扩展攻击

哈希和加密的区别

哈希(Hash)与加密(Encrypt)两者是完全同的概念,正确区别两者是正确选择和使用哈希与加密的基础

哈希与加密最大的不同在于:

哈希将目标转化成具有相同长度的、不可逆的杂凑字符串

而加密将目标转化为不同长度的、可逆的密文,长度一般随明文增长而增加

如果被保护数据仅仅用作比较验证,在以后不需要还原成明文形式,则使用哈希;如果被保护数据在以后需要被还原成明文,则需要使用加密。

 

hash长度扩展攻击是hash函数本身的一个算法缺陷攻击,我门已经在前面研究了md5算法的加密过程。

我们从具体的题来对这个攻击进行理解:

http://web.jarvisoj.com:32778/

首先对其进行目录扫描,发现了index.php~     这个是php的备份文件,但是无法直接打开,我们可以将其放在linux下,将其重新命名,并用vim -r index.php打开便成功恢复为php代码。

代码不长,我们来简单进行审计下

?php

$auth = false;

$role = "guest";

$salt =

if (isset($_COOKIE["role"])) {

$role = unserialize($_COOKIE["role"]);

$hsh = $_COOKIE["hsh"];

if ($role==="admin" && $hsh === md5($salt.strrev($_COOKIE["role"]))) {

$auth = true;

} else {

$auth = false;

}

} else {

$s = serialize($role);

setcookie('role',$s);

$hsh = md5($salt.strrev($s));

setcookie('hsh',$hsh);

}

if ($auth) {

echo "<h3>Welcome Admin. Your flag is

} else {

echo "<h3>Only Admin can see the flag!!</h3>";

}

?>

可以看到$s为role,hsh为salt拼接$s的翻转字符串,然后再进行md5加密,然后进行验证

$auth = false;

$role = "guest";

$salt =

if (isset($_COOKIE["role"])) {

$role = unserialize($_COOKIE["role"]);

$hsh = $_COOKIE["hsh"];

if ($role==="admin" && $hsh === md5($salt.strrev($_COOKIE["role"]))) {

$auth = true;

} else {

$auth = false;

我们仔细看这段代码通过cookie传入的值,满足role=admin很容易,我们直接在包里修改就可以了,但是因为不知道salt的值,我们无法满足hsh=md5(salt+role),修改了role和hsh的值,无法满足等式成立。

而服务器则将认证信息都存在用户的浏览器的cookie里,而服务器只需保留salt的值便可以验证用户的身份了,但是这样会存在哈希长度扩展攻击,可以在不知道salt的情况下让等式成立,成功成为管理员。

简述一下这个哈希长度扩展攻击的过程,我们先补充第一次的salt+身份信息的长度,使之符合MD5算法的要求,这一步服务器也是这么做的,只不过服务器将补足后的信息拿去运算,然后得到hash(记为hash1),返回给我们。但我们在补足长度之后再拼接上其他信息,比如admin,看看会发生什么。服务器会先进行之前一样的运算得到hash1,用这个hash1再作为register,拿去加密后一个块admin(这句话如果不明白再看看hash的原理),最终完成MD5(salt+role)得到一个值hash2与hsh比较。重点来了,现在MD5(salt+role)我们也可以完成,得到那个hash2了。可是我们不是不知道那个salt吗?是的,这次服务器的MD5过程是从头开始运算,到倒数第二步是用hash1去运算admin块,最后得到hash2.

可我们知道hash1(第一次服务器正常的身份信息),和admin(我们自己加上的嘛),那么我们做一次hash1和admin的MD5运算不就得到hash2了嘛(不需要使用salt)。把hash2赋值给hsh,传入就满足了hsh=MD5(salt+role),相当于直接使用了第一次salt运算后的hash1来对hash2进行加密,这样无需知道salt的值便可完成运算,完成身份验证。

这道题的主体就是这样,对于哈希长度扩展攻击的防护也很简单,只需要将用户信息加在salt前面级就行了。因为hash是从前向后分块进行运算的。

可以使用hashpump来进行这种攻击

HashPump是一个借助于OpenSSL实现了针对多种散列函数的攻击的工具,支持针对MD5、CRC32、SHA1、SHA256和SHA512等长度扩展攻击。而MD2、SHA224和SHA384算法不受此攻击的影响,因其部分避免了对状态变量的输出,并不输出全部的状态变量。

kali下安装HashPump

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

至于想在python里实现hashpump,可以使用hashpumpy这个插件:

(注意还是得先安装了libssl-dev)

pip install hashpumpy

推荐在linux里使用,使用方法可以这样获取:

python
>>> import hashpumpy
>>> help(hashpumpy.hashpump)

直接用hashpump生成

 

 将生成的新的md5通过cookie传入,便成功成为管理员。

 

posted @ 2020-11-18 10:54  楼--楼  阅读(1854)  评论(0编辑  收藏  举报
(function() { $("pre").addClass("prettyprint"); prettyPrint(); })();