MySQL協議分析
1 互動過程
MySQL客戶端與伺服器的互動主要分為兩個階段:握手認證階段和命令執行階段。
1.1 握手認證階段
握手認證階段為客戶端與伺服器建立連線後進行,互動過程如下:
- 伺服器 -> 客戶端:握手初始化訊息
- 客戶端 -> 伺服器:登陸認證訊息
- 伺服器 -> 客戶端:認證結果訊息
1.2 命令執行階段
客戶端認證成功後,會進入命令執行階段,互動過程如下:
- 客戶端 -> 伺服器:執行命令訊息
- 伺服器 -> 客戶端:命令執行結果
MySQL客戶端與伺服器的完整互動過程如下:
2 基本型別
2.1 整型值
MySQL報文中整型值分別有1、2、3、4、8位元組長度,使用小位元組序傳輸。
2.2 字串(以NULL結尾)(Null-Terminated String)
字串長度不固定,當遇到'NULL'(0x00)字元時結束。
2.3 二進位制資料(長度編碼)(Length Coded Binary)
資料長度不固定,長度值由資料前的1-9個位元組決定,其中長度值所佔的位元組數不定,位元組數由第1個位元組決定,如下表:
第一個位元組值 | 後續位元組數 | 長度值說明 |
---|---|---|
0-250 | 0 | 第一個位元組值即為資料的真實長度 |
251 | 0 | 空資料,資料的真實長度為零 |
252 | 2 | 後續額外2個位元組標識了資料的真實長度 |
253 | 3 | 後續額外3個位元組標識了資料的真實長度 |
254 | 8 | 後續額外8個位元組標識了資料的真實長度 |
2.4 字串(長度編碼)(Length Coded String)
字串長度不固定,無'NULL'(0x00)結束符,編碼方式與上面的 Length Coded Binary 相同。
3 報文結構
報文分為訊息頭和訊息體兩部分,其中訊息頭佔用固定的4個位元組,訊息體長度由訊息頭中的長度欄位決定,報文結構如下:
3.1 訊息頭
3.1.1 報文長度
用於標記當前請求訊息的實際資料長度值,以位元組為單位,佔用3個位元組,最大值為 0xFFFFFF,即接近 16 MB 大小(比16MB少1個位元組)。
3.1.2 序號
在一次完整的請求/響應互動過程中,用於保證訊息順序的正確,每次客戶端發起請求時,序號值都會從0開始計算。
3.2 訊息體
訊息體用於存放請求的內容及響應的資料,長度由訊息頭中的長度值決定。
4 報文型別
4.1 登陸認證互動報文
4.1.1 握手初始化報文(伺服器 -> 客戶端)
服務協議版本號:該值由 PROTOCOL_VERSION 巨集定義決定(參考MySQL原始碼/include/mysql_version.h
標頭檔案定義)
服務版本資訊:該值為字串,由 MYSQL_SERVER_VERSION 巨集定義決定(參考MySQL原始碼/include/mysql_version.h
標頭檔案定義)
伺服器執行緒ID:伺服器為當前連線所建立的執行緒ID。
挑戰隨機數:MySQL資料庫使用者認證採用的是挑戰/應答的方式,伺服器生成該挑戰數併發送給客戶端,由客戶端進行處理並返回相應結果,然後伺服器檢查是否與預期的結果相同,從而完成使用者認證的過程。
伺服器權能標誌:用於與客戶端協商通訊方式,各標誌位含義如下(參考MySQL原始碼/include/mysql_com.h
中的巨集定義):
標誌位名稱 | 標誌位 | 說明 |
---|---|---|
CLIENT_LONG_PASSWORD | 0x0001 | new more secure passwords |
CLIENT_FOUND_ROWS | 0x0002 | Found instead of affected rows |
CLIENT_LONG_FLAG | 0x0004 | Get all column flags |
CLIENT_CONNECT_WITH_DB | 0x0008 | One can specify db on connect |
CLIENT_NO_SCHEMA | 0x0010 | Do not allow database.table.column |
CLIENT_COMPRESS | 0x0020 | Can use compression protocol |
CLIENT_ODBC | 0x0040 | Odbc client |
CLIENT_LOCAL_FILES | 0x0080 | Can use LOAD DATA LOCAL |
CLIENT_IGNORE_SPACE | 0x0100 | Ignore spaces before '(' |
CLIENT_PROTOCOL_41 | 0x0200 | New 4.1 protocol |
CLIENT_INTERACTIVE | 0x0400 | This is an interactive client |
CLIENT_SSL | 0x0800 | Switch to SSL after handshake |
CLIENT_IGNORE_SIGPIPE | 0x1000 | IGNORE sigpipes |
CLIENT_TRANSACTIONS | 0x2000 | Client knows about transactions |
CLIENT_RESERVED | 0x4000 | Old flag for 4.1 protocol |
CLIENT_SECURE_CONNECTION | 0x8000 | New 4.1 authentication |
CLIENT_MULTI_STATEMENTS | 0x0001 0000 | Enable/disable multi-stmt support |
CLIENT_MULTI_RESULTS | 0x0002 0000 | Enable/disable multi-results |
字元編碼:標識伺服器所使用的字符集。
伺服器狀態:狀態值定義如下(參考MySQL原始碼/include/mysql_com.h
中的巨集定義):
狀態名稱 | 狀態值 |
---|---|
SERVER_STATUS_IN_TRANS | 0x0001 |
SERVER_STATUS_AUTOCOMMIT | 0x0002 |
SERVER_STATUS_CURSOR_EXISTS | 0x0040 |
SERVER_STATUS_LAST_ROW_SENT | 0x0080 |
SERVER_STATUS_DB_DROPPED | 0x0100 |
SERVER_STATUS_NO_BACKSLASH_ESCAPES | 0x0200 |
SERVER_STATUS_METADATA_CHANGED | 0x0400 |
4.1.2 登陸認證報文(客戶端 -> 伺服器)
MySQL 4.0 及之前的版本
MySQL 4.1 及之後的版本
客戶端權能標誌:用於與客戶端協商通訊方式,標誌位含義與握手初始化報文中的相同。客戶端收到伺服器發來的初始化報文後,會對伺服器傳送的權能標誌進行修改,保留自身所支援的功能,然後將權能標返回給伺服器,從而保證伺服器與客戶端通訊的相容性。
最大訊息長度:客戶端傳送請求報文時所支援的最大訊息長度值。
字元編碼:標識通訊過程中使用的字元編碼,與伺服器在認證初始化報文中傳送的相同。
使用者名稱:客戶端登陸使用者的使用者名稱稱。
挑戰認證資料:客戶端使用者密碼使用伺服器傳送的挑戰隨機數進行加密後,生成挑戰認證資料,然後返回給伺服器,用於對使用者身份的認證。
資料庫名稱:當客戶端的權能標誌位 CLIENT_CONNECT_WITH_DB 被置位時,該欄位必須出現。
4.2 客戶端命令請求報文(客戶端 -> 伺服器)
命令:用於標識當前請求訊息的型別,例如切換資料庫(0x02)、查詢命令(0x03)等。命令值的取值範圍及說明如下表(參考MySQL原始碼/include/mysql_com.h
標頭檔案中的定義):
型別值 | 命令 | 功能 | 關聯函式 |
---|---|---|---|
0x00 | COM_SLEEP | (內部執行緒狀態) | (無) |
0x01 | COM_QUIT | 關閉連線 | mysql_close |
0x02 | COM_INIT_DB | 切換資料庫 | mysql_select_db |
0x03 | COM_QUERY | SQL查詢請求 | mysql_real_query |
0x04 | COM_FIELD_LIST | 獲取資料表字段資訊 | mysql_list_fields |
0x05 | COM_CREATE_DB | 建立資料庫 | mysql_create_db |
0x06 | COM_DROP_DB | 刪除資料庫 | mysql_drop_db |
0x07 | COM_REFRESH | 清除快取 | mysql_refresh |
0x08 | COM_SHUTDOWN | 停止伺服器 | mysql_shutdown |
0x09 | COM_STATISTICS | 獲取伺服器統計資訊 | mysql_stat |
0x0A | COM_PROCESS_INFO | 獲取當前連線的列表 | mysql_list_processes |
0x0B | COM_CONNECT | (內部執行緒狀態) | (無) |
0x0C | COM_PROCESS_KILL | 中斷某個連線 | mysql_kill |
0x0D | COM_DEBUG | 儲存伺服器除錯資訊 | mysql_dump_debug_info |
0x0E | COM_PING | 測試連通性 | mysql_ping |
0x0F | COM_TIME | (內部執行緒狀態) | (無) |
0x10 | COM_DELAYED_INSERT | (內部執行緒狀態) | (無) |
0x11 | COM_CHANGE_USER | 重新登陸(不斷連線) | mysql_change_user |
0x12 | COM_BINLOG_DUMP | 獲取二進位制日誌資訊 | (無) |
0x13 | COM_TABLE_DUMP | 獲取資料表結構資訊 | (無) |
0x14 | COM_CONNECT_OUT | (內部執行緒狀態) | (無) |
0x15 | COM_REGISTER_SLAVE | 從伺服器向主伺服器進行註冊 | (無) |
0x16 | COM_STMT_PREPARE | 預處理SQL語句 | mysql_stmt_prepare |
0x17 | COM_STMT_EXECUTE | 執行預處理語句 | mysql_stmt_execute |
0x18 | COM_STMT_SEND_LONG_DATA | 傳送BLOB型別的資料 | mysql_stmt_send_long_data |
0x19 | COM_STMT_CLOSE | 銷燬預處理語句 | mysql_stmt_close |
0x1A | COM_STMT_RESET | 清除預處理語句引數快取 | mysql_stmt_reset |
0x1B | COM_SET_OPTION | 設定語句選項 | mysql_set_server_option |
0x1C | COM_STMT_FETCH | 獲取預處理語句的執行結果 | mysql_stmt_fetch |
引數:內容是使用者在MySQL客戶端輸入的命令(不包括每行命令結尾的";"分號)。另外這個欄位的字串不是以NULL字元結尾,而是通過訊息頭中的長度值計算而來。
例如:當我們在MySQL客戶端中執行use hutaow;
命令時(切換到hutaow
資料庫),傳送的請求報文資料會是下面的樣子:
0x02 0x68 0x75 0x74 0x61 0x6f 0x77
其中,0x02
為請求型別值COM_INIT_DB
,後面的0x68
0x75 0x74 0x61 0x6f 0x77
為ASCII字元hutaow
。
4.2.1 COM_QUIT 訊息報文
功能:關閉當前連線(客戶端退出),無引數。
4.2.2 COM_INIT_DB 訊息報文
功能:切換資料庫,對應的SQL語句為USE <database>
。
位元組 | 說明 |
---|---|
n | 資料庫名稱(字串到達訊息尾部時結束,無結束符) |
4.2.3 COM_QUERY 訊息報文
功能:最常見的請求訊息型別,當用戶執行SQL語句時傳送該訊息。
位元組 | 說明 |
---|---|
n | SQL語句(字串到達訊息尾部時結束,無結束符) |
4.2.4 COM_FIELD_LIST 訊息報文
功能:查詢某表的欄位(列)資訊,等同於SQL語句SHOW [FULL] FIELDS FROM ...
。
位元組 | 說明 |
---|---|
n | 表格名稱(Null-Terminated String) |
n | 欄位(列)名稱或萬用字元(可選) |
4.2.5 COM_CREATE_DB 訊息報文
功能:建立資料庫,該訊息已過時,而被SQL語句CREATE DATABASE
代替。
位元組 | 說明 |
---|---|
n | 資料庫名稱(字串到達訊息尾部時結束,無結束符) |
4.2.6 COM_DROP_DB 訊息報文
功能:刪除資料庫,該訊息已過時,而被SQL語句DROP DATABASE
代替。
位元組 | 說明 |
---|---|
n | 資料庫名稱(字串到達訊息尾部時結束,無結束符) |
4.2.7 COM_REFRESH 訊息報文
功能:清除快取,等同於SQL語句FLUSH
,或是執行mysqladmin
flush-foo
命令時傳送該訊息。
位元組 | 說明 |
---|---|
1 | 清除快取選項(點陣圖方式儲存,各標誌位含義如下) |
0x01: REFRESH_GRANT | |
0x02: REFRESH_LOG | |
0x04: REFRESH_TABLES | |
0x08: REFRESH_HOSTS | |
0x10: REFRESH_STATUS | |
0x20: REFRESH_THREADS | |
0x40: REFRESH_SLAVE | |
0x80: REFRESH_MASTER |
4.2.8 COM_SHUTDOWN 訊息報文
功能:停止MySQL服務。執行mysqladmin shutdown
命令時傳送該訊息。
位元組 |
相關推薦mysql協議分析1---報文的格式和基本型別navicat 和 mysql 是一對好基友,每天都有非常頻繁的交流,主人在navicat上寫下每條sql語句,輕輕的點了下執行按鈕,navicat就飛快的把主人的指令傳送到mysql那裡,mysql立馬把返回結果傳回navicat那裡顯示給主人看。主人對他們的效率很滿意,同時主人也有點好奇:你們兩個基友是怎 mysql協議分析2---認證包主人看到navicat和mysql在那嘻嘻哈哈,眉來眼去的,好不快樂,忽然也想自己寫個程式,直接去訪問Mysql,雖然現在已經有很多現成的中介軟體可以直接拿來用了,程式只要負責寫sql語句就行了,但是主人想要自己通過mysql協議直接和mysql通訊,一窺究竟。於是主人找到Mysql說:親愛的mysql,我以 MySQL協議分析1 互動過程 MySQL客戶端與伺服器的互動主要分為兩個階段:握手認證階段和命令執行階段。 1.1 握手認證階段 握手認證階段為客戶端與伺服器建立連線後進行,互動過程如下: 伺服器 -> 客戶端:握手初始化訊息客戶端 -> 伺服器: MySQL之——協議分析(下篇)MySQL協議分析議程 協議頭 協議型別 網路協議相關函式 NET緩衝 VIO緩衝 MySQL API協議頭● 資料變成在網路裡傳輸的資料,需要額外的在頭部新增4 個位元組的包頭. . packet length(3位元組), 包體的長度 . packet number(1位元組), 從0開始的遞增的 ● mysql狀態分析之show global status其中 正在 中一 未使用 更多 同事 排序 eat 配置文件 公司的nagios監控服務器長期對內網用MySQL數據庫發出ctritical報警,因為我將其他同事的手機短信報警也開通了,搞得整個系統組的同事都怨聲載道(呵呵)這時候就需要根據其status對其Mysql數據庫 【協議分析】HTTP響應頭中的2種編碼方式介紹href intro feo 發送 文檔 bsp firefox cep 目前 HTTP 1.1中有兩個實體頭(Entity-Header)直接與編碼相關,分別為Content-Encoding和Transfer-Encoding。 先說Content-Encodin 物聯網MQTT協議分析和開源Mosquitto部署驗證-h etc 遙感 並且 傳輸 物聯網平臺 發布消息 情況 all 在《物聯網核心協議—消息推送技術演進》一文中已向讀者介紹了多種消息推送技術的情況,包括HTTP單向通信、Ajax輪詢、Websocket、MQTT、CoAP等,其中MQTT協議為IBM制定並力推 Zookeeper ZAB 協議分析指令 get 不同 保持 lead 細節 決定 rsquo res 前言 ZAB 協議是為分布式協調服務 ZooKeeper 專門設計的一種支持崩潰恢復的原子廣播協議。在 ZooKeeper 中,主要依賴 ZAB 協議來實現分布式數據一致性,基於該協議,ZooKeeper TLS協議分析和數 技術分享 連接建立 發現 p地址 .cn 瀏覽器 及其 任務 一、實驗目的 1.本次實驗主要目的是分析訪問網站時捕捉TLS包,並且對TLS協議進行分析。 2.分析連接建立的完整過程,如:TCP三次握手、SSL安全連接,使用TLS協議連接、協商過程,加密傳送的狀態、TC TCP、UDP、IP 協議分析cin 數值 style width 流量 serve 地址解析 checksum log TCP、UDP、IP 協議分析 http://rabbit.xttc.edu.cn/rabbit/htm/artical/201091145609.shtml http://b 實驗八 應用層協議Ⅱ-FTP協議分析erl .cn 圖片 ftp連接 ext es2017 用戶 ftp服務 發送 實驗八 應用層協議Ⅱ-FTP協議分析 一、實驗目的 1.掌握FTP協議的實現原理。 2.了解控制通道和數據通道。 二、實驗內容 用WareShark 03002_Http請求協議分析https agent tomcat doc 菜單 clas 技術 ref http 1、編寫一個form.html的表單頁面 (1)使用EclipseEE新建一個動態的web項目; (2)Dynamic web module version選擇2,5版本; TCP與UDP協議分析war 封裝 cde vpd cto tel image 由器 ase 1 案例1:TCP與UDP協議分析1.1 問題1、通過抓包分析TCP與UDP的封裝格式2、通過抓包分析TCP三次握手1.2 方案1、實驗環境由兩臺主機PC1和PC2組成,PC1使用宿主機,PC2使用VM ARP協議分析時間 提交 所有 更新 轉換成 body 充值 命令類型 一個 前言:ARP協議的作用 1、什麽是ARP? ARP (Address Resolution Protocol) 是個地址解析協議。最直白的說法是:在IP以太網中,當一個上層協議要發包時,有了該節點的IP mysql日誌分析技術分享 查詢日誌 ror glob 命令 查看 slow ria alt mysql的日誌分為錯誤日誌、二進制日誌、慢查詢日誌、查詢日誌 1.錯誤日誌 可以通過以下命令,來查看錯誤日誌的文件: show variables like ‘log_error‘; 通過上 協議分析之HTTPwireshark 協議分析工作 http 一、小試牛刀** http協議是互聯網上應用最為廣泛的一種網絡協議,它工作在應用層,由請求和響應構成,是一個標準的客戶端服務器模型,http是無狀態的協議。我們接下來要做的,是通過網絡嗅探工具來捕獲網絡中傳輸的http包,從分析數據包的角度來學習http shell腳本實現網絡掃描 自動抓包 協議分析 nmapshell腳本 nmap 網絡抓包 協議分析 掃描 此文章提供思想基礎用法:關於自動檢測功能,各個端口和抓包功能,項目中使用的為nmap軟件,Linux操作系統,首先我們要安裝nmap的軟件 項目中使用的為nmap-6.40-7.el7.x86_64版本,命令格式為: #nmap [掃 MySQL瓶頸分析與優化MySQL 優化 簡介通過sysbench的oltp_read_write測試來模擬業務壓力、以此來給指定的硬件環境配置一份比較合理的MySQL配置文件。環境介紹硬件配置軟件環境優化層級與指導思想優化層級MySQL數據庫優化可以在多個不同的層級進行,常見的有:SQL優化參數優化 架構優化本文重點關註: 安卓脫殼&&協議分析&&burp輔助分析插件編寫自動 ges 程序 ima 到手 插件 無線 gin adb 前言 本文由 本人 首發於 先知安全技術社區: https://xianzhi.aliyun.com/forum/user/5274 本文以一個 app 為例,演示對 app脫殼,然後分析其 協議加密和簽名方 分布式環境中,模塊數據交互協議分析 (百度brpc)sign short 自己的 source 變量 git character 消息 sock 1. 背景 之前聽到同事說,要為自己的模塊考慮寫個數據協議。今天有空想了一下。寫出來,方便後續使用。 開源代碼brpc中可以支持多種協議,nshead、redis、mongo等20 |
---|