最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Mysql协议嗅探是什么

来源:动视网 责编:小采 时间:2020-11-09 08:45:48
文档

Mysql协议嗅探是什么

Mysql协议嗅探是什么:需求监听通过网卡的所有mysql流量,进行解析,可在不影响现有业务情况下,进行入侵检测(IDS)或数据集成协议要点起初发现 用mysql-front访问数据库和mysql 的客户端访问时数据包格式不同,纠结很久,不明白,mysql-front源码看了眼,delphi,不懂,弃
推荐度:
导读Mysql协议嗅探是什么:需求监听通过网卡的所有mysql流量,进行解析,可在不影响现有业务情况下,进行入侵检测(IDS)或数据集成协议要点起初发现 用mysql-front访问数据库和mysql 的客户端访问时数据包格式不同,纠结很久,不明白,mysql-front源码看了眼,delphi,不懂,弃


需求

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

协议要点

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

压缩解析

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

mysql的压缩函数为:

// mysql-source/mysys/my_compress.c

my_bool my_compress(uchar *packet, size_t *len, size_t *complen)
{
 DBUG_ENTER("my_compress");
 if (*len < MIN_COMPRESS_LENGTH)
 {
 *complen=0;
 DBUG_PRINT("note",("Packet too short: Not compressed"));
 }
 else
 {
 uchar *compbuf=my_compress_alloc(packet,len,complen);
 if (!compbuf)
 DBUG_RETURN(*complen ? 0 : 1);
 memcpy(packet,compbuf,*len);
 my_free(compbuf);
 }
 DBUG_RETURN(0);
}


uchar *my_compress_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_compress_alloc,
 *complen, MYF(MY_WME))))
 return 0; /* Not enough memory */

 tmp_complen= (uint) *complen;
 res= compress((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 compression; Not compressed"));
 return 0;
 }
 /* Store length of compressed packet in *len */
 swap_variables(size_t, *len, *complen);
 return compbuf;
}

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

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

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

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

// mysql-source/sql/net_serv.cc

static uchar *
compress_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_compress_packet,
 *length + header_length, MYF(MY_WME));

 if (compr_packet == NULL)
 return NULL;

 memcpy(compr_packet + header_length, packet, *length);

 /* Compress the encapsulated packet. */
 if (my_compress(compr_packet + header_length, length, &compr_length))
 {
 /*
 If the length of the compressed packet is larger than the
 original packet, the original packet is sent uncompressed.
 */
 compr_length= 0;
 }

 /* Length of the compressed (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->compress_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 compression */
4 #define NET_HEADER_SIZE 4 /* standard header size */
5 #define COMP_HEADER_SIZE 3 /* compression 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 decompressing data: incorrect data check

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

文档

Mysql协议嗅探是什么

Mysql协议嗅探是什么:需求监听通过网卡的所有mysql流量,进行解析,可在不影响现有业务情况下,进行入侵检测(IDS)或数据集成协议要点起初发现 用mysql-front访问数据库和mysql 的客户端访问时数据包格式不同,纠结很久,不明白,mysql-front源码看了眼,delphi,不懂,弃
推荐度:
标签: 是什么 协议 嗅探
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top