Heim  >  Artikel  >  Datenbank  >  Was ist MySQL-Protokoll-Sniffing?

Was ist MySQL-Protokoll-Sniffing?

一个新手
一个新手Original
2017-10-13 10:14:401599Durchsuche

Anforderungen

Überwachen Sie den gesamten MySQL-Verkehr, der über die Netzwerkkarte läuft, analysieren Sie ihn und führen Sie eine Intrusion Detection (IDS) oder Datenintegration durch, ohne das bestehende Geschäft zu beeinträchtigen

Protokollpunkte

Zuerst stellte ich fest, dass das Datenpaketformat unterschiedlich war, als ich MySQL-Front für den Zugriff auf die Datenbank und den MySQL-Client-Zugriff verwendete. Ich habe mir den MySQL-Front-Quellcode nicht angesehen und habe Delphi gefunden.

Komprimierungsanalyse

Wenn beim Verknüpfen mit MySQL der Parameter -C aktiviert ist, ist die Komprimierung für die Verbindungsdaten aktiviert ist zlib

Die Komprimierungsfunktion von MySQL ist:

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

Unter anderem ruft Zeile 35 die Funktion compress() in zlib auf, Aber dort ist nur compress() gekapselt, und es gibt keinen Protokollanalyseteil.

Es ist schwierig, den Zielcode im gesamten Projekt zu finden. Sie können zunächst in der Header-Datei nach Schlüsselinformationen suchen, daher habe ich den folgenden Code gefunden

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

Das passiert Wenn MySQL komprimierte Daten analysiert, können Sie nacheinander nach der Fehlermeldung und dem Fehlercode suchen und den tatsächlichen Datenpaket-Komprimierungscode finden

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

Aus den Zeilen 8-19 können Sie den Prozess der komprimierten Datenpaketierung erkennen steht vor dem Zusatz NET_HEADER_SIZE + COMP_HEADER_SIZELanges Steuerfeld

Suchen Sie nach diesem Makro und stellen Sie fest, dass seine Definition wie folgt lautet

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

Das Längenfeld im NET_HEADER_SIZE Das Feld speichert die Länge des nicht dekomprimierten Datenteils. Das Feld COMP_HEADER_SIZE wird zum Speichern der Länge der dekomprimierten Daten verwendet. Wir können nacheinander Speicher beantragen und dann zlib aufrufen, um den komprimierten Inhalt zu analysieren.

Wenn Sie eine Zlib-Analyse der von Wireshark erfassten Daten ohne Analyse durchführen, schlägt die Dekomprimierung aufgrund des Vorhandenseins des Kontrollfelds fehl. Der in Python gemeldete Fehler lautet wie folgt:

Auf den ersten Blick bereitet dieser Fehler Kopfschmerzen und ich möchte die Details der zlib-Analyse nicht lesen. Deshalb habe ich mir diesen Artikel ausgedacht, um den Grund für MySQL herauszufinden. Jetzt kann ich aufzeichnen, dass der Anfang der zlib-komprimierten Zeichenfolge ist häufig x78x9c. Wenn der gleiche Fehler auftritt, können Sie überprüfen, ob er korrekt ist
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>zlib.error: Error -3 while decompressing data: incorrect data check

Das obige ist der detaillierte Inhalt vonWas ist MySQL-Protokoll-Sniffing?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn