Mithilfe von SQL-Injection können Angreifer in der SQL-Datenbank eines Opfers nicht autorisierte Datenbankbefehle ausführen.
Nach Lektüre dieses Artikels können Sie Folgendes:
Ähnliche Inhalte
Sichere Webanwendungen
Cross-Site-Request-Forgery
Was ist eine Datenschutzverletzung?
Pufferüberlaufangriff
Was sind die OWASP Top 10?
Abonnieren Sie theNET, Cloudflares monatliche Zusammenfassung der beliebtesten Einblicke in das Internet!
Link zum Artikel kopieren
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.
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:
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,
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.
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:
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;
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.
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:
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.