1. 程式人生 > >mysql協議簡析

mysql協議簡析

前言

如果要在命令列中連線mysql,最常用的便是

mysql -u root -p

這樣指定使用者名稱和密碼

當然還可以使用遠端連線

mysql -h 127.0.0.1 -u root -p

還有一種較為少見的,使用ssl來連線

mysql -h 127.0.0.1 -u root --ssl=on -p

既然可以遠端連線,那麼資料必定要從網上流通.那就必然要面臨安全問題,mysql是怎麼解決的呢?

前期設定

既然要研究mysql遠端連線時的通訊過程,那麼首先要開啟mysql的遠端連線功能

如果在配置檔案中設定了bind-address,需要將其改為0.0.0.0

建立一個使用者名稱為admin,密碼為123456的使用者,允許外部訪問

grant all on *.* to [email protected]'%' identified by '123456' with grant option; 

flush privileges;

使用tcpdump監聽3306埠,並將監聽結果匯出至mysql.pcap檔案中

tcpdump -i lo port 3306 -w mysql.pcap

使用

mysql -h 127.0.0.1 -u admin -p

來連線資料庫

執行下列命令

use flag;
select * from flag1 where id = 1;
exit

mysql協議分析

0x1 建立連線

首先三次握手建立連線

建立連線後服務端會向客戶端傳送一個包,包的格式如下

抓包的資料為

接受到這樣的包後由客戶端加密過後向服務端發包,包的格式如下

抓包資料如下

只要password符合服務端的資料,即可建立連線

加密的方法如下

hash1 = SHA1(password) //password是使用者輸入的密碼
result = hash1 ^ sha1(scramble+sha1(hash1))

0x2 執行命令

執行命令的報文如下

抓包資料中可以看到

其中02就對應著切換資料庫的操作

0x00    COM_SLEEP   內部執行緒狀態
0x01    COM_QUIT    關閉連線
0x02    COM_INIT_DB     切換資料庫
0x03    COM_QUERY   SQL查詢請求
0x04    COM_FIELD_LIST  獲取資料表字段資訊
0x05    COM_CREATE_DB   建立資料庫
0x06    COM_DROP_DB     刪除資料庫
0x07    COM_REFRESH     清除快取
0x08    COM_SHUTDOWN    停止伺服器
0x09    COM_STATISTICS  獲取伺服器統計資訊
0x0A    COM_PROCESS_INFO    獲取當前連線的列表
0x0B    COM_CONNECT     (內部執行緒狀態)
0x0C    COM_PROCESS_KILL    中斷某個連線
0x0D    COM_DEBUG   儲存伺服器除錯資訊
0x0E    COM_PING    測試連通性
0x0F    COM_TIME    (內部執行緒狀態)
0x10    COM_DELAYED_INSERT  (內部執行緒狀態)
0x11    COM_CHANGE_USER     重新登陸(不斷連線)
0x12    COM_BINLOG_DUMP     獲取二進位制日誌資訊
0x13    COM_TABLE_DUMP  獲取資料表結構資訊
0x14    COM_CONNECT_OUT     (內部執行緒狀態)
0x15    COM_REGISTER_SLAVE  從伺服器向主伺服器進行註冊
0x16    COM_STMT_PREPARE    預處理SQL語句
0x17    COM_STMT_EXECUTE    執行預處理語句
0x18    COM_STMT_SEND_LONG_DATA     傳送BLOB型別的資料
0x19    COM_STMT_CLOSE  銷燬預處理語句
0x1A    COM_STMT_RESET  清除預處理語句引數快取
0x1B    COM_SET_OPTION  設定語句選項
0x1C    COM_STMT_FETCH  獲取預處理語句的執行結果

參考連結

https://segmentfault.com/a/1190000012166738

https://www.freebuf.com/articles/web/159342.html

---恢復內容結束---