1. 程式人生 > >MySQL協議-認證握手過程

MySQL協議-認證握手過程

0x00 簡介

MySQL資料庫的認證方式是逐步改進的,從它的發展過程可以看到安全性的由弱到強。

在MySQL-4.1以前的版本存在容易被爆破(CVE-2000-0981)的安全風險。知名的內網嗅探工具cain有一項功能就是破解mysql資料庫的hash值,猜解出明文密碼。

在Mysql-4.1以後猜解雜湊變得不再容易,但是隻要有足夠的精力,還是有戲的,cain和hashcat等工具都有支援。

在MySQL-5.1以後版本也曾出過一個身份認證漏洞(CVE-2012-2122),只需使用者名稱就可以利用該漏洞登入資料庫。

0x01 認證互動過程

MySQL 3.20 - 4.0 版本認證過程

在這裡插入圖片描述

  1. server傳送一個8位元組長的隨機字串(scramble),即鹽給client;
  2. client通過scramble與密碼的hash異或(Xor)後得到一個32位雜湊值,作為種子隨機出一個8位元組字串傳送給伺服器;
  3. server使用資料庫表mysql.user儲存的password重複上述計算過程,與client端發過來的8位元組字串做對比,得出結果

MySQL 4.1 -5.7 版本認證過程

在這裡插入圖片描述

  1. server傳送一個鹽(salt, 或者叫scramble) 給client;
  2. client則使用這個salt加密密碼並與使用者名稱同時傳送給server。client則使用這個salt加密密碼並與使用者名稱同時傳送給server;
  3. server也使用mysql.user表中的雜湊值與client傳送的密碼雜湊做比較,相同則認證成功。

當然,上述過程是MySQL 4.1及以後版本的認證方式。

官網中可以找到MySQL 4.1使用的 【Protocol::HandshakeV10】 握手包資料格式

檢視資料結構定義指南 -> 第一列是位元組大小,第二列是釋義

1              [0a] protocol version #協議
string[NUL]    server version
4              connection id #wireshark中的Thread ID
string[8] auth-plugin-data-part-1 # salt的前8位元組 1 [00] filler 2 capability flags (lower 2 bytes) if more data in the packet: 1 character set 2 status flags 2 capability flags (upper 2 bytes) if capabilities & CLIENT_PLUGIN_AUTH { 1 length of auth-plugin-data } else { 1 [00] } string[10] reserved (all [00]) #字串一般以[00]結束 if capabilities & CLIENT_SECURE_CONNECTION { string[$len] auth-plugin-data-part-2 ($len=MAX(13, length of auth-plugin-data - 8)) #salt剩餘12位元組 if capabilities & CLIENT_PLUGIN_AUTH { string[NUL] auth-plugin name }

MySQL 5.7以上 版本認證過程

在這裡插入圖片描述

借用一張MySQL-8.04的圖,從MySQL5.7開始密碼加密已經開始使用SHA256(password)。

  1. server傳送一個20位元組的salt給client;
  2. client讀取server的公鑰,事先匯入給client的;
  3. client計算password與salt的雜湊值,並通過server的公鑰加密傳送給server;
  4. server用過RSA私鑰解密,並通過scramble和password的hash進行比較認證。

由於引入了非對稱加密方式的安全機制,嗅探MySQL流量中的雜湊值並進行碰撞的攻擊方法不再那麼容易。作為攻擊者必須獲得server的公鑰,才能有資格進行互動。

參考文獻

參考文獻

https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::HandshakeResponse
https://dev.mysql.com/doc/internals/en/authentication-method.html
https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/
https://dev.mysql.com/worklog/task/?id=10774
http://www.freebuf.com/vuls/3815.html
https://www.jb51.net/article/131681.htm
https://cn.aliyun.com/jiaocheng/1118621.html
http://www.php.cn/mysql-tutorials-355496.html
https://stackoverflow.com/questions/48477121/wireshark-password-capture-of-mysql-traffic