Glossar

SQL-Injection

Was ist SQL Injection?

Bei den meisten Webanwendungen läuft auf dem Server eine Datenbank im Hintergrund, die sämtliche Informationen speichert. Der Zugriff erfolgt über eine Abfragesprache wie zum Beispiel SQL (Structured Query Language). SQL ist eine eigenständige Programmiersprache mit umfangreichen Funktionen. Bei einer SQL Injection nutzen Cyberkriminelle eine Schwachstelle in einem System mit einer SQL-Datenbank aus und fügen schadhaften Code ein. Möglich sind SQL Injections zum Beispiel dann, wenn Benutzereingaben aus einem Formular direkt in den SQL-Interpreter gelangen. Das Problem: Die Benutzereingaben können Zeichen beinhalten, die der SQL-Interpreter als Sonderfunktionen erkennt und so die Veränderung von Datenbankbefehlen möglich macht. Der Einsatz der Funktionszeichen ermöglicht das Einschleusen weiterer SQL-Befehle.
Das Ziel: Daten stehlen oder manipulieren oder das gesamte System übernehmen. Erfolgreich ist diese Angriffsform bei Webseiten, deren Benutzereingaben nicht ausreichend überprüft werden. Die Eingaben können Zeichen oder Metazeichen wie Anführungszeichen, Backslash und Semikolon beinhalten, die der Interpreter als Sonderzeichen erkennt und mit bestimmten Aktionen verbindet. In der Folge ist die Einflussnahme auf Datenbankbefehle möglich. Nimmt das Programm, die App oder das Formular der Webseite die Maskierung der eingegebenen Zeichen nicht korrekt vor, können Angreifer SQL-Befehle einschleusen, Daten verändern und Abfragen manipulieren. Im schlimmsten Fall erhält der Cyberkriminelle Zugriff auf eine Shell und im Anschluss auf den gesamten Server.

Wie erkenne ich SQL Injections?

Die Angriffsformen der SQL Injections gibt es seit den ersten Webanwendungen mit Datenbankanbindung. In der Vergangenheit waren meist große Anwendungen von den Angriffen betroffen. Verschiedene Systeme erkennen Angriffe auf den Server frühzeitig, können Alarm schlagen und teilweise automatisch geeignete Gegenmaßnahmen einleiten. Sinnvoll kann ein Application Layer Gateway sein, das für die Überwachung des Datenverkehrs zwischen Webbrowser und Anwendung zuständig ist. Wenn Anmeldedaten nicht mehr funktionieren, Seiteninhalte verändert sind oder plötzlich seltsame Weiterleitungen stattfinden, hat sich ein Angreifer möglicherweise über SQL Injections Zugriff zur Datenbank und dem gesamten System verschafft.

Wie kann ich SQL Injections verhindern?

Für einen umfangreichen Schutz des Servers kommen Intrusion-Detection-Systeme (IDS) oder Intrusion-Prevention-Systeme (IPS) zum Einsatz. Benutzereingaben darf das Programm oder die Webseite nicht einfach und ohne Maskierung in eine SQL Anweisung einbauen. Anführungszeichen und andere Metazeichen müssen zur Sicherheit durch das Escapen der Eingabe maskiert werden, damit der SQL Interpreter diese ignoriert. Als Regel gilt: Verantwortlich für die Überprüfung der gemachten Benutzereingaben ist die Webanwendung, diese muss alle Eingaben auf Korrektheit überprüfen und die Metazeichen richtig maskieren. Alternativ empfiehlt sich die Verwendung von sogenannten Prepared Statements. Dabei werden die Daten nicht interpretiert und eine SQL Injection ist auf diesem Weg ausgeschlossen. Wenn der Serverbetreiber keinen Einfluss auf die laufenden Anwendungen nehmen kann, ist ein Schutz mithilfe einer Web Application Firewall (WAF) zumindest teilweise möglich. Wirklicher Schutz ist mit Defense-in-Depth möglich, dabei handelt es sich um einander ergänzende Sicherheitsmaßnahmen, die auf mehreren Ebenen einen Schutzmechanismus bilden. Auf der Seite der Datenbank sollten alle Benutzer nur mit angemessenen Berechtigungen ausgestattet sein. Nicht verwendete Funktionen sollten zur Sicherheit deaktiviert werden und die Datenbankprotokollierung ist zu aktiveren. Regelmäßige Backups sind selbstverständlich. Bei MySQL ist es beispielsweise möglich, die Ausführung mehrerer SQL-Anweisungen in einer Abfrage zu unterbinden.
Die wichtigste Gegenmaßnahme ist das Maskieren (Escapen) der Benutzereingaben, die Gefahr von SQL-Injections wird damit gemildert oder ganz beseitigt. Am besten werden die Daten vom SQL-Interpreter ferngehalten und gebundene Parameter in Prepared Statements verwendet. Dabei erfolgt die Übergabe der Daten in Form eines Parameters an einen bereits kompilierten Befehl.

Beispiel für Microsoft .NET Framework und C

Die verschiedenen Programmiersprachen integrieren unterschiedliche Möglichkeiten und Funktionen für die Kommunikation mit der Datenbank. Es gilt rohe SQL-Befehle zu vermeiden, zum Beispiel gibt es dafür im .NET Framework einfache Objekte.
Riskant ist das Kommando:
SqlCommand sqlcmd = new SqlCommand ("SELECT feld1 FROM tabelle1 WHERE feld2 = '" + feld2Wert + "';");
Besser schreibt man folgendes:
string feld2Wert = "Der Wert";
SqlCommand sqlcmd = new SqlCommand ("SELECT feld1 FROM tabelle1 WHERE feld2 = @feld2Wert;");
sqlcmd.Parameters.AddWithValue("@feld2Wert", feld2Wert);)
Auf diese Weise werden die Daten von der SQL-Anweisung getrennt.
SQL-Injections stellen eine nicht zu unterschätzende Gefahr dar. Eine fehlende Maskierung von Benutzereingaben macht das Auslesen, Manipulieren oder Löschen von gespeicherten Daten möglich. Die Gegenmaßnahmen bieten bei korrekter Umsetzung einen guten Schutz. Zur Sicherheit escapen viele Frameworks die Befehle inzwischen automatisch und der Webentwickler muss sich damit nicht speziell beschäftigen. Anwender müssen sämtliche Softwareanwendungen immer auf dem aktuellen Stand halten, die Softwareentwickler schließen neu erkannte Sicherheitslücken in ihren Programmen und stellen Updates bereit.