MySQL协议分析(2)
MySQL协议分析(2)
此阶段是在压缩传输无加密条件下进行的协议分析
思路
结合Oracle官网的说明和自己用wireshark加python进行数据包分析
步骤
客户端与服务器端是否压缩的协商阶段
压缩传输的数据包格式
数据包解压缩分析过程
压缩协商阶段
首先,用户发起连接数据库的请求,并添加了压缩的参数-C进行传输,此时在网络中TCP建立后,服务器端会给客户端一个Greeting,其中包括了服务器端的MySQL版本、协议版本、支持的能力(其中就包括是否支持压缩)等。
然后,客户端会发送给服务器端一个登陆请求,其中包括:能力标志(里面包括了是否要进行压缩传输,若是压缩传输,则标志位置为1)、字符集、用户名、密码(md5加密)等。
数据包如下:
MySQL Protocol
Packet Length: 58
Packet Number: 1
Login Request
Client Capabilities: 0xa6a5
.... .... .... ...1 = Long Password: Set
.... .... .... ..0. = Found Rows: Not set
.... .... .... .1.. = Long Column Flags: Set
.... .... .... 0... = Connect With Database: Not set
.... .... ...0 .... = Don't Allow database.table.column: Not set
.... .... ..1. .... = Can use compression protocol: Set
.... .... .0.. .... = ODBC Client: Not set
.... .... 1... .... = Can Use LOAD DATA LOCAL: Set
.... ...0 .... .... = Ignore Spaces before '(': Not set
.... ..1. .... .... = Speaks 4.1 protocol (new flag): Set
.... .1.. .... .... = Interactive Client: Set
.... 0... .... .... = Switch to SSL after handshake: Not set
...0 .... .... .... = Ignore sigpipes: Not set
..1. .... .... .... = Knows about transactions: Set
.0.. .... .... .... = Speaks 4.1 protocol (old flag): Not set
1... .... .... .... = Can do 4.1 authentication: Set
Extended Client Capabilities: 0x0003
MAX Packet: 1073741824
Charset: utf8 COLLATE utf8_general_ci (33)
Username: root
Password: 3dad2597af36922c753c7ef0d0f22c18ee0af0bf
具体的能力标志位如下:
共16位,值为0xa6a5,即1010011010100101,其中,第11位的 Can use compression protocol: Set就是是否压缩,若为1,则压缩传输,若为0,则不压缩。
- 服务器端发送确认,开始压缩传输,规则见下面的压缩传输的数据包格式。
压缩传输的数据包格式说明
压缩数据包主要分为压缩数据包头和压缩后的数据包(或者未压缩的数据包,这种情况在后面说明)
压缩数据包头
压缩数据包头共占7字节,分为3段,格式如下:
第一段: 压缩后的mysql数据包的长度。它的值的计算方法是TCP总数据包的长度-7,也就是总长度减去压缩数据包头剩下的就是mysql数据包压缩后的长度,占3字节;
第二段: sequence id,序列id,占1字节;
第三段: 压缩前/解压缩后的mysql数据包的长度,占3字节。
压缩传输的数据包
分为两种情况:
第一种情况是数据包长度小于50字节,这种情况下即使选择了压缩传输,由于数据包太短,兼顾效率问题,就不会被压缩传输;同时在上述的压缩数据包头的第三个字段会为0.
第二种情况是数据包长度大于50字节,这种情况下就会对数据包进行压缩传输,且压缩数据包头的第三个字段会大于0.
解压缩
在官网中说明了压缩过程选用的是zlib进行的压缩,所以我们需要找到zlib的解压缩方法。本次采用的是Python中的zlib库。
- 请求的压缩
(从客户端发起一个SQL语句的请求,保证此请求的长度大于50bytes,会产生压缩)
执行SQL语句如下:
select ID,USERID,USERNAME,BIRTHDAY,SALARY from smalltable where ID = 999 and USERNAME = 'fdsfsdfdsdsafs'
在wireshark中抓到此次请求的包,右键,复制为转移字符串,然后粘贴到Python中,定义一个字符串s。
import zlib
s = "\x78\x9c\xcb\x64\x60\x60\x60\x2e\x4e\xcd\x49\x4d\x2e\x51\xf0\x74\xd1\x09\x0d\x76\x0d\x82\x52\x7e\x8e\xbe\xae\x3a\x4e\x9e\x41\x21\x1e\x2e\x8e\x91\x3a\xc1\x8e\x3e\x8e\x41\x91\x0a\x69\x45\xf9\xb9\x0a\xc5\xb9\x89\x39\x39\x25\x89\x49\x39\xa9\x0a\xe5\x19\xa9\x45\xa9\x40\x8d\x0a\xb6\x0a\x96\x96\x96\x0a\x89\x79\x29\x0a\x30\xbd\x40\x21\xf5\xb4\x94\xe2\xb4\xe2\x14\x20\x99\x52\x9c\x98\x56\xac\x0e\x00\xcd\x25\x21\x24"
un_c = zlib.decompress(s)
print un_c
观察到输出为iselect ID,USERID,USERNAME,BIRTHDAY,SALARY from smalltable where ID = 999 and USERNAME = 'fdsfsdfdsdsafs'
验证了分析过程的正确性。
问题:在语句前有一个字符'i',猜测可能为校验码之类的值,未验证。
- 响应的压缩
(从客户端发起个SQL语句的请求,保证得到的响应结果大于50bytes,且大于1514,大于1514是为了验证当响应结果特别长,发生了分包时的情况)
执行SQL语句
select * from smalltable where ID < 100
类似于上面的步骤,将所有响应的TCP包中的TCP payload右键,复制为转义字符串,粘贴到Python中,通过这种方式手动把多个包拼在一起。(因为这个包太长了,这里就不放了)程序也与上面相同。验证后正确解压缩,只是结果与我们查看的结果的格式有些许的不同。
压缩无加密的MySQL协议分析结束。
MySQL协议分析(2)的更多相关文章
- MySQL协议分析
MySQL协议分析 标签: mysql 2015-02-27 10:22 1807人阅读 评论(1) 收藏 举报 分类: 数据库(19) 目录(?)[+] 1 交互过程 MySQL客户端与 ...
- MySQL协议分析2
MySQL协议分析 议程 协议头 协议类型 网络协议相关函数 NET缓冲 VIO缓冲 MySQL API 协议头 ● 数据变成在网络里传输的数据,需要额外的在头部添加4 个字节的包头. . packe ...
- MySQL协议分析(1)
MySQL协议分析 此阶段的协议分析是在未压缩未加密情况下的协议分析 思路: 结合Oracle官网和自己用wireshark抓的网络数据包进行协议分析 官网说明 mysql包共分为4段,格式如下: 第 ...
- mixer: mysql协议分析
综述 要实现一个mysql proxy,首先需要做的就是理解并实现mysql通讯协议.这样才能通过proxy架起client到server之间的桥梁. mixer的mysql协议实现主要参考mysql ...
- mysql 协议分析
MYSQL Binlog协议分析 此处不讨论建立连接,验证和handshake的交互协议 Binlog协议 一个MYSQL 通信包由包头包体组成 包体根据具体的交互协议有自身的组成结构, 在binlo ...
- mysql协议分析2---认证包
主人看到navicat和mysql在那嘻嘻哈哈,眉来眼去的,好不快乐,忽然也想自己写个程序,直接去访问Mysql,虽然现在已经有很多现成的中间件可以直接拿来用了,程序只要负责写sql语句就行了,但是主 ...
- mysql协议分析1---报文的格式和基本类型
navicat 和 mysql 是一对好基友,每天都有非常频繁的交流,主人在navicat上写下每条sql语句,轻轻的点了下执行按钮,navicat就飞快的把主人的指令传送到mysql那里,mysql ...
- mysql协议简析
前言 如果要在命令行中连接mysql,最常用的便是 mysql -u root -p 这样指定用户名和密码 当然还可以使用远程连接 mysql -h 127.0.0.1 -u root -p 还有一种 ...
- Memcache的使用和协议分析详解
Memcache的使用和协议分析详解 作者:heiyeluren博客:http://blog.csdn.NET/heiyeshuwu时间:2006-11-12关键字:PHP Memcache Linu ...
随机推荐
- golang :连接数据库闲置断线的问题
golang在进行数据库操作,一般来说我们使用Open函数创建一个数据库(操作)句柄:func Open(driverName, dataSourceName string) (*DB, error) ...
- C51寄存器详解(Reg51.h)
Reg51.h 这个头文件将C程序中能用到的寄存器名或寄存器中某位的名称与硬件地址值做了对应,在程序中直接写出这些名称,集成开发环境就能识别,并最终转换成机器代码,实现对单片机各硬件资源的准确操控. ...
- ORDER BY 语句用于对结果集进行排序。
ORDER BY 语句 ORDER BY 语句用于根据指定的列对结果集进行排序. ORDER BY 语句默认按照升序对记录进行排序. 如果您希望按照降序对记录进行排序,可以使用 DESC 关键字.
- 在Swing的组件中,基本上都是在AWT组件的名称前面加“J”
在Swing的组件中,基本上都是在AWT组件的名称前面加“J”. 一般情况下,除了Choise等组件: import javax.swing.*;好要加上:import java.awt.*以及imp ...
- debugging openstack with pdb
在要开始debug的地方导入pdb: class KeypairAPI(base.Base): """Sub-set of the Compute Manager API ...
- Excel随机生成数据
CONCATENATE函数是一个文本连接函数,非常简单,和&的效果一样. CONCATENATE是一个文本连接函数 语法:CONCATENATE(text1,text2,text3...... ...
- Git-fatal: unable to access 'xxx' : Could not resolve host: xxx
解决办法:(在知乎上找到 确实好用) 1.查询代理 git config --global http.proxy 2.取消代理设置 git config --global --unset http.p ...
- ASP.NET操作Excel(终极方法NPOI)
ASP.NET操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,能够帮助开发者在没有安装微软Office的情况下读写Office 97-200 ...
- codevs 5965 [SDOI2017]新生舞会
分数规划的裸题. 不会分数规划的OIer.百度:胡伯涛<最小割模型在信息学竞赛中的应用> /* TLE1: last:add(i,j+n,1e9,(real)((real)a[i][j]- ...
- zookeeper未授权访问漏洞
1.什么是zookeeper? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交 ...