SQL-Injections

Eine tiefgehende Analyse

Eine SQL-Injection, kurz SQLi, ist eine Art von Cyberangriff, bei dem ein Angreifer bösartigen SQL-Code in eine Anwendung einschleust, um die zugrundeliegende Datenbank zu manipulieren. SQL (Structured Query Language) ist eine Sprache, die zum Abfragen und Verwalten von Daten in relationalen Datenbanken verwendet wird.

Wie funktioniert es?

Stellen Sie sich eine Webseite vor, die ein einfaches Login-Formular hat. Wenn Sie Ihre Anmeldedaten eingeben, wird diese Information in der Regel an einen Server gesendet, der dann eine SQL-Abfrage ausführt, um zu überprüfen, ob die angegebenen Daten in der Datenbank vorhanden sind.

Ein Angreifer könnte versuchen, anstatt eines normalen Benutzernamens und Passworts einen speziellen String einzugeben, der die SQL-Abfrage verändert. Zum Beispiel:

' or '1'='1

Wenn dieser String in die SQL-Abfrage eingebaut wird, könnte die resultierende Abfrage etwa so aussehen:

SELECT * FROM users WHERE username = '' or '1'='1' AND password = '...'

Da die Bedingung '1'='1' immer wahr ist, würde die Abfrage alle Benutzer aus der Datenbank zurückgeben, unabhängig vom eingegebenen Passwort.

Arten von SQL-Injections

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:

' or '1'='1

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.

Schutz vor SQL-Injections

Gegenmaßnahmen

Um sich vor SQL-Injections zu schützen, sollten Parametrisierte Abfragen bzw. Prepared Statements eingesetzt werden. Damit werden Benutzereingaben von SQL-Code getrennt und nicht von der Datenbank ausgeführt.

Zusätzlich können folgende Maßnahmen ergriffen werden:

  • Stored Procedures: Kapseln Sie häufig verwendete SQL-Abfragen in Stored Procedures ein.
  • Least Privilege: Gewähren Sie Benutzern und Anwendungen nur die minimal erforderlichen Berechtigungen.
  • Web Application Firewall (WAF): Eine WAF kann helfen, SQL-Injections und andere Angriffe abzuwehren.
  • Input-Validation: Prüfen Sie, ob die von einem Benutzer bereitgestellten Daten bestimmten Kriterien entsprechen.
  • Input-Sanitization: Entfernen Sie Daten, die potenziell schädlich sind.

Mit Input-Validation und -Sanitization sollten Sie allerdings Vorsicht bewahren, da gültiger Inhalt geblockt werden könnte. Es gibt z.B. Namen, die das Hochkomma enthalten. Setzt man eine Blacklist ein, die das Hochkomma blockiert oder entfernt, dann werden z.B. Nutzer mit dem Namen O'Neil ausgesperrt.

Sicherheitsüberprüfungen

Es ist sehr wichtig, regelmäßig Sicherheitsüberprüfungen durchzuführen, damit sichergestellt ist, dass auch alle Maßnahmen greifen.

Wenden Sie sich gerne an uns für eine unverbindliche Beratung:

Zusammenfassung

SQL-Injections stellen eine ernstzunehmende Bedrohung für Webanwendungen dar. Durch ein Verständnis der verschiedenen Arten von SQL-Injections und die Umsetzung geeigneter Schutzmaßnahmen können Entwickler und Administratoren das Risiko erheblich reduzieren.