mysql協議簡析

前言

若是要在命令行中鏈接mysql,最經常使用的即是html

mysql -u root -p

這樣指定用戶名和密碼mysql

固然還可使用遠程鏈接web

mysql -h 127.0.0.1 -u root -p

還有一種較爲少見的,使用ssl來鏈接sql

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

既然能夠遠程鏈接,那麼數據一定要從網上流通.那就必然要面臨安全問題,mysql是怎麼解決的呢?數據庫

前期設置

既然要研究mysql遠程鏈接時的通訊過程,那麼首先要開啓mysql的遠程鏈接功能segmentfault

若是在配置文件中設置了bind-address,須要將其改成0.0.0.0緩存

建立一個用戶名爲admin,密碼爲123456的用戶,容許外部訪問安全

grant all on *.* to admin@'%' identified by '123456' with grant option; 

flush privileges;

使用tcpdump監聽3306端口,並將監聽結果導出至mysql.pcap文件中服務器

tcpdump -i lo port 3306 -w mysql.pcap

使用tcp

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

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

相關文章
相關標籤/搜索