碳基体

奋斗在产品安全第一线的安全妹子

三、TCP/IP协议分析-MySQL认证协议


登陆mysql数据库,抓取mysql从建立连接到断开连接的双向流量,如下图所示

python print_tcp_session.py



一次失败的MySQL登陆,账号为root

 

 一次成功的mysql登陆,账号为ids


 

由上图所示,

MySQL采用的二进制协议,采用的小端字节


MySQL报文结构由消息头消息体构成,而消息头又由消息体长度与序列号构成。

消息头为固定长度4个字节,消息头长度占3个字节,序列号占1个字节。

消息体长度为消息头长度取值




一次失败的认证过程为

服务端-> 客户端:Server Greeting,Packet Number 00

客户端-> 服务端: Login Request,Packet Number 01

服务端->客户端: Response Error,Packet Number02



一次成功的认证过程为

服务端-> 客户端:Server Greeting, Packet Number 00

客户端-> 服务端: Login Request,Packet Number 01

服务端->客户端: Response OK,Packet Number 02



客户端认证报文的消息体组成

 (1) Server Greeting后,明文传输

客户端权能标志client capabilities 2个字节 


+ 客户端全能标志(扩展)extended client capabilities 2个字节

+ 最大消息长度max packet 4个字节

+ 字符编码charset  1个字节

+ 填充值 23个字节(全是00)

+ 用户名 username(不固定长度,以0x00结束)

+密码串长度(1个字节)

+密码的加密串(不固定长度,由密码串长度决定) 

+ 数据库名称schema(不固定长度,以0x00结束) #由客户端权能标志CLIENT_CONNECT_WITH_DB决定是否返回

+其他可选

可以从中提取用户名,数据库名

 (2) Server Greeting后,SSL传输

客户端权能标志2个字节 + 客户端全能标志(扩展)2个字节+ 最大消息长度 4个字节+ 字符编码 1个字节+ 填充值 23个字节(全是00)

 

其中客户端与服务端握手后,后续是否切换到ssl传输,由客户端全能标志位决定

 

 

服务端响应报文的消息体组成

(1)成功响应

 

状态标识(1个字节) #00表示成功/FF表示失败

+ 受影响的行数 变长

+ 索引ID 变长

+ 服务器状态 2个字节

+ 告警计数 2个字节

+ 服务器消息 变长

(2)失败响应

 

状态标识  1个字节 #00表示成功/FF表示失败

+ 错误码  2个字节

+ # 1个字节 固定为 0x23

+ sql 状态 5个字节

+错误消息(不固定长度)


参考:

http://hutaow.com/blog/2013/11/06/mysql-protocol-analysis/

http://boytnt.blog.51cto.com/966121/1279318


预告:四、TCP/IP协议分析-PostgreSQL认证协议

来源:碳基体

评论