mysql協議簡析
阿新 • • 發佈:2018-11-06
前言
如果要在命令列中連線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
---恢復內容結束---