前言
如果要在命令行中連接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://www.freebuf.com/articles/web/159342.html
---恢復內容結束---
![]()