Mysql 协议嗅探是什么


本文摘自PHP中文网,作者一个新手,侵删。

需求

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

协议要点

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

压缩解析

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

mysql的压缩函数为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

// 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()进行了封装,并没有协议解析部分,我们继续往下看。

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

1

2

// mysql-source/include/sql_state.h

{ ER_NET_UNCOMPRESS_ERROR                 ,"08S01", "" }

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

// 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

2

3

4

5

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中的报错如下

1

2

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利用子查询效率怎么样

mysql大表查询慢怎么优化?

mysql中怎么删除数据库

mysql锁表如何解锁

navicat远程连接mysql连不上

mysql如何删除重复数据

本地mysql服务无法启动怎么办

mysql数据库出现authentication plugin怎么办

mysql数据库中定时删除

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...