Frage

Ich arbeite an SQL Einbruchmeldesystem (IDS) und ich muss eingehende SQL-Abfragen analysieren.Das Schreiben eines eigenen SQL-Parsers ist eine langfristige Aufgabe und wird niemals genau die Logik widerspiegeln, die im nativen Parser verwendet wird.Ich habe herausgefunden, dass MySQL über einen lexikalischen Analysator mit Hauptquelldatei verfügt sql/sql_lex.cc und ein Syntaxanalysator, der mit Bison von erstellt wurde sql/sql_yacc.y.Ich bin wirklich daran interessiert, diese robusten Lösungen wiederzuverwenden.Ich erstelle mein IDS in C/C++ und suche daher nach einer Möglichkeit, den MySQL-Parser mit meinem Erkennungssystem zu verbinden.

Ich habe mich gefragt, ob es möglich ist, den MySQL-Parser (Lexika- und Syntaxanalysator) wiederzuverwenden, um die Struktur einer SQL-Abfrage in einer logischen Form zu erhalten, z. B.Syntaxbaum.Wäre es möglich?Gibt es verwandte Texte, Tutorials oder Projekte?

Danke

War es hilfreich?

Lösung

Ich habe die erste Version meines IDS im Rahmen meiner Bachelorarbeit fertiggestellt.Es ist als Plugin für MySQL implementiert.

Im Folgenden werde ich meine wichtigsten Quellen zum Verständnis der MySQL-Interna auflisten.Dann beschreibe ich kurz den Ansatz, den ich in meinem IDS verwendet habe.

MySQL-Dokumentationstexte

  • Ich habe Bücher gefunden Experte MySQL von Charles Bell Und MySQL-Interna verstehen von Sascha Pachev (wie user3822447 schrieb) als sehr guter Einstiegspunkt für das Verständnis der Interna von MySQL.
  • Entwicklung des MySQL 5.1-Plugins von Andrew Hutchings und Sergei Golubchik ist auch sehr nützlich.
  • Der MySQL-Interna-Handbuch Enthält auch einige grundlegende Informationen, die für den Anfang gut sind.
  • Nach all dem Lesen habe ich einiges gemacht Debuggen (mit VS) und entdeckte, wie die Abfragebaumstruktur aussieht.

Meine Lösung für IDS

Den Quellcode meiner Lösung finden Sie unter Quellenschmiede.Ich habe vor, es etwas ausführlicher in seinem Wiki zu dokumentieren.

Der Haupteinstiegspunkt ist die audit_ids_notify() Funktion in audit_ids.cc.Das Plugin verwendet den vom internen MySQL-Parser generierten Abfragebaum und erstellt eine vereinfachte Version davon (um Speicher zu sparen).Dann führt es eine Anomalieerkennung durch – es verfügt über eine Liste bekannter Abfragebaumstrukturen und speichert einige statistische Informationen über jeden parametrisierbaren Teil jeder Abfragebaumstruktur.Die Ausgabe wird in eine spezielle Protokolldatei im MySQL-Datenverzeichnis geschrieben.

Ich habe versucht, die Lösung modular und erweiterbar zu gestalten.Die erste Version ist eine Art Demonstration und die Leistung ist insbesondere im SQL-Speichermodul nicht optimiert.

MySQL-Plugin-Typ

Ich habe zwei mögliche Ansätze identifiziert und den ersten verwendet.

  1. Audit-Plugin
    • Der Wrapper-Typ in meinem Lösungs-Plugin ist Audit-Plugin.
    • Ich habe diese Art von Plugins verwendet, obwohl sie zum Melden von Servervorgängen verwendet werden (z. B.um Rückfragen oder Fehler zu protokollieren).
    • Ich habe mich für diesen Plugin-Typ entschieden, weil ich herausgefunden habe, dass dies das einzige nativ unterstützte Plugin ist, das aufgerufen wird, wenn der Abfragebaum nach dem abgeschlossenen (d. h.analysiert) und bevor es aus dem Speicher freigegeben wird (für MySQL 5.6.17).
    • Nachteil:Das oben Genannte ist in zukünftigen Versionen von MySQL nicht vollständig gewährleistet, aber meiner Meinung nach sollte sich dies in naher Zukunft nicht ändern.
    • Vorteil:Das MySQL muss nicht neu kompiliert werden.Es reicht aus, das Plugin zu erstellen und zu installieren.


  1. Plugin zum Umschreiben von Abfragen
    • Es gibt auch einen alternativen Ansatz, bei dem ein nicht-nativer Plugin-Typ verwendet wird Abfrage-Umschreiben.Es stellte eine Plugin-API zum Ändern der Abfrage und damit auch zum Lesen bereit.
    • Nachteil:Um diese Plugin-API zu unterstützen, muss der MySQL-Server mit der API neu kompiliert werden.Ich denke, es könnte Teil der MySQL-Produktionsverteilung werden.
    • Vorteil:Plugin-Typ zum Lesen/Umschreiben des internen Abfragebaums.

Wenn es Fragen/Probleme zu diesem Thema gibt, die ich beantworten kann, zögern Sie nicht, sie zu stellen ;)

Andere Tipps

Ich glaube, dass es möglich ist.Versuchen Sie es mit einem Buch über fortgeschrittene MySQL-Interna wie „Expert MySQL“ von Charles Bell oder „Understanding MySQL Internals“ von Sasha Pachev.MySQL verwendet einen benutzerdefinierten, handgefertigten Lexer und einen generischen Bison-kompatiblen Parser, mit dem ihr Lexer kompatibel ist.

Abgesehen davon finden Sie möglicherweise eine einfachere Lösung als das Parsen der Abfrage, zum Beispiel:

  • Strategie Nr. 1:Werfen Sie die Abfrage weg und schauen Sie sich einfach den Inhalt der Zeichenfolgen in der Abfrage an.Suchen Sie nach möglichen Angriffsvektoren wie SQL-Schlüsselwörtern.Dadurch könnten Angriffsversuche erkannt werden.
  • Strategie Nr. 2:Werfen Sie alle Benutzereingaben weg und erstellen Sie eine Liste des restlichen Abfrageinhalts.Erstellen Sie eine Liste aller Ihrer Keyword-Suchmuster und vergleichen Sie diese miteinander.Suchen Sie nach Abfragen mit einer ungewöhnlichen Struktur, die darauf hindeuten, dass jemand die Abfrage erfolgreich geändert hat.

Ich bin kein SQL-Guru, aber die grundlegendste Strategie besteht einfach darin, parametrisierte Abfragen zu verwenden und Penetrationsversuche zu ignorieren.Bei den meisten dieser Versuche im Internet handelt es sich um generische, zufällige Abfragen, die darauf abzielen, nach offensichtlichen Schwachstellen zu suchen, und können getrost ignoriert werden, wenn Sie überall grundlegende Sicherheitspraktiken befolgen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top