天天看点

MySQL协议-python版密码解密

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

继续阅读