php登陆验证加密算法剖析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/redwand/article/details/78850861
/*------------------------------------------------------ */
//-- 验证登陆信息
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'signin')
{
    if (!empty($_SESSION['captcha_word']) && (intval($_CFG['captcha']) & CAPTCHA_ADMIN))
    {
        include_once(ROOT_PATH . 'includes/cls_captcha.php');

        /* 检查验证码是否正确 */
        $validator = new captcha();
        if (!empty($_POST['captcha']) && !$validator->check_word($_POST['captcha']))
        {
            sys_msg($_LANG['captcha_error'], 1);
        }
    }

    $_POST['username'] = isset($_POST['username']) ? trim($_POST['username']) : '';
    $_POST['password'] = isset($_POST['password']) ? trim($_POST['password']) : '';

    $sql="SELECT `ec_salt` FROM ". $ecs->table('admin_user') ."WHERE user_name = '" . $_POST['username']."'";
    $ec_salt =$db->getOne($sql);
    if(!empty($ec_salt))
    {
         /* 检查密码是否正确 */
         $sql = "SELECT user_id, user_name, password, last_login, action_list, last_login,suppliers_id,ec_salt".
            " FROM " . $ecs->table('admin_user') .
            " WHERE user_name = '" . $_POST['username']. "' AND password = '" . md5(md5($_POST['password']).$ec_salt) . "'";
    }
    else
    {
         /* 检查密码是否正确 */
         $sql = "SELECT user_id, user_name, password, last_login, action_list, last_login,suppliers_id,ec_salt".
            " FROM " . $ecs->table('admin_user') .
            " WHERE user_name = '" . $_POST['username']. "' AND password = '" . md5($_POST['password']) . "'";
    }

      上面是某商城网站的登陆验证页面部分php代码,从代码中可以看出,用户密码生成的加密算法,经过了两次的md5加密,并在其中加入了盐值(salt),实现函数为md5(md5($_POST['password']).$ec_salt)。

      下面,我们在mysql下模拟这种密码的生成过程:

mysql> select md5(concat(md5('123456'),'123'));
+----------------------------------+
| md5(concat(md5('123456'),'123')) |
+----------------------------------+
| 77d3b7ed9db7d236b9eac8262d27f6a5 |
+----------------------------------+
1 row in set (0.00 sec)

      上面这段sql代码,可以看出,当password='123456',salt='123'时,该算法生成的77开头的密文。

      由此,我们可以发现,相关网站在登陆时,会将一个salt值加入在密码算法中,那么这个salt一般存放在何处呢。我们来查看下保存用户登陆信息的admin_user表,显示结果如下:

mysql> select * from admin_user;
+---------+-----------+----------------------------------+-----------+
| user_id | user_name | user_pwd                         | user_salt |
+---------+-----------+----------------------------------+-----------+
|       1 | admin     | 77d3b7ed9db7d236b9eac8262d27f6a5 | 123       |
|       2 | kaixin007 | 4d2ddfc38d20c67111c31b00de6e5d4d | 7412      |
|       3 | shopuser  | 785a0ae441c230ae4bcd0e2820e5c0e1 | 8434      |
|       4 | root      | 71e8b8f3ff856d891a2e317961d8b436 | 3432      |
|       5 | user5     | 97d90b37e5e7124c26bed5bd9cd89ad5 | nihao     |
+---------+-----------+----------------------------------+-----------+
5 rows in set (0.00 sec)

      至此,我们便完整的演示了一个网站用户密码的生成过程。进一步逆向思考,我们在做渗透测试时,当我们拿下了一个网站的web权限和数据库权限后,我们可以根据验证页面的源代码密码生成算法,结合数据库中salt的值,对部分用户的密码密文进行暴力破解。通过这次实验,我们也应当能够更好的运用www.cmd5.com这个网站进行密文解密。

猜你喜欢

转载自blog.csdn.net/redwand/article/details/78850861