SQL-Injections sind eine der häufigsten und gefährlichsten Webanwendungs-Schwachstellen. Durch das Einbringen bösartigen SQL-Codes in Eingabefelder können Angreifer die zugrundeliegende Datenbank manipulieren und sensible Daten extrahieren oder verändern. In diesem Artikel werden wir die verschiedenen Arten von SQL-Injections genauer betrachten und anhand von Beispielen erläutern.
SQL-Injections können anhand der Art und Weise, wie der Angreifer Informationen aus der Datenbank extrahiert, in verschiedene Kategorien eingeteilt werden:
In-Band SQL-Injections
Bei In-Band-Injections werden die Ergebnisse des Angriffs direkt in der Anwendungsausgabe angezeigt. Dies ist die einfachste Art von SQL-Injection.
Beispiel: Error-based SQLi
Angenommen, eine Anwendung verwendet folgende SQL-Abfrage, um Benutzernamen zu überprüfen:
SELECT * FROM users WHERE username = '$username'
Ein Angreifer könnte einfach ein Hochkomma für $username
eingeben. Die resultierende Abfrage wäre dann:
SELECT * FROM users WHERE username = '''
Die SQL-Abfrage wäre ungültig und die Datenbank liefert eine Fehlermeldung. Gibt die Anwendung die Fehlermeldung an den Angreifer weiter, so kann dieser daraus Informationen gewinnen, z.b. über die eingesetzten Technologien.
Beispiel: Boolean-based SQLi
Wie zu Beginn des Artikels gezeigt, kann ein Angreifer auch folgenden Wert eingeben, um alle Ergebnisse anzeigen zu lassen:
Beispiel: UNION-based SQLi
Ein Angreifer kann auch versuchen, die Ergebnisse zweier Abfragen miteinander zu kombinieren (UNION).
myuser' UNION SELECT version(),current_user()--
Diese Abfrage würde in MySQL die Datenbankversion und der Datenbanknutzer zurückgeben, vorausgesetzt, die Anzahl der Spalten stimmt überein. Die resultierende SQL-Abfrage ist die folgende:
SELECT * FROM users WHERE username = 'myuser' UNION SELECT version(),current_user()--'
Blind SQL-Injections
Bei Blind SQL-Injections erhält der Angreifer keine direkte Rückmeldung, sondern muss die Datenbank durch geschickte Abfragen nach und nach ausspionieren.
Beispiel: Boolean-based Blind SQLi
Der Angreifer versucht, durch die Analyse der Antwortzeit oder des Antwortcodes der Anwendung zu ermitteln, ob eine bestimmte Bedingung wahr oder falsch ist.
' AND (SELECT ASCII(SUBSTRING(password, 1, 1)) FROM users WHERE username='admin')=105--
Diese Abfrage prüft, ob das erste Zeichen des Passworts des Benutzers "admin" den ASCII-Wert 105 hat.
Time-based Blind SQLi
Ähnlich wie bei der Boolean-based Injection, wird hier die Antwortzeit der Datenbank analysiert. Der Angreifer fügt eine Verzögerung in die Abfrage ein, die nur ausgeführt wird, wenn eine bestimmte Bedingung erfüllt ist.
' AND IF((SELECT COUNT(*) FROM users WHERE username='admin')>0, SLEEP(5), 0)--
Wenn der Benutzer "admin" existiert, wird die Datenbank 5 Sekunden lang schlafen, was sich in der Antwortzeit bemerkbar macht.
Out-of-Band SQL-Injections
Eine Out-of-Band-SQL-Injection (OOB SQLi) ist eine Art von SQL-Injection-Angriff, bei dem der Angreifer die Ergebnisse der Abfrage nicht direkt in der Antwort der Anwendung erhält. Stattdessen löst der Angriff eine Aktion aus, die Daten an einen vom Angreifer kontrollierten Server sendet.
Diese Angriffe sind jedoch eher selten und sehr kompliziert in der Ausführung.