天天看點

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

繼續閱讀