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