1. 程式人生 > >MySQL協議-python版密碼解密

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