Was ist SQL-Injection?

Mithilfe von SQL-Injection können Angreifer in der SQL-Datenbank eines Opfers nicht autorisierte Datenbankbefehle ausführen.

Lernziele

Nach Lektüre dieses Artikels können Sie Folgendes:

  • SQL-Injection definieren
  • Wie funktioniert SQL-Injection?
  • Wie verteidigt man sich gegen SQL-Injection?
  • Zusammengesetzte SQLi-Angriffe untersuchen

Ähnliche Inhalte


Möchten Sie noch mehr erfahren?

Abonnieren Sie theNET, Cloudflares monatliche Zusammenfassung der beliebtesten Einblicke in das Internet!

Lesen Sie die Cloudflare Datenschutzrichtlinie, um zu erfahren, wie wir Ihre persönlichen Daten sammeln und verarbeiten.

Link zum Artikel kopieren

Was ist SQL-Injection (SQLi)?

Structured Query Language (SQL*) Injection ist eine Code-Injection-Technik, mit der Daten in SQL-Datenbanken geändert oder abgerufen werden. Durch das Einfügen spezieller SQL-Anweisungen in ein Eingabefeld können Angreifer Befehle ausführen, die das Abrufen von Daten aus der Datenbank, die Zerstörung sensibler Daten oder andere manipulative Verhaltensweisen ermöglichen.

Mit der richtigen Ausführung des SQL-Befehls kann ein nicht autorisierter Benutzer die Identität eines berechtigten Benutzers fälschen, sich selbst oder andere zu Datenbankadministratoren machen, vorhandene Daten manipulieren, Transaktionen und Salden ändern und alle Serverdaten abrufen und/oder zerstören.

Beim modernen Computing erfolgt die SQL-Injection normalerweise über das Internet, indem böswillige SQL-Abfragen an einen API-Endpunkt gesendet werden, der von einer Website oder einem Dienst bereitgestellt wird (dazu später mehr). Im schlimmsten Fall kann die SQL-Injection Angreifern den Root-Zugriff auf einen Computer ermöglichen und ihnen die vollständige Kontrolle übergeben.

*SQL ist eine Programmiersprache, mit der die meisten Datenbanken arbeiten.

Wie funktioniert ein SQL-Injection-Angriff?

Stellen Sie sich einen Gerichtssaal vor, in dem einem Mann namens Bob der Prozess gemacht wird, welcher kurz davor steht, vor dem Richter zu erscheinen. Wenn Bob vor dem Prozess die Unterlagen ausfüllt, schreibt er seinen Namen als „Bob steht es frei zu gehen“. Als der Richter zu seinen Fall kommt und laut vorliest: „Aufruf: Bob steht es frei zu gehen“, lässt der Gerichtsdiener Bob gehen, weil der Richter es gesagt hat.

Obwohl es geringfügig unterschiedliche Varianten von SQLi gibt, ist die Hauptschwachstelle im Wesentlichen dieselbe: Ein SQL-Abfragefeld, das für einen bestimmten Datentyp reserviert werden soll, z. B. eine Zahl, erhält stattdessen unerwartete Informationen wie z. B. einen Befehl. Wenn der Befehl ausgeführt wird, geht er über die beabsichtigten Grenzen hinaus und lässt potentiell schädliches Verhalten zu. Ein Abfragefeld wird normalerweise mit Daten gefüllt, die in ein Formular auf einer Webseite eingegeben wurden.

Sehen wir uns einen einfachen Vergleich zwischen normalen und böswilligen SQL-Anweisungen an:

Normale SQL-Abfrage:

In dieser normalen SQL-Abfrage wird die Zeichenfolge studentId an eine SQL-Anweisung übergeben. Ziel ist es, die Liste der Schüler nach einem Schüler zu durchsuchen, der die eingegebene studentId hat. Sobald der Datensatz des Schülers gefunden wurde, wird er zurückgegeben. Einfach ausgedrückt lautet der Befehl "Geh, finde diesen Benutzer und gib mir seine Daten".

Der Code könnte ungefähr so aussehen:

studentId = getRequestString("studentId");
lookupStudent  = "SELECT * FROM students WHERE studentId = " + studentId
   

Wenn ein Schüler eine Schüler-ID von 117 in ein Websiteformular mit der Bezeichnung "Bitte geben Sie Ihre Schüler-ID ein" eingibt,

normales Formularfeld

dann sieht die entsprechende SQL-Anfrage so aus:

SELECT * FROM students WHERE studentId = 117;

Dieser Befehl gibt den Datensatz für den jeweiligen Schüler mit einer studentId zurück. Genau das erwartet der Entwickler, der die API geschrieben hat.

SQL-Injection-Abfrage:

In diesem Beispiel gibt ein Angreifer stattdessen einen SQL-Befehl oder eine bedingte Logik in das Eingabefeld ein. Er gibt eine Schüler-ID ein mit der Nummer:

Beispiel für ein SQL-Injection – Formularfeld

Die Abfrage durchsucht normalerweise die Datenbanktabelle nach der passenden ID. Jetzt sucht sie aber nach einer ID oder prüft, ob 1 gleich 1 ist. Wie zu erwarten ist, ist die Aussage für jeden Schüler in der Spalte wahr. Infolgedessen gibt die Datenbank alle Daten aus der Schülertabelle an den Angreifer zurück, der die Abfrage durchführt.

SELECT * FROM students WHERE studentId = 117 OR 1=1;
Infografik zur SQL-Injection

SQLi ist auf ein ungeschütztes Application Programming Interface (API) gerichtet. Eine API ist in diesem Fall die Softwareschnittstelle, über die ein Server Anfragen empfängt und auf diese reagiert.

Es gibt häufig verwendete Tools, mit denen böswillige Akteure automatisch eine Website nach Formularen durchsuchen und dann versuchen können, verschiedene SQL-Abfragen einzugeben, die eventuell eine Antwort generieren, die die Softwareentwickler der Website nicht beabsichtigten, und so die Datenbank ausspähen.

SQL-Injections lassen sich einfach implementieren und interessanterweise auch ziemlich leicht verhindern, wenn die richtigen Entwicklungsverfahren eingesetzt werden. Die Realität sieht anders aus. Knappe Fristen, unerfahrene Entwickler und veralteter Code führen oft genug zu schwankender Codequalität und wechselnden Sicherheitsverfahren. Ein einziges angreifbares Feld auf einem beliebigen Formular oder API-Endpunkt einer Website, die Zugriff auf eine Datenbank hat, kann ausreichen, um eine Sicherheitslücke zu finden.

Wie wird ein SQL-Injection-Angriff verhindert?

Es gibt eine Reihe von Methoden, um das Risiko einer Datenschutzverletzung mithilfe von SQL-Injection zu verringern. Als Best Practice sollten mehrere Strategien eingesetzt werden. Untersuchen wir jetzt einige der gebräuchlichsten Implementierungen:

  • Verwendung von Prepared Statements (mit parametrisierten Abfragen). Bei dieser Methode zum Bereinigen von Datenbankeingaben müssen die Entwickler zunächst den gesamten SQL-Code definieren und dann nur bestimmte Parameter an die SQL-Abfrage weitergeben. Die einzugebenden Daten haben einen explizit festgelegten Umfang, den sie nicht überschreiten können. Auf diese Weise kann die Datenbank unabhängig von der Art der im Eingabefeld angegebenen Daten unterscheiden zwischen Daten, die eingegeben werden, und Code, der ausgeführt werden soll. Einige ORM-Bibliotheken (Object Relational Mapping – Objektrelationale Abbildung) werden üblicherweise für diesen Zweck verwendet, da manche Versionen Datenbankeingaben automatisch bereinigen.
  • Entfernen aller von Benutzern gemachten Eingaben. Beim Schreiben von SQL haben bestimmte Zeichen oder Wörter eine bestimmte Bedeutung. Zum Beispiel bedeutet das Zeichen „*“ „any“ und das Wort „OR“ ist Teil einer Bedingung. Um Benutzer zu stoppen, die diese Zeichen versehentlich oder böswillig in eine API-Anfrage an die Datenbank eingeben, können vom Benutzer bereitgestellte Eingaben Escapezeichen erhalten. Mit einem Escapezeichen wird die Datenbank angewiesen, es nicht als Befehl oder Bedingung zu interpretieren, sondern als literale Eingabe zu behandeln.
  • Verwendung gespeicherter Prozeduren. Obwohl gespeicherte Prozeduren allein noch keine solide Sicherheitsstrategie darstellen, können sie dazu beitragen, das mit der SQL-Injection verbundene Risiko zu begrenzen. Durch eine geeignete Einschränkung der Berechtigungen für das Datenbankkonto, auf dem SQL-Abfragen ausgeführt werden, fehlen unseriösem Anwendungscode, der für die SQL-Injection anfällig ist, die erforderlichen Berechtigungen zum Manipulieren unabhängiger Datenbanktabellen. Gespeicherte Prozeduren können auch den Typ der Eingabeparameter überprüfen, was die Eingabe von Daten verhindert, die nicht dem Typ entsprechen, für den das Feld vorgesehen ist. In Fällen, in denen statische Abfragen nicht ausreichen, sollten gespeicherte Prozeduren normalerweise vermieden werden.
  • Durchsetzen von minimalen Rechten. In der Regel ist es in allen Instanzen, in denen eine Website dynamisches SQL verwenden muss, wichtig, die Gefährdung durch SQL-Injection zu reduzieren, indem die Berechtigungen auf den engsten Bereich beschränkt werden, der zum Ausführen der entsprechenden Abfrage erforderlich ist. In seiner offensichtlichsten Form bedeutet das, dass ein Administratorkonto in keinem Fall SQL-Befehle infolge eines API-Aufrufs einer nicht autorisierten Anfrage ausführen sollte. Während gespeicherte Prozeduren am besten für statische Abfragen eingesetzt werden, kann das Umsetzen des Prinzips der minimalen Rechte dazu beitragen, das Risiko bei dynamischen SQL-Abfragen zu verringern.

Was ist ein zusammengesetzter SQL-Injection-Angriff?

Um Sicherheitsmaßnahmen zu umgehen, implementieren clevere Angreifer manchmal Multi-Vektor-Angriffe gegen eine Zielwebsite. Während ein einzelner Angriff zwar abgewehrt werden kann, kann er trotzdem in den Mittelpunkt der Aufmerksamkeit der Datenbankadministratoren und des Informationssicherheitsteams rücken. DDoS-Angriffe, DNS-Hijacking und andere Störverfahren dienen mitunter als Ablenkungsmanöver, um weitreichende SQL-Injection-Angriffe zu implementieren. Infolgedessen bietet eine umfassende Strategie zur Schadensbegrenzung den größtmöglichen Schutz. Cloudflares Web Application Firewall, DDoS-Abwehr und DNS-Sicherheit sind Kernelemente einer ganzheitlichen Sicherheitsstrategie.