三度网教程:是一个免费提供流行视频软件教程、在线学习分享的学习平台!

Mysql 协议嗅探是什么

时间:2022-10-23作者:未知来源:三度网教程人气:


SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持SQL。

需求

监听通过网卡的所有mysql流量,进行解析,可在不影响现有业务情况下,进行入侵检测(IDS)或数据集成

协议要点

起初发现 用mysql-front访问数据库和mysql 的客户端访问时数据包格式不同,纠结很久,不明白,mysql-front源码看了眼,delphi,不懂,弃

压缩解析

当链接mysql时,若启用-C参数表示,对于连接数据启用压缩,压缩格式为zlib

mysql的压缩函数为:

// mysql-source/mysys/my_comdivss.c my_bool my_comdivss(uchar *packet, size_t *len, size_t *complen) { DBUG_ENTER("my_comdivss"); if (*len < MIN_COMPRESS_LENGTH) { *complen=0; DBUG_PRINT("note",("Packet too short: Not comdivssed")); } else { uchar *compbuf=my_comdivss_alloc(packet,len,complen); if (!compbuf) DBUG_RETURN(*complen ? 0 : 1); memcpy(packet,compbuf,*len); my_free(compbuf); } DBUG_RETURN(0); } uchar *my_comdivss_alloc(const uchar *packet, size_t *len, size_t *complen) { uchar *compbuf; uLongf tmp_complen; int res; *complen= *len * 120 / 100 + 12; if (!(compbuf= (uchar *) my_malloc(key_memory_my_comdivss_alloc, *complen, MYF(MY_WME)))) return 0; /* Not enough memory */ tmp_complen= (uint) *complen; res= comdivss((Bytef*) compbuf, &tmp_complen, (Bytef*) packet, (uLong) *len); *complen= tmp_complen; if (res != Z_OK) { my_free(compbuf); return 0; } if (*complen >= *len) { *complen= 0; my_free(compbuf); DBUG_PRINT("note",("Packet got longer on comdivssion; Not comdivssed")); return 0; } /* Store length of comdivssed packet in *len */ swap_variables(size_t, *len, *complen); return compbuf; }

其中第35行调用了zlib中的comdivss()函数,但是该处仅对comdivss()进行了封装,并没有协议解析部分,我们继续往下看。

整个项目寻找目标代码比较费劲,可以先在头文件中寻找关键信息,于是找到了下面的代码

// mysql-source/include/sql_state.h { ER_NET_UNCOMPRESS_ERROR ,"08S01", "" }

这是在mysql在解析压缩的数据时如果出错的提示信息和错误码,依次可以查找其引用,发现了真正的数据包压缩代码

// mysql-source/sql/net_serv.cc static uchar * comdivss_packet(NET *net, const uchar *packet, size_t *length) { uchar *compr_packet; size_t compr_length; const uint header_length= NET_HEADER_SIZE + COMP_HEADER_SIZE; compr_packet= (uchar *) my_malloc(key_memory_NET_comdivss_packet, *length + header_length, MYF(MY_WME)); if (compr_packet == NULL) return NULL; memcpy(compr_packet + header_length, packet, *length); /* Comdivss the encapsulated packet. */ if (my_comdivss(compr_packet + header_length, length, &compr_length)) { /* If the length of the comdivssed packet is larger than the original packet, the original packet is sent uncomdivssed. */ compr_length= 0; } /* Length of the comdivssed (original) packet. */ int3store(&compr_packet[NET_HEADER_SIZE], static_cast<uint>(compr_length)); /* Length of this packet. */ int3store(compr_packet, static_cast<uint>(*length)); /* Packet number. */ compr_packet[3]= (uchar) (net->comdivss_pkt_nr++); *length+= header_length; return compr_packet; }

从8-19行可以看到,压缩数据的组包过程,前面分别加了NET_HEADER_SIZE + COMP_HEADER_SIZE 长的控制字段

查找该宏,发现其定义如下

1 // mysql-source/include/mysql_com.h 2 3 /* Constants when using comdivssion */ 4 #define NET_HEADER_SIZE 4 /* standard header size */ 5 #define COMP_HEADER_SIZE 3 /* comdivssion header extra size */

NET_HEADER_SIZE 字段中 长度字段存储 数据部分 未解压时的长度

COMP_HEADER_SIZE 字段是用来存储 解压后的 数据的长度,我们可以依次申请内存,然后调用zlib对压缩内容进行解析即可。

如果不分析直接进行对wireshark抓到的数据进行zlib解析的话,由于控制字段的存在会解压缩失败,在python中的报错如下

Traceback (most recent call last): File "<stdin>", line 1, in <module>zlib.error: Error -3 while decomdivssing data: incorrect data check

起初看到这个错误很头痛也不想看zlib解析细节,才有了从mysql找原因的本文,现在可以记录zlib 压缩字符串的开头常常是\x78\x9c,出现同样错误的可以看看是否正确

以上就是Mysql 协议嗅探是什么的详细内容,更多请关注php中文网其它相关文章!


学习教程快速掌握从入门到精通的SQL知识。

关键词:  Mysql  协议嗅探是啥





Copyright © 2012-2018 三度网教程(http://www.3du8.cn) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版