Startseite " SQL Injection 101: Was ist SQLi und wie verhindert man Angriffe?

SQL Injection 101: Was ist SQLi und wie verhindert man Angriffe?

August 06, 2022 - Sicherheit

Was ist SQL-Injektion?

SQL-Injection (SQLi) ist eine Angriffsart, die es Kriminellen ermöglicht, bösartige SQL-Anweisungen in anfälligen Webanwendungen auszuführen. Angreifer können auf sensible Daten wie Kundeninformationen, persönliche Daten, Geschäftsgeheimnisse und mehr zugreifen, indem sie die Sicherheitsmaßnahmen von Anwendungen umgehen. Im Folgenden werden wir SQL-Injektion erörtern, wie sie funktioniert und wie Sie Angriffe verhindern können.

SQL-Injection-Angriffe können auf jeder Website vorkommen, die eine SQL-Datenbank verwendet. Diese Art von Angriff ermöglicht es Angreifern, Zugang zu Ihren wichtigen Daten zu erhalten. Sie können Verbraucherinformationen, persönliche Daten, Geschäftsgeheimnisse und geistiges Eigentum einsehen. Laut OWASP handelt es sich dabei um eine der schwersten Arten von Angriffen auf Webanwendungen.

Arten der SQL-Injektion

Arten der SQL-Injektion

In-Band SQLi

In-Band-SQL-Injection ist ein Angriff, bei dem der Angreifer denselben Kanal zum Senden und Empfangen von Abfragen verwendet. In-band bedeutet, dass die Antwort über dasselbe Kommunikationsmedium eingeholt wird. Das Ziel des Angreifers ist es, die Antwort sofort in einem Webbrowser zu erhalten, wenn dies bei der manuellen Durchführung des Angriffs mit einem Webbrowser möglich ist.

Beispiel einer In-Band-SQL-Injektion

Die häufigste Methode für einen Angreifer, eine In-Band-SQL-Injection durchzuführen, besteht darin, die Anfrage so zu ändern, dass er die persönlichen Daten des aktuellen Benutzers sehen kann. Dies kann durch Änderung des Wertes geschehen, der als Teil der Anfrage gesendet wird. Wenn die Anweisung zum Beispiel den Namen des Benutzers anzeigen sollte, könnte der Angreifer sie so ändern, dass stattdessen der Name des Benutzers angezeigt wird.

SELECT * FROM users WHERE user_id LIKE 'current_user'

Fehlerbasiertes SQLi und unionsbasiertes SQLi sind die beiden häufigsten Formen von In-Band-SQL-Injection.

Fehlerbasiertes SQLi

Eine fehlerbasierte SQLi-Technik ist ein In-Band-SQL-Injection-Ansatz, der die Fehlermeldungen des Datenbankservers nutzt, um die Architektur der Datenbank zu ermitteln. Die fehlerbasierte SQL-Injektion ist die häufigste Art der In-Band-SQL-Injektion.

Beispiel für fehlerbasiertes SQLi:

Wenn ein Angreifer versucht, sich mit den folgenden Anmeldedaten anzumelden:

Benutzername: ' OR 'a'='aPasswort: beliebig

Die Datenbank gibt einen Fehler zurück, da die Anweisung syntaktisch falsch ist. Die Fehlermeldung gibt Informationen über die Datenbank preis, die der Angreifer zu seinem Vorteil nutzen kann.

Unionsbasiertes SQLi:

In-Band-SQL-Injektion ist eine Möglichkeit, Informationen von einer Website zu erhalten, indem der UNION-Operator verwendet wird, um die Ausgaben von zwei oder mehr SELECT-Anweisungen zu kombinieren.

Blinde SQL-Injektion

Blind SQL Injection ist ein Angriff, bei dem der Angreifer versucht, Antworten von der Datenbank zu erhalten, indem er Fragen stellt, die zu einer richtigen oder falschen Antwort führen. Der Angreifer verwendet Fehlermeldungen, um zu sehen, ob die Anwendung anders reagiert, wenn ein bestimmter Code verwendet wird.

Wenn ein Hacker SQL-Injection verwendet, kann die Webanwendung kritische Datenbankwarnungen anzeigen, die besagen, dass die SQL-Abfragesyntax falsch ist. Die blinde SQL-Injektion funktioniert genauso wie die herkömmliche SQL-Injektion, mit dem Unterschied, dass die Daten aus der Datenbank beschafft werden. Wenn eine Datenbank nicht genügend Informationen für einen Angreifer enthält, muss dieser eine Reihe von Fragen stellen, um Daten zu erhalten.

Die blinde SQL-Injektion wird unterteilt in blind-boolesches SQLi und blind-zeitbasiertes SQLi.

Boolesches Blind SQLi

Boolesche Blind-SQL-Injektion ist ein Angriff, bei dem der Angreifer versucht, Antworten von der Datenbank zu erhalten, indem er Fragen stellt, die zu einer wahren oder falschen Antwort führen. Der Angreifer verwendet Fehlermeldungen, um zu sehen, ob die Anwendung anders reagiert, wenn ein bestimmter Code verwendet wird.

Beispiel für boolesches Blind SQLi:

Wenn ein Angreifer den Datenbanktyp herausfinden möchte, verwendet er die folgende Anweisung:

SELECT * FROM users WHERE user_id LIKE 'current_user' and database() like '%type%'

Wenn es sich bei der Datenbank um MySQL handelt, würde die Ausgabe etwa so aussehen:

Sie haben einen Fehler in Ihrer SQL-Syntax. Schauen Sie im Handbuch zu Ihrer MySQL-Server-Version nach, um die richtige Syntax bei 'and database() like '%type%" in der Zeile

Zeitbasierte Blind SQL-Injektion

Bei einem zeitbasierten Blindangriff wird ein SQL-Befehl mit Code an den Server gesendet, der die Ausführung von Abfragen verlangsamt.

Zeitbasierte Blindangriffe ermöglichen es Angreifern, Daten auf der Grundlage der Zugriffszeit zu extrahieren. Ein solcher Angriff wird als Blind- oder Inferenzinjektionsangriff bezeichnet. Dies ist eine Angriffsart, bei der keine Daten zwischen dem Angreifer und der Datenbank fließen, aber da es keine Reaktion gibt, wird sie auch als Blind-Injection-Angriff bezeichnet.

Die Antwortzeit zeigt an, ob die Antwort richtig oder falsch ist. Fällt die Antwort negativ aus, stellt der Angreifer eine weitere Anfrage. Diese Angriffstechnik ist langsam, weil der Hacker jedes Zeichen einzeln durchgehen muss, insbesondere bei Angriffen auf große Datenbanken.

Beispiel für blindes SQLi

In diesem Beispiel versucht der Angreifer festzustellen, ob der Benutzer mit der id=999 in der Datenbank existiert. Dazu verwendet er die folgende Anweisung:

IF(SUBSTRING((SELECT password FROM users WHERE user_id=999),0, LEN('secret'))='secret', SLEEP(30), 'false')

Wenn der Benutzer mit der ID 999 in der Datenbank existiert und sein Passwort geheim ist, wird die Anwendung 30 Sekunden lang schlafen. Die Anwendung gibt false zurück, wenn der Benutzer nicht in der Datenbank vorhanden ist.

Out-of-band SQLi

Jemand, der Daten stehlen will, kann SQL-Code auf eine Weise an einen Datenbankserver senden, die nicht Teil der üblichen Kommunikation zwischen dem Server und anderen Computern ist. Dies kann geschehen, indem Informationen über DNS- oder HTTP-Anfragen an den Server gesendet werden.

Die Antwort der Anwendung wird nicht davon beeinflusst, ob Daten zurückgegeben werden oder nicht, ob es ein Problem mit der Datenbank gibt oder nicht oder wie lange die Ausführung der Abfrage dauert. Out-of-band kann in Netzwerkinteraktionen verwendet werden, um Ereignisse nach Belieben auszulösen. Abhängig von einer injizierten Bedingung können diese bedingt aktiviert werden, um bitweise Erkenntnisse zu gewinnen.

Daten können auch über verschiedene Netzwerkprotokolle aus Netzwerkinteraktionen durchsickern. Das Bild zeigt die Anfrage, die von der Webanwendung an die Datenbank der App gesendet wird.

Beispiel für Out-of-Band-SQLi

In diesem Beispiel versucht der Angreifer festzustellen, ob ein bestimmter Benutzer in der Datenbank existiert. Dazu verwendet er die folgende Anweisung:

SELECT user_id FROM users WHERE username='$username' AND password='$password' LIMIT 0,0 UNION SELECT NULL,'' INTO OUTFILE '/var/opt/databases/$filename.php'; --

Die Anwendung gibt die Benutzer-ID zurück, wenn der Benutzer in der Datenbank existiert. Ist der Benutzer nicht in der Datenbank vorhanden, erstellt die Anwendung eine Datei, die PHP-Code enthält, der zur Ausführung von Systembefehlen verwendet werden kann. Der Angreifer kann diese Datei dann verwenden, um Befehle auf dem Server auszuführen.

Wie man eine SQL-Injektion verhindert

Der beste Schutz gegen SQL-Injection-Angriffe ist die Verwendung von Eingabevalidierung, vorbereiteten Anweisungen und parametrisierten Abfragen. Der Code sollte niemals direkt die Eingaben des Benutzers verwenden. Die Entwickler müssen alle Eingaben bereinigen und nicht nur die Eingaben in Web-Formularen wie z. B. Anmeldeformularen. Einfache Anführungszeichen sollten aus allen fragwürdigen Code-Komponenten entfernt werden. Es ist auch eine gute Idee, Datenbankprobleme auf Live-Sites zu verbergen, um zu vermeiden, dass sie versehentlich aufgedeckt werden. SQL-Injection kann Informationen über ein Datenbanksystem liefern, die Angreifer zu ihrem Vorteil nutzen können.

Wenn Sie ein Problem mit Ihrer Website feststellen, sollten Sie sie sofort offline nehmen und Ihren Hosting-Anbieter kontaktieren. Er kann Ihnen helfen festzustellen, ob Ihre Website kompromittiert wurde und welche Schritte Sie unternehmen müssen, um das Problem zu beheben. Stellen Sie in der Zwischenzeit sicher, dass alle Nutzer Ihrer Website über das Problem informiert sind und ihre Passwörter so schnell wie möglich ändern.

Präventionstipps zur Vermeidung von SQL-Injections

Es gibt einige Möglichkeiten, um SQL-Injection-Schwachstellen in Ihrer Programmiersprache und Datenbankeinrichtung zu vermeiden. Diese Techniken lassen sich bei den meisten Datenbanken anwenden, z. B. bei XML. Sie können diese Techniken nutzen, um Ihre Datenbanken sicherer zu machen.

1) Verwendung ordnungsgemäß konstruierter gespeicherter Prozeduren

Einsteiger sollten zunächst lernen, wie man Anweisungen mit Variablen erstellt. Dies ist einfacher als die Erstellung dynamischer Abfragen und auch leichter zu verstehen. Bei parametrisierten Abfragen erstellt der Entwickler den gesamten SQL-Code und liefert die einzelnen Parameter zu einem späteren Zeitpunkt. Diese Methode ermöglicht es der Datenbank, zwischen Quellcode und Informationen zu unterscheiden.

Mit Hilfe von vorbereiteten Anweisungen kann sichergestellt werden, dass das Ziel einer Abfrage nicht geändert wird, auch wenn jemand versucht, SQL-Anweisungen zu geben.

2) Eingabeüberprüfung der Zulassen-Liste

SQL-Abfragen verwenden Bindungsvariablen an bestimmten Stellen für Daten. Wenn Sie zum Beispiel Python verwenden, würden Sie die %s Platzhalter. Sie können einen regulären Ausdruck verwenden, um die Benutzereingabe anhand der Zulässigkeitsliste für die in jeder Bindungsvariablen zulässigen Zeichen zu überprüfen.

Wenn Sie JavaScript verwenden, können Sie \w um alphanumerische Zeichen und Unterstriche abzugleichen.

Die Zulassen-Liste sollte so spezifisch wie möglich sein, um Fehlalarme zu vermeiden.

Wenn Sie zum Beispiel nach einer US-Telefonnummer suchen, würden Sie den folgenden regulären Ausdruck verwenden:

/^\d{11}$/

Dies würde mit einer 11-stelligen Zeichenfolge übereinstimmen, die eine Telefonnummer sein könnte. Wenn jemand versuchen würde, etwas zu übermitteln wie 'abcdef', würde es nicht passen, und die Eingabe wäre ungültig.

So können Sie sicher sein, dass Ihre Daten sicher und zuverlässig sind. Wenn Sie Werte aus dem Code anstelle von Benutzerparametern verwenden müssen, ist das auch in Ordnung!

Nehmen wir jedoch an, dass Benutzerparameterwerte auf bestimmte Tabellen- und Spaltennamen abzielen. In diesem Fall sollten die Parameterwerte auf die entsprechenden Tabellen- und Spaltennamen abgebildet werden, um sicherzustellen, dass nicht validierte Benutzereingaben nicht in die Abfrage einfließen.

3) Whitelists verwenden

Filtern Sie Benutzereingaben nicht auf der Grundlage von schwarzen Listen mit schlechten Zeichen. Viel effektiver ist die Verwendung von Erlaubnislisten mit guten Zeichen, die in bestimmten Feldern erwartet werden. So werden SQL-Injection-Angriffe verhindert, bevor sie beginnen.

Lassen Sie zum Beispiel nur Ziffern und Bindestriche im Eingabefeld zu, wenn Sie eine Telefonnummer erwarten. Wenn Sie eine E-Mail-Adresse erwarten, lassen Sie nur Zeichen zu, die in einer E-Mail-Adresse gültig sind.

4) Verwenden Sie die aktuellsten Plattformen

PHP verfügt in älteren Webentwicklungsplattformen nicht über einen SQLi-Schutz. Verwenden Sie die aktuellste verfügbare Version der Programmierumgebung, der Sprache und der zugehörigen Technologien. Verwenden Sie in diesem Beispiel anstelle von PHP lieber PDO.

5) Scannen Sie Ihre Webanwendung regelmäßig

SQL-Injektionen können sehr schwer zu erkennen sein. Es ist wichtig, dass Sie Ihre Webanwendung regelmäßig auf Schwachstellen überprüfen.

6) Durchsetzung des "Least Privilege

Das Prinzip der geringsten Privilegien ist ein Sicherheitskonzept, das die Benutzer auf ein Minimum an Zugriffsrechten beschränkt, die sie für ihre Arbeit benötigen. Dazu gehört auch die Begrenzung der Anzahl der Benutzerkonten und der Berechtigungen, die diese Konten haben.

Least Restriction on Functionality (LRF) ist die Praxis und das Konzept der Beschränkung von Benutzerrechten, Konten und Computerprozessen auf die Ressourcen, die für grundlegende, akzeptable Aufgaben erforderlich sind. Dies trägt dazu bei, minimale Benutzerrechte oder Freigabeniveaus aufrechtzuerhalten, was für die effektive Erledigung von Aufgaben unerlässlich ist.

Least Privilege" ist ein Sicherheitsprinzip, das vorsieht, dass Anwendungen, Systeme und Geräte nur die Berechtigungen haben, die für die Ausführung einer bestimmten Aufgabe erforderlich sind. Auf diese Weise werden die Auswirkungen begrenzt, wenn es jemandem gelingt, eine Sicherheitslücke auszunutzen und Schaden anzurichten. Dies steht im Gegensatz dazu, Benutzern mehr Berechtigungen zu geben, als sie benötigen, was das Risiko eines erheblichen Schadens bei einem SQL-Angriff erhöht.

SQL Injection - Häufig gestellte Fragen

 
Was ist die häufigste SQL-Injection?

In-Band-SQL-Injection ist die häufigste Art von SQL-Injection-Angriffen. Sie tritt auf, wenn ein Angreifer denselben Kommunikationskanal nutzen kann, um die Nutzdaten zu übermitteln und Ergebnisse zu sammeln.

Was ist die beste Verteidigung gegen SQL-Injection?

Der beste Schutz gegen SQL-Injection ist die Verwendung parametrisierter Abfragen. Bei dieser Art von Abfrage werden Platzhalterwerte für Parameter verwendet, die erst zu einem späteren Zeitpunkt angegeben werden. Diese Methode ermöglicht es der Datenbank, zwischen Quellcode und Informationen zu unterscheiden.

Wie wird SQL-Injection erkannt?

SQL-Injection kann auf verschiedene Weise erkannt werden. Eine Methode ist die Verwendung einer Web Application Firewall (WAF). Eine WAF ist ein Stück Hardware oder Software, das zwischen einer Webanwendung und dem Internet sitzt. Sie prüft den Datenverkehr auf bösartige Aktivitäten und kann SQL-Injection-Angriffe blockieren.

Was ist eine SQL-Injektion zweiter Ordnung?

Eine SQL-Injektion zweiter Ordnung liegt vor, wenn ein Angreifer eine Nutzlast einschleusen kann, die von der Webanwendung gespeichert und später ausgeführt wird. Diese Art von Angriff ist schwieriger zu bewerkstelligen, da der Angreifer eine Möglichkeit haben muss, die Ausführung der gespeicherten Nutzdaten auszulösen.

Was ist eine blinde SQL-Injektion?

Blind SQL Injection ist ein Angriff, bei dem der Angreifer die Ergebnisse seiner Nutzlast nicht direkt sieht. Stattdessen müssen sie wahre oder falsche Anweisungen verwenden, um Informationen aus der Datenbank abzuleiten. Diese Art von Angriff ist schwieriger auszuführen, kann aber genauso gefährlich sein wie andere Arten von SQL-Injection.

Was ist eine gestapelte Abfrage?

Eine gestapelte Abfrage ist eine Art der SQL-Injektion, bei der der Angreifer mehrere Abfragen verwendet, um Informationen aus der Datenbank zu extrahieren. Diese Art von Angriff ist schwieriger auszuführen, kann aber im Erfolgsfall sehr gefährlich sein.

Was ist eine fehlerbasierte SQL-Injektion?

Fehlerbasierte SQL-Injektion ist ein Angriff, bei dem der Angreifer Datenbankfehler nutzt, um Informationen aus der Datenbank abzuleiten. Dieser Angriff ist schwieriger auszuführen, kann aber bei Erfolg sehr gefährlich sein.

Autorenavatar

Sicherheit

admin ist eine leitende Redakteurin für Government Technology. Zuvor schrieb sie für PYMNTS und The Bay State Banner. Sie hat einen B.A. in kreativem Schreiben von Carnegie Mellon. Sie lebt in der Nähe von Boston.

de_DE_formalGerman