SQL-Injection Seite 1 / 16
Allgemein: SQL (Structured Query Language) Datenbanksprache zur Definition von Datenstrukturen in Datenbanken Bearbeiten und Abfragen von Datensätzen Definition: SQL-Injection Ausnutzen einer Sicherheitslücke in SQL-DATENBANKEN Möglich durch mangelnde Überprüfung von Metazeichen in Benutzereingaben Seite 2 / 16
Crashkurs: SQL-Syntax SELECT: SELECT {SPALTE} FROM {TABELLE} WHERE {Variablen} UNION: SELECT...UNION SELECT... ORDER BY: SELECT {SPALTE} ORDER BY {SPALTE} INFORMATION_SCHEMA: ab MySQL-Version 5 = Informations-DB, welche sämtliche Tabellen-Infos enthält Interessante Felder: table_name, column_name Allgemeine MySQL-Funktionen: version(), database(), user() Seite 3 / 16
Angriffsvektoren (Angriffswege): Eindringen von Schadcode üblicherweise über Nutzereingaben in die Anwendung. Angreifer versucht eigenen SQL-Code in vorhandene DB-Abfragen einzufügen um neue SQL-Befehle zu erzeugen. Möglich durch Ausnutzung von Programmschwächen: Werteübergabe ohne umschließende Hochkommas Fehlende Typenprüfung der Werte Fehlende Längenprüfung der Werte Fehlende Maskierung von Sonderzeichen Seite 4 / 16
Angriffsformen Seite 5 / 16
Logische Verknüpfungen ändern: Username und password werden über ein Formular entgegengenommen und mit den DB-Inhalten abgeglichen. Angriff über Forumulareingabe: Seite 6 / 16
Die Abfrage, die an MySQL übermittelt wird, lautet nach der Injizierung des Schadcodes: => Das Ergebnis der OR-Verknüpfung ist WAHR. Da OR vor AND ausgewertet wird, lautet die Abfrage somit: Sie ist WAHR, sofern ein Nutzer admin existiert und liefert den entsprechenden Datensatz. Seite 7 / 16
Teilabfragen entfernen: Teile der SQL-Abfrage können durch Einfügen von Kommentarzeichen sogar komplett aus der Ausführung entfernt werden. Diese Nachricht zeigt auf einer Webseite Pressenachrichten an. Bestimmte Nachrichten können gesperrt bzw. freigegeben werden (mittels DB-Spalte freigabe ). Falls der Angreifer vermutet, dass die Datumsangaben direkt in eine SQL-Abfrage eingefügt werden, könnte er folgende Anfrage an das Skript senden: Seite 8 / 16
Wird das Datum ungeprüft übernommen, ändert sich durch diese Eingabe die Datenbankabfrage wie folgt: Die Zeichengruppe (/*) bedeutet in der MySQL-Syntax einen Kommentar-Anfang. Daher wird der folgende SQL-Code nicht weiter beachtet. Eine weitere Möglichkeit um einzelne Zeilen zu kommentieren ist der doppelte Bindestrich ( ). Seite 9 / 16
Zusätzliche Abfragen: Die MySQL-Datenbank unterstützt keine multiplen Queries, sprich es können immer nur einzelne Befehle abgearbeitet werden. Durch das Kommando UNION können über den eigentlichen Befehl weitere Anfragen abgesetzt werden. Das Problem dabei ist, dass der Angreifer eine Vorstellung von der Struktur der Datenbank haben muss. Oft werden hier Standard-Tabellennamen probiert, oder via INFORMATION_SCHEMA (ab MySQL V 5.0) entsprechende Daten gezielt abgerufen. Hier ist ID die Schwachstelle, da diese dynamisch abgefragt wird. Seite 10 / 16
Der Angreifer kann nun mit dem UNION-Befehl eine weiter Tabelle anfragen und gegebenenfalls auslesen. Der Angreifer erhält als Antwort eine Liste mit Usernamen und Passwörtern, die danach möglicherweise durch eine Rainbow- Table* wieder in Klartext entschlüsselt werden könnten. *Spezielle Datenstruktur, die eine schnelle Suche nach einem Passwort anhand eines gegebenen Hashwerts ermöglicht. Seite 11 / 16
Durch den UNION-Befehl wird hier eine Menge der beiden SELECT- Anweisungen gebildet, was bedeutet, dass keine News aber dafür alle Usernamen und Passwörter aus der Tabelle mysql.user als Antwort vom Server zu erwarten sind. Anschliesende Befehle werden durch das /* einfach auskommentiert. Seite 12 / 16
Datenbankprozesse beeinflussen: Das SQL-Kommando BENCHMARK ermöglicht es zu ermitteln wie schnell eine bestimmte SQL-Anfrage behandelt wird. Um den Befehl einzuschleusen benutzen wir wieder das bereits bekannt UNION Kommando. Durch folgende Ergänzung wird der der BENCHMARK auf dem SQL-Server ausgeführt: Seite 13 / 16
Hier wird der der Server angewiesen 1 Millionen mal den MD5-Hash des Buchstaben 'A' zu berechnen. => Durch mehrere Angriffe dieser Art wäre es möglich, dass der MySQL-Server andere Anfragen nicht mehr bearbeitet. Der fertige SQL-Befehl sieht wie folgt aus: Diese Funktion könnte von einem Angreifer verwendet werden um einen Server lahmzulegen (DoS: Denial of Service) Seite 14 / 16
Quellenangaben: Wikipedia: SQL-Injection http://de.wikipedia.org/wiki/sql-injection Erich Kachel: SQL-Injections - eine Analyse an PHP & MySQL http://www.erich-kachel.de/?p=223 Ali Recai Yekta: Advanced SQL-Injection in MySQL http://www.alirecaiyekta.com/uploads/advanced-sql-injectionin-mysql-german.pdf Seite 15 / 16
ENDE Seite 16 / 16