Schutz vor SQL-Injection

So funktioniert der Angriff auf Ihre Datenbank

Jens Dose ist Redakteur der COMPUTERWOCHE und betreut in erster Linie Themen rund um IT-Sicherheit, Datenschutz und Compliance.
SQL-Injection (SQLi) ist eine der häufigsten Angriffsarten auf Datenbanken über Web-Anwendungen. Erfahren Sie, wie die Hacker vorgehen, wo die Hauptrisiken liegen und wie Sie Ihr Unternehmen schützen können.

Relationale Datenbankmanagementsysteme (RDBMS) wie Oracle, MySQL und Microsoft SQL Server gehören laut dem aktuellen DB-Engines-Ranking zu den populärsten im Markt. Da sie als sehr zuverlässig gelten und Inkonsistenzen in den Datensätzen vermeiden, sind sie seit Jahrzehnten als etablierter Standard für Datenbanken in den meisten Unternehmen gesetzt.

Um die Daten darin abzufragen und zu bearbeiten, kommt in der Regel die Datenbanksprache Structured Query Language (SQL) zum Einsatz. So kommunizieren Anwender beispielsweise über eine Maske für Produktsuche in einem Webshop mit einem Server, der wiederum eine Datenbank abfragt und die Ergebnisse an den Webshop als Suchergebnis zurückspielt.

Auf diesem Weg sind die gespeicherten Informationen anfällig für sogenannte SQL-Injection (SQLi), die beliebigen Code in Datenbankabfragen einschleust. So ist es möglich, Informationen unerlaubt auszulesen oder zu verändern. Im schlimmsten Fall erlangen die Eindringlinge Kontrolle über die gesamte Datenbank.

SQL Injection
SQL Injection
Foto: Maxx-Studio - shutterstock.com

Simpler Dauerbrenner

Die Angriffsmethode wurde 1998 entdeckt und gilt seitdem als eine der hartnäckigsten Bedrohungen. Unter den Top 10 Sicherheits-Risiken für Web-Anwendungen (PDF), die regelmäßig von dem unabhängigen Open Web Application SecuritySecurity Project (OWASP) veröffentlicht werden, nahm SQLi 2017 erneut den ersten Platz ein. Nicht zu Unrecht. So wurde erst kürzlich auf der Webseite des kanadischen Internet Service Poviders Altima ein Glitch (ein Software- bzw. Programmierfehler, der zu Fehlverhalten von Computerprogrammen führt) entdeckt, über den es möglich war, mit einer sogenannten blinden SQL-Injection (dazu später mehr) auf eine umfangreiche Kundendatenbank zuzugreifen. Alles zu Security auf CIO.de

Ein Grund, warum SQLi bei Hackern so beliebt ist, könnte darin liegen, dass es eine sehr einfache Attacke ist. Auf der diesjährigen DEF CON Hackerkonferenz in Las Vegas konnte ein elfjähriges Kind eine Kopie der Website für die Darstellung der Wahlergebnisse im US-Staat Florida in nur zehn Minuten via SQLi hacken und manipulieren.

Auf der anderen Seite sind die Maßnahmen zur Verteidigung ebenso simpel wie wirksam. Im Folgenden werden verschiedene Arten von SQLi beschrieben und Möglichkeiten zur Abwehr vorgestellt.

Zwielichtige Typen

Egal um welchen Typus von SQL-Injection es sich handelt, bei jedem schleust der Angreifer beliebigen SQL-Code in die Datenbankabfrage einer Web-Applikation ein. Dies kann auf verschiedenen Wegen passieren.

Die einfachste Angriffsform erfolgt über eine Nutzereingabe. Web-Applikationen akzeptieren Input normalerweise über ein Formular. Das Frontend leitet dann die Eingabe an die Datenbank im Backend zur Verarbeitung weiter. Wenn die Web-Anwendung dabei den Input nicht bereinigt, ist es möglich, über injizierte SQL-Eingaben Datenbankinhalte zu löschen, zu kopieren oder zu verändern.

Angreifer können auch Cookies verändern, so dass sie die Abfrage der Web-Anwendung infizieren. Cookies speichern Informationen zum Client-Status auf der lokalen Festplatte. In der Regel laden Web-Applikationen Cookies, um diese Informationen zu verarbeiten. Ein böswilliger Nutzer oder MalwareMalware kann sie dahingehend modifizieren, dass sie SQL-Befehle in die Backend-Datenbank einspeisen. Gleiches ist über Server-Variablen wie HTTP-Header möglich. Gefälschte Header, die beliebige SQL enthalten, können diesen Code in die Datenbank einschleusen, wenn die Web-Applikation auch diesen Input nicht bereinigt. Alles zu Malware auf CIO.de

Unter den Typus der blinden SQL-Injection fallen Angriffe auf Web-Anwendungen, die zwar SQLi nicht aktiv abwehren, jedoch die Ergebnisse der Injektion nicht sichtbar ausgeben. Sie zeigen stattdessen entweder keine offensichtliche Reaktion, oder beispielsweise allgemeine Fehlermeldungen an, dass die Syntax der SQL-Abfrage nicht korrekt ist. Die Seite liefert in diesem Fall zwar keine Daten, sie stellt sich aber abhängig von den Ergebnissen einer in der legitimen SQL eingeschleusten logischen Anweisung minimal anders dar.

Die Informationen werden bei dieser Methode also nicht direkt, sondern über eine Reihe von Wahr-oder-Falsch-Anfragen identifiziert und aus der Datenbank abgezogen. Diese Methode gilt als sehr zeitaufwändig. Sobald aber die Schwachstelle und die gewünschten Informationen gefunden sind, kann die Attacke über eine Reihe von Tools automatisiert werden.

SQL-Injection-Angriffe zweiter Ordnung gehören zu den hinterhältigsten, da sie nicht sofort, sondern zu einem späteren Zeitpunkt in Aktion treten. Solche schädlichen, aber inaktiven SQL-Kommandos können von der Anwendung korrekt kodiert und als valide SQL in der Datenbank gespeichert werden. Führt daraufhin ein anderer Teil der Applikation, der womöglich nicht gegen SQLi geschützt ist, die gespeicherte SQL-Anweisung in einem anderen Kontext aus, startet der zeitversetzte Angriff.

Beispiel einer einfachen SQLi-Attacke

Angenommen, ein Unternehmen hat eine Web-Anwendung gebaut, in der Kunden über die Eingabe ihrer Kundennummer ihr Profil aufrufen können. Das Frontend der App leitet die eingegebene Nummer in das Backend. Die Datenbank führt dort einen SQL-Aufruf aus und liefert das Resultat zurück an die Anwendung, die es dem Nutzer anzeigt.

Unser Nutzer gibt also im Frontend seine Nummer 1234567 ein.

Die Abfrage im Backend könnte in etwa so aussehen:

SELECT *

FROM customers

WHERE customer_id = '1234567'

Nehmen wir an, der Nutzer gibt stattdessen folgende Kundenummer in ein Feld des Web-Formulars ein:

1234567; DELETE * customers WHERE '1' = '1

Die Datenbank im Backend würde dann diese SQL ausführen:

SELECT *

FROM customers

WHERE customer_id = '1234567';

DELETE *

FROM customers

WHERE 'x' = 'x'

Datenbanken führen mehrere SQL Statements der Reihe nach aus, wenn sie durch ein Semikolon (;) getrennt sind. Wird die Eingabe nicht hinsichtlich des einfachen Anführungszeichens (') bereinigt, können Angreifer die gesamte Tabelle löschen.

Das ist ein bewusst einfaches Beispiel, aber jede SQLi funktioniert nach demselben Prinzip: Durch unbereinigten Input über eine Web-Anwendung wird in der Datenbank beliebiger SQL-Code ausgeführt.

Eingaben bereinigen, Zugiffsrechte beschränken und die Verwendung von Stored Procedures sowie Prepared Statements heben das grundlegende Schutzniveau gegen SQLi erheblich.
Eingaben bereinigen, Zugiffsrechte beschränken und die Verwendung von Stored Procedures sowie Prepared Statements heben das grundlegende Schutzniveau gegen SQLi erheblich.
Foto: Joe Techapanupreeda - shutterstock.com

Feuer mit Feuer bekämpfen

Da SQLi-Angriffe relativ einfach gestrickt sind, dauerte es nicht lange, bis sie automatisiert wurden. Tools wie SQLninja, SQLmap oder Havij stehen sowohl Angreifern, als auch Verteidigern zur Verfügung und ermöglichen es Unternehmen, ihre Web-Anwendungen auf Schwachstellen gegen SQLi hin zu testen.

SQLmap ist zum Beispiel eine gute Option, da es beinahe jede größere Datenbank unterstützt, darunter MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2 und SAP MaxDB. Es ist für alle gängigen Betriebssysteme verfügbar und erkennt die bekanntesten Injection-Schlupflöcher in Web-Anwendungen. Damit lässt sich schnell feststellen, ob die Maßnahmen, den Input zu reinigen, auch tatsächlich wirken.

SQLi entdecken

Um SQL-Injection-Angriffe zu entdecken, bieten sich zwei Möglichkeiten an. Eine Web Application Firewall (WAF) kann eingehenden Traffic gemäß vorher festgelegter Regeln auf manipulative Eingaben untersuchen und gegebenenfalls abwehren. In Bezug auf die Überwachung der Datenbank selbst ist ein Intrusion Detection System (IDS) nützlich. Ein netzwerkbasiertes IDS überwacht alle Verbindungen zur Datenbank und schlägt bei verdächtigen Aktivitäten Alarm. Ein Host-basiertes IDS behält die Log-Dateien des Web-Servers im Blick und meldet Unregelmäßigkeiten.

SQLi verhindern

Eine umfassende und detaillierte Beschreibung aller einschlägigen Schutzmaßnahmen finden Sie im SQL Injection Prevention Cheat Sheet von OWASP. Im Folgenden stellen wir eine Auswahl der wichtigsten vor.

Wie bei dem Großteil aller Angriffsflächen auf die Unternehmens-IT gilt auch hier: Eine gute Patch-Hygiene löst viele Probleme. Regelmäßig werden Schwachstellen von Anwendungen und Datenbanken aufgedeckt und behoben, die HackerHacker für SQL-Injection nutzen können. Daher ist es wichtig, Patches und Updates stets aktuell zu halten. Alles zu Hacker auf CIO.de

Für den grundlegenden Schutz gilt es, den Datenbankzugriff über SQL derart zu regeln, dass ausnahmslos alle Eingaben vor der Ausführung bereinigt werden. Das bedeutet, ungewöhnliche Schriftzeichen, die auf eine Manipulation hindeuten, nicht zu erlauben und Maßnahmen wie Escape-Sequenzen einzusetzen, die sicherstellen, dass Eingaben nicht versehentlich als Kommandos übernommen werden. Zudem empfiehlt es sich, alle Eingaben nach Kontext zu filtern. Eine Telefonnummer sollte beispielsweise nur nummerische Eingaben erlauben. Sogenannte Prepared Statements verhindern, dass der Zweck einer Abfrage verändert wird, selbst wenn ein Angreifer anderslautende Kommandos eingibt.

Für den Fall, dass trotz der Reinigung ein Schlupfloch besteht, gilt es, die Account-Privilegien von Datenbanknutzern zu beschränken. Dabei sollte das Prinzip der minimalen Berechtigungen angewandt werden. Die Applikation besitzt dabei gerade so viel Handlungsspielraum, dass sie ihre Aufgabe erfüllt - keine darüber hinaus. So kann die Web-Anwendung beispielsweise lediglich Lese- aber keine Schreibrechte erhalten. Zudem sollten Befehle wie "DROP TABLES", der die gesamte Datenbank löscht, nicht ausführbar sein.

Auch Stored Procedures, also Funktionen, die mit einem einzelnen Aufruf eine Abfolge gespeicherter Befehle in der Datenbank ausführen, machen SQLi schwerer - wenn auch nicht ganz unmöglich. Muss die Web-Anwendung nur wenige SQL-Abfragen ausführen, sollten dafür Stored Procedures geschrieben werden. In der Regel ist nur der Datenbankadministrator berechtigt, sie zu erstellen und zu bearbeiten. Dabei gilt es darauf zu achten, dass viele Datenbanken bereits vorgefertigte Stored Procedures besitzen, die den Angreifern wahrscheinlich bekannt sind. Wenn diese nicht absolut notwendig sind, sollten sie entfernt werden.

Sorgfalt ist der beste Schutz

SQL-Injection ist einer der simpelsten Angriffsvektoren auf Unternehmensdaten und daher können ihn auch wenig versierte Angreifer ausnutzen, um großen Schaden anzurichten. Genau so einfach ist es aber auch für Unternehmen, diese offene Flanke zu schließen. Dazu gilt es lediglich, die Kommunikation zwischen Web-Anwendung und Datenbank mit ein wenig Sorgfalt einzurichten und ein paar Schutzmaßnahmen zu implementieren.

Zur Startseite