SQL Injection: Wie funktioniert es und wie kann man es verhindern

Cybersecurity Content Writer

Können Hacker mit nur wenigen Zeilen Code eine ganze Website unter ihre Kontrolle bringen? Im Rahmen einer SQL-Injection könnte es jemandem gelingen, deine gesamte Datenbank zu plündern und dabei alles von den Anmeldeinformationen der Administratoren bis hin zu den Kreditkartendaten der Kunden zu stehlen.

Wenn sich bei der Programmierung deiner Website oder Anwendung nur ein paar Schwachstellen eingeschlichen haben, kann sich ein Hacker Zugang zu sämtlichen Daten verschaffen, die nie für die Öffentlichkeit bestimmt waren.

Was ist also eine SQL-Injection und wie kann man sie verhindern?

Was bedeutet SQL?

SQL ist eine Programmiersprache, die hauptsächlich verwendet wird, um Informationen aus Online-Datenbanken abzurufen. Sie ist intuitiv und nutzt einfache englische Wörter als Befehle, was den Umgang mit ihr sehr einfach gestaltet.

Stell dir beispielsweise vor, wie ein Kunde beim Online-Shopping das Wort „Schuhe“ in die Suchleiste eines Shops eingibt. Sobald er die Suchfunktion auslöst, läuft hinter den Kulissen ein einfacher Prozess ab.

Die Website verwendet dabei ein Datenbankmanagementsystem (DBMS), das wiederum eine Form von SQL ausführt. Wenn der Kunde nach „Schuhen“ sucht, wird mit dieser Sprache eine Zeile Code erstellt. Das ist die SQL-Abfrage.

Diese Abfrage enthält bestimmte Spezifikationen, z. B. wo gesucht und was abgerufen werden soll. Dies sollte wie folgt aussehen:

SELECT name, description FROM products WHERE category = “shoes”

Wenn diese Abfrage die Datenbank erreicht, liest das DBMS die SQL-Abfrage und weiß, dass es in der Tabelle „Produkte“ nachsehen muss. Dann kann es die Bezeichnungen und Beschreibungen der Elemente in der Kategorie „Schuhe“ abrufen und diese Daten an den Kunden zurücksenden. Wenn es zehn Elemente findet, gibt es zehn Bezeichnungen und Beschreibungen aus.

Es ist also ein ganz einfacher Vorgang. Und hier fangen die Probleme an.

Was bedeutet SQL-Injection?

Denn um eine Injection durchzuführen, versucht ein Hacker nun, zusätzlichen Code in die SQL-Zeile zu schmuggeln. Dies wird als Injection bezeichnet.

Natürlich funktioniert das nicht immer. Das DBMS der Website liest einige Zeichen als Coding-Befehle (z. B. AUSWÄHLEN) und andere als normale Wörter und Zeichen (in diesem Fall das Wort „Schuhe“).

Wenn eine Website korrekt programmiert wurde, führt die Suche nach einem Coding-Befehl nicht zu einer Injection. Stattdessen liest das System den Befehl als eine Reihe von Zeichen, die es nicht erkennt, und gibt eine Nachricht aus, in der beispielsweise „keine Elemente gefunden“ steht.

Wenn das System aber nicht geschützt ist, werden die injizierten Zeichen als authentischer SQL-Befehl gelesen. Hier nimmt das Problem seinen Anfang.

Anstatt nach dem Schlüsselwort „Schuhe“ könnte der Hacker nach bestimmten SQL-Befehlen suchen. Wenn die Code-Zeile erstellt und an die Datenbank gesendet wird, liest das DBMS das gesuchte Schlüsselwort als Befehl, den es entsprechend ausführt.

Der Schaden

Mithilfe einer Technik namens „blinde SQL-Injection“ kann ein Hacker schnell genau herausfinden, welches DBMS hinter den Kulissen ausgeführt wird. Mit diesem Wissen kann er auch die passende SQL-Sprache verwenden.

Wenn er nach den richtigen Coding-Befehlen sucht, kann er das DBMS dazu zwingen, eine vollständige Liste sämtlicher enthaltenen Datentabellen auszugeben. Mit dieser Erkenntnis kann er dann auf jede Tabelle zugreifen und sich die gewünschten Informationen verschaffen. Wirklich schwerwiegende Probleme können entstehen, wenn er dabei eine Tabelle mit der Bezeichnung „Benutzer“ findet.

Mithilfe des Coding-Befehls UNION kann jemand zu seiner ursprünglichen Abfrage eine weitere hinzufügen. Die Ergebnisse dieser Unterabfrage werden unter den Ergebnissen der primären Abfrage angezeigt.

Ein Hacker könnte etwa Folgendes in der Suchleiste eingeben:

“shoes” UNION (SELECT username, password FROM users);--"

Hinter den Kulissen würde ein SQL-String generiert, der wie folgt aussehen könnte:

SELECT name, description FROM products WHERE category = “shoes” UNION (SELECT username, password FROM users);--

Jetzt kann der Hacker nicht nur die Ergebnisse für das Schlüsselwort „Schuhe“ einsehen, sondern auch alle Benutzernamen und Passwörter aus der Tabelle „Benutzer“.

Die Passwörter sind zwar wahrscheinlich durch einen Hashing-Algorithmus zusätzlich geschützt; doch auch diesen dürfte ein Hacker relativ schnell knacken. Wenn er in Erfahrung bringen kann, welche Benutzernamen den Administratoren zuzuordnen sind, kann er mithilfe von Brute-Force-Software schnell in die relevanten Konten eindringen und so einen Administrator-Zugang zur gesamten Anwendung erhalten.

Methoden der SQL-Injection

Um bessere Sicherheitsmaßnahmen ergreifen zu können, müssen wir uns zunächst mit den verschiedenen Methoden der SQL-Injection (dt. SQL-Einschleusung) befassen und ein tieferes Verständnis für diese Form der Cyberbedrohung entwickeln

1. Klassische SQL-Injection

Die klassische SQL-Injection, auch als In-band-Angriff bezeichnet, ist die am häufigsten angewandte Form dieses Cyberangriffs. Hier wird ein schadhafter SQL-Code über Benutzereingabefelder eingeschleust. Angreifer verschaffen sich dadurch Zugang auf eine Datenbank mit dem Ziel, diese zu manipulieren, zu löschen oder sogar administrative Befehle auszuführen. Dieser Bedrohung sollte man sich unbedingt bewusst sein, um Präventivmaßnahmen ergreifen zu können.

2. Inferentielle SQL-Injection

Bei inferentiellen bzw. blinden SQL-Injection-Angriffen sind die Angreifer – wie der Name schon nahelegt – gezwungen, blind zu agieren. Sie verfügen nicht über einen direkten Zugang zur Ausgabe der Datenbank. Meistens stützen sich Angreifer, die einen blinden SQL-Angriff durchführen, auf eine Reihe von richtigen und falschen Abfragen und sammeln so Informationen. Diese Vorgehensweise ermöglicht es den Angreifern, die Datenbankstruktur und den Inhalt Stück für Stück zu entschlüsseln.

3. Fehlerbasierte SQL-Injection

Bei der fehlerbasierten SQL-Injection werden die Fehlermeldungen einer Datenbank herangezogen, um Zugriff auf sensible Daten zu erhalten. Angreifer, die solche Attacken durchführen, stellen absichtlich fehlerhafte SQL-Anfragen, die die Datenbank veranlassen, Fehlermeldungen zurückzugeben, die wertvolle Informationen enthalten. Internetbetrüger analysieren diese Meldungen eingehend, um Aufbau und Struktur der Datenbank kennenzulernen und die Schwachstellen des Systems zu identifizieren.

4. Zeitbasierte SQL-Injection

Bei zeitbasierten SQL-Injections handelt es sich um eine besondere Form des blinden SQL-Injection-Angriffs. Angreifer, die zeitbasierte blinde SQL-Angriffe durchführen, konzentrieren sich auf die Reaktionszeit der Datenbank und verschaffen sich dadurch Zugriff auf Informationen. Über SQL-Abfragen, deren Antworten verzögert zurückgegeben werden, können die Angreifer anhand der Zeit, die bis zum Erhalt der Antwort vergeht, spezifische Informationen über die Datenbank sammeln.

5. Out-of-Band SQL-Injection

Bei Out-of-Band SQL-Injections werden keine direkten SQL-Abfragen gesendet, sondern Seitenkanäle für das Versenden und Empfangen von Daten genutzt. Mit dieser eher seltenen, aber wirksamen Angriffsmethode umgehen Angreifer gewisse Sicherheitsmaßnahmen, wie z. B. Firewalls und Angriffserkennungssysteme, um ihre böswilligen Absichten in die Tat umzusetzen.

Von SQL-Injection-Angriffen gehen vielfältige Bedrohungen für die Sicherheit des betroffenen Unternehmens aus. Sobald Cyberkriminelle erfolgreich eine SQL-Injection-Schwachstelle ausnutzen können, ist ihnen Folgendes möglich:

  • Sie können Inhalte in der Datenbank hinzufügen, entfernen oder bearbeiten.
  • Sie können neue Dateien in die Datenbank schreiben.
  • Sie können den Quellcode des Datenbankservers einsehen.

Mit derartigen Zugriffsmöglichkeiten können sie möglicherweise sogar sämtliche Datenbanken des Webservers vollständig übernehmen, was – wie du dir sicherlich vorstellen kannst – katastrophale Folgen nach sich ziehen kann.

So verhinderst du eine SQL-Injection

Eine erfolgreiche SQL-Injection kann enorme Probleme nach sich ziehen. Ein Hacker kann Passwörter und Zahlungsinformationen stehlen, Benutzerdaten im Internet preisgeben und unverzichtbare Daten löschen. Ein derartiger Vorfall kann das Vertrauen der Verbraucher unwiederbringlich zerstören. Wie kannst du das also verhindern?

  • Eingabevalidierung

    Wenn Sie in die Backend-Codierung Ihrer Website eine Eingabewertprüfung integrieren, können Sie das Risiko eines erfolgreichen Angriffs jedoch erheblich reduzieren. Sie könnten eine Liste mit zulässigen Zeichen erstellen und das Datenbankmanagementsystem (DBMS) so programmieren, dass es erkennt, wenn ein Schlüsselwort nicht aufgeführt ist. „Sucht“ ein Hacker dann nach einem Programmierbefehl, gleicht Ihr System diesen mit der Liste ab. Wenn es keine Übereinstimmung findet, wird der Befehl nicht ausgeführt.

  • Prepared Statements

    Die beste Strategie besteht wahrscheinlich im Einpflegen von Prepared Statements. Eine gefährdete Website erstellt jedes Mal, wenn der Hacker eine Suche durchführt, einen neuen SQL-String. Bei einem Prepared Statement ist dies jedoch nicht der Fall. Erstelle bei der Programmierung des Backends deiner Website im Voraus deine SQL-Vorlagen, wobei anstelle des Schlüsselworts ein Fragezeichen eingetragen wird. Das DBMS kann so programmiert werden, dass es dieses Fragezeichen als beliebige Daten in der Suchleiste liest; die Abfrage selbst ist jedoch vorgefertigt. Das Risiko, dass ein bösartiger SQL-Befehl die Datenbank erreicht, reduziert sich damit drastisch.

  • Datentrennung

    Je weiter Ihre Daten aufgeschlüsselt sind, desto weniger dieser Daten kann ein Hacker bei einem einzigen Angriff abgreifen. In dem bereits erwähnten Beispiel, dass sich auf einen Online-Shop bezieht, wird das Problem der SQL-Schwachstelle dadurch verschärft, dass die Benutzerdaten in derselben Datenbank wie die Produktlisten gespeichert werden. Der Schaden, den ein SQL-Angriff anrichten kann, kann minimiert werden, wenn verschiedene Arten von Informationen in separaten Datenbanken und Servern gespeichert werden.

  • Setze stets die neuesten Technologien ein

    Um maximale Sicherheit gewährleisten zu können, sollten Sie sicherstellen, dass Ihre Programmiersoftware auf dem neusten Stand ist. Veraltete Technologien zur Web-Entwicklung schützen möglicherweise nicht vor SQL-Injections oder weisen vielleicht Schwachstellen auf, die von böswilligen Akteuren ausgenutzt werden können. Führen Sie für Software-Komponenten, die Sie für die Web-Entwicklung nutzen, ein Update aus, da diese konzipiert werden, um Fehler oder potentielle Sicherheitsprobleme zu beheben.

NordPass-News abonnieren

Erhalten Sie aktuelle Nachrichten und Tipps von NordPass direkt in Ihrem Posteingang.