php登陆验证加密算法剖析
2017-12-20 11:02
260 查看
/*------------------------------------------------------ */ //-- 验证登陆信息 /*------------------------------------------------------ */ 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这个网站进行密文解密。
相关文章推荐
- 89 php 登陆验证
- PHP做APP接口时,如何保证接口的安全性(登陆验证)
- PHP登陆Session验证
- 【PHP】简单的登陆验证和权限管理
- PHP后台实现IOS/OC_App于服务器端登陆验证(Demo)
- 完整注册登陆php源码,附带session验证。
- 进入首页使用php判断session验证登陆防止加载视图
- php验证邮件登陆 smtp
- 使用PHP制作 简易员工管理系统之三(管理员登陆界面以及数据库验证)
- php用户验证登陆代码
- php登录验证(包括用户名、密码、验证码、数据库、是否已登陆验证、自动登录和注销登录)
- php用户登陆 验证用户名密码和注销用户信息
- 一个简单的php登陆验证
- Unity3D教程:Unity3D利用PHP+Mysql实现注册激活验证登陆
- php 登陆验证
- php通过smtp邮件验证登陆的方法
- php简单的server登陆验证
- 使用telnet登陆smtp服务发邮件(带身份验证)和Base64加密算法源码(java版)
- php 登陆后台验证代码
- PHP 验证登陆类