0x00 简介
MySQL用户账户列于mysql数据库中的user表内。每个MySQL账户指定一个密码,尽管保存在user表Password列的密码不是明文,但哈希值是从表中的记录计算的。用PASSWORD()函数来计算密码的哈希值。
MySQL在客户端/服务器通信的两个阶段使用密码:
· 如果客户端试图连接服务器,有一个初始鉴定步骤,客户必须提供一个密码,并且必须与客户想要使用的账户在user表保存的哈希值匹配。
· 客户端连接后,它可以(如果有充分的权限) 设置或更改user表内所列的账户的密码哈希值值。客户端可以通过PASSWORD()函数来生成密码哈希值,或使用GRANT或SET PASSWORD语句。
本文将介绍MySQL数据库使用的两种不同的哈希加密方法,需要说的是,从4.1版本之后,MySQL的哈希算法就已经很完善了。
0x01 MySQL Pre-4.1 版本 哈希方法
MySQL 4.1以前,数据库中保存的password 哈希是通过PASSWORD()函数计算出来的16个字节长度的字符串,示例如下:
mysql_3.23> SELECT PASSWORD('mypass');
+--------------------+
| PASSWORD('mypass') |
+--------------------+
| 6f8c114b58f2ce9e |
+--------------------+
有人把这种加密方式称为"mysql323",然而,并没有有什么卵用。正如之前的博文介绍的授权认证方式,由于mysql323的哈希长度只有16字节,转换成binary也就8个字节,很容易被碰撞破解。大概在2000年开始逐渐退出历史的舞台。
0x01 MySQL 4.1 及以上版本 哈希方法
基于mysql323的不足,开发者设计了一套新的哈希算法:
- 更复杂的PASSWORD() 函数
- 增长Password哈希值存储长度
- 调整默认哈希方法
- 调整远程连接授权认证的哈希方法
- password哈希值以*开始
在MySQL4.1中,哈希方法会计算出一个41字节长度的哈希值保存在数据库,当然,41 = 40+1的这个1是*字符,示例如下:
mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass') |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
花样不多,就是长度增加了一倍,就是这样简单粗暴的加固方案。
算法:
- 对password两次sha1
python代码:
import hashlib
hash1 = hashlib.sha1(passwd).digest()
reuslt = hashlib.sha1(hash1).hexdigest()
# 输出结果为6c8989366eaf75bb670ad8ea7a7fc1176a95cef4
print reuslt
mysql命令:
mysql> SELECT SHA1(UNHEX(SHA1("mypass")));
+------------------------------------------+
| SHA1(UNHEX(SHA1("mypass"))) |
+------------------------------------------+
| 6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+------------------------------------------+
1 row in set (0.00 sec)
0x02 题外话
下面是初步判断,还没用过mysql 5.6以上的版本。。
MySQL 5.6版本开始远程授权认证过程的基础哈希改成了sha256,保存在数据库中的哈希值还是sha1的结果。
0x03 MySQL pre-4.1哈希破解代码
由于pre-4.1的哈希太弱,容易被碰撞,老外提了个CVE,编号CVE-2000-0981,有一篇比较详细的研究报告【传送门】,有兴趣的同学可以看看。
另外附赠破解的poc源码【 传送门】
0x04 参考文献
https://blog.csdn.net/paul123456789io/article/details/53081921
https://stackoverflow.com/questions/5654819/how-can-i-decrypt-mysql-passwords
http://www.iteedu.com/database/mysql/mysqlmanualcn/database-administration/password-hashing.php
https://dev.mysql.com/doc/refman/5.6/en/sha256-pluggable-authentication.html
https://dev.mysql.com/doc/refman/5.6/en/set-password.html