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 admin@'%' 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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM