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 ...
随机推荐
- IOS微信API异常:unrecognized selector sent to instance 0x17005c9b0'
开发IOS整合微信API的时候,在运行程序的过程中可能会在注册你的APPID的时候抛出此异常而导致程序崩溃. 异常描述 [7661:2826851] *** Terminating app due t ...
- Web项目开发规范文档
http://www.kancloud.cn/chandler/css-code-guide/51267
- EasyUI Tree checkbox node
tree插件允许你创建checkbox tree,如果你点击节点的checkbox,被点击的节点信息得到下和上的继承.例如,点击tomato节点的checkbox,你可以看到vegetables节点现 ...
- Linux中安装配置hadoop集群
一. 简介 参考了网上许多教程,最终把hadoop在ubuntu14.04中安装配置成功.下面就把详细的安装步骤叙述一下.我所使用的环境:两台ubuntu 14.04 64位的台式机,hadoop选择 ...
- Java分为三个体系
Java分为三个体系 JavaSE(Java2 Platform Standard Edition,java平台标准版), JavaEE(Java 2 Platform,Enterprise Edit ...
- hdu 2612:Find a way(经典BFS广搜题)
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- ArcGIS 空间数据库备份
Expdp system/ddd@orcl directory=sdebak dumpfile=20170124_1_ServerBak.dmp schemas=(sde, ddd)
- px像素单位与IOS像素单位的换算
本文转载至 http://blog.csdn.net/fanyuna/article/details/24032663 30px转成磅为单位=22磅=二号 磅=(像素/96)*72 =(30/96) ...
- 《C++ Primer Plus》学习笔记——C++程序创建到运行的整个过程
当你编写了一个C++,如何让它运行起来呢?具体的步骤取决于计算机环境和使用的C++编译器,但大体如下: 1.使用文本编辑器编写程序,并将其保存到文件中,这个文件就是程序的源代码. 2.编译源代码.这意 ...
- Tiled地图编辑软件
Tiled官网: http://www.mapeditor.org/ 一个比较简单好用的地图编辑软件.百度可以找到很多教程. 在Egret中,官网提供了Tiled的工具类,但是教程和文档极少...只能 ...