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