若是要在命令行中鏈接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
首先三次握手創建鏈接
創建鏈接後服務端會向客戶端發送一個包,包的格式以下
抓包的數據爲
接受到這樣的包後由客戶端加密事後向服務端發包,包的格式以下
抓包數據以下
只要password符合服務端的數據,便可創建鏈接
加密的方法以下
hash1 = SHA1(password) //password是用戶輸入的密碼 result = hash1 ^ sha1(scramble+sha1(hash1))
執行命令的報文以下
抓包數據中能夠看到
其中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
---恢復內容結束---
![]()