ホームページ  >  記事  >  データベース  >  MySQL プロトコル スニッフィングとは何ですか?

MySQL プロトコル スニッフィングとは何ですか?

一个新手
一个新手オリジナル
2017-10-13 10:14:401650ブラウズ

要件

ネットワークカードを通過するすべての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;
}

Line 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 解析の詳細を確認したくなかった場合、この記事では、zlib 圧縮文字列の先頭が x78x9c であることが多いことを記録できます。正しいか確認してください

以上がMySQL プロトコル スニッフィングとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。