• 密码学之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传入,便成功成为管理员。

  • 相关阅读:
    $NOIP2012$ 题解报告
    $NOIP2011$ 题解报告
    $NOIP2007$ 题解报告
    $NOIP2006$ 题解报告
    $NOIP2005$ 题解报告
    $NOIP2003$ 题解报告
    $NOIP2002$ 题解报告
    $NOIP2001$ 题解报告
    $NOIP2000$ 题解报告
    $NOIP1999$ 题解报告
  • 原文地址:https://www.cnblogs.com/lzlzzzzzz/p/13998600.html
Copyright © 2020-2023  润新知