SQL Injection

Was ist eine SQL-Injection?

Die Familie der Structured Query Language (SQL)-Injections umfasst eine große Anzahl von Sicherheitslücken, die mit einer SQL-Datenbank interagieren.

Diese Sicherheitslücke tauchte erstmals 1998 in einem Artikel im Phrack Magazine auf (SQL-Injection – Wikipedia)

In den OWASP Top 10 (2007, 2010, 2013, 2017) stand die SQL-Injektion an erster Stelle, bei den anderen Injektionen (OWASP Top Ten Web Application Security Risks | OWASP)

Da SQL-Injections Datenbanken angreifen, handelt es sich um Sicherheitslücken, die die Serverseite von Webanwendungen betreffen.

SQL-Schwachstellen liegen vor, wenn der Server die Benutzereingabe ohne Bereinigung verwendet, um eine oder mehrere SQL-Abfragen zu starten.

Was sind die verschiedenen Arten von SQL-Injektionen?

Je nachdem, was der Server zulässt, gibt es unterschiedliche SQL-Schwachstellen.

Die häufigsten sind:

  • „Klassische“ SQL-Injection (mit ‚OR 1=1 –): Dies ist der bekannteste SQL-Fehler, der in Authentifizierungsformularen verwendet wird. Er ermöglicht es einem böswilligen Benutzer, das Authentifizierungsformular zu umgehen und auf ein eingeschränktes Konto zuzugreifen.
SQL Injection
  • „Union-basierte“ SQL-Injektion: In der SQL-Sprache wird der UNION-Operator verwendet, um das Ergebnis von zwei Abfragen zusammenzuführen. Dies ermöglicht es einem Hacker, sensible Daten als Ersatz für die in der ersten SQL-Abfrage vorhandenen Daten auszulassen.    
  • „Blinde“ SQL-Injection: Wenn Daten nicht auf dem Bildschirm angezeigt werden, verwendet der Angreifer eine Bedingung, die es ihm erlaubt, zu pausieren, und verlässt sich auf die Antwortzeit des Systems, um zu prüfen, ob seine Injektion erfolgreich war. Diese Technik wird insbesondere verwendet, um die Daten, die Sie wiederherstellen möchten, „brute force“ zu erzwingen.

Es gibt noch viele andere SQL-Injection-Methoden, von der „Error Based-Schwachstelle, die es erlaubt, Werte in einer Fehlermeldung anzuzeigen, bis hin zur „Stacked Query„, die es erlaubt, alle Abfragen auszuführen, die man möchte.

Folgen von SQL-Injections

SQL-Injections verursachen drei große Komplikationen:

  • Datenexposition: Es ist wahrscheinlich das bekannteste Problem im Zusammenhang mit SQL-Injections. Durch Hinzufügen benutzerdefinierter Abfragen, kann ein Angreifer alle in einer SQL-Datenbank vorhandenen Daten auslesen.

Es kommt sehr häufig vor, dass Datenbanken mit den persönlichen Daten der Benutzer (Name, E-Mail, Adresse) geleakt werden.

Dies erfordert eine besondere Aufmerksamkeit für sensible Daten, die möglicherweise online gespeichert sind.

  • Kontodiebstahl: Wenn eine SQL-Injection auf einem Authentifizierungsformular möglich ist, ist es für einen Angreifer sehr einfach, sich mit einem Konto zu authentifizieren, das ihm nicht gehört.

Neben Identitätsdiebstahl oder Datendiebstahl kann auch die ordnungsgemäße Funktion einer Webanwendung gestört werden, wenn ein Administratorkonto ausgenutzt wird.

  • Datenbeschädigung: Dies ist der gefährlichste Fall, der mit Stacked Query ausgenutzt wird.

Ein Angreifer, der beliebige Abfragen auf einer SQL-Datenbank durchführen kann, kann sehr leicht Daten ändern oder löschen.

Zusätzlich zur Korruption, die bei sensiblen Informationen problematisch sein kann, kann es zu denselben Problemen führen, die oben erwähnt wurden: Ein Hacker, der das Passwort ändern kann, ist ein Hacker, der das Passwort kennt.

Die meisten Websites haben ihre Daten in einer Datenbank gespeichert. Wenn Sie diese überschreiben können, können Sie die Website verunstalten oder gefälschte Nachrichten veröffentlichen.

Wie führt man eine SQL-Injection durch?

1. Normale Verwendung einer Suchleiste (PHP & MYSQL)

Nehmen wir das Beispiel einer Website, die Werkzeuge verkauft. Auf einer der Seiten der Webanwendung gibt es eine Suchleiste, um einen Artikel zusammen mit seinem Preis zu finden.

Loris, der Hacker, wird zunächst eine einfache Suche durchführen, um die verschiedenen Mähermodelle zu sehen.

Wenn er auf die Schaltfläche klickt, ruft der Server seinen Eintrag ab und fügt ihn in eine SQL-Abfrage ein.

Der Server sendet dann diesen SQL-Befehl an die Datenbank, die ihn als Code ausführt. Die Datenbank sucht dann in der Tabelle „items“ nach allen Namen und Preisen der Artikel, die „mower“ in ihrem Namen enthalten und deren Bestand größer als Null ist.

Der Server ruft diese Informationen ab und zeigt sie dann auf dem Bildschirm von Loris an.

2. Testen einer SQL-Injektion

Loris sieht, dass seine Recherche in der Form “ ?name = mower “ zur URL hinzugefügt wurde.  

Er beschließt dann zu testen, ob dieser Parameter die Eingabe von SQL-Code erlaubt.

Er fügt ein “ “ hinzu, das einen String in SQL öffnet und schließt.

Die Datenbank erhält dann den folgenden SQL-Befehl:

Diese Anfrage ist nicht gültig. Das zweite “ % „, das außerhalb der Zeichenkette gefunden wird, wird als verbotenes Zeichen betrachtet.

Es wird dann ein Fehler zurückgegeben: „MySQL-Fehler: Ungültige Syntax“

Loris weiß nun, dass eine Datenbank MySQL verwendet wird.

Um diesen Fehler zu vermeiden, fügt Loris einen MySQL-Kommentar zu seiner Abfrage hinzu, der es ihm ermöglicht, den Rest des Befehls mit der Syntax “ “ zu entfernen.

Die Datenbank nimmt die Anfrage an und gibt alle Artikel zurück. Der Prozentsatz dient als Platzhalter, einschließlich derjenigen, die nicht mehr auf Lager sind und der Bedingung, die gelöscht wird.

Loris muss nur seine eigenen Abfragen hinzufügen, um die Sicherheitslücke auszunutzen.

3. Beispiel für SQL-Injection

Da Loris nun eine gültige Abfrage hat, kann er die SQL Injection durchführen.

Sein Ziel ist es, die gespeicherten Benutzerkennwörter in der Datenbank abzurufen.

Dann ist es notwendig, die aktuelle Abfrage ungültig zu machen, um keine Elementinformationen abzurufen, dafür reicht ein einfaches UND 1 = 2 — aus.

Die Abfrage wird also versuchen, die Artikel zu finden, wenn die Bedingung 1 = 2 erfüllt ist. Folglich wird es kein Ergebnis mehr geben.

Loris verwendet dann den UNION-Operator, mit dem Abfragen zusammengeführt werden können, und fügt ein SELECT hinzu, mit dem er die Namen der verschiedenen Tabellen abrufen kann.

Mit einigen anderen SQL-Anfragen findet Loris heraus, dass Paul der Administrator der Website ist, so dass er sein Passwort erhält.

Das Passwort lautet cb28e00ef51374b841fb5c189b2b91c9.

Offensichtlich werden Passwörter nie im Klartext gespeichert und dieses Format scheint ein MD5-Hash zu sein.

Der MD5 ist ein Algorithmus, der zur Verschlüsselung von Klartext verwendet wird. Man kann ihn nicht umkehren, aber einige Websites (z. B. https://md5decrypt.net/) speichern eine Menge Assoziationen zwischen einfachem Klartext und MD5-Hash.

Loris hat Glück, die Website liefert ihm ein Ergebnis für den Hash: password123456

Loris muss sich nur mit dem Paar Paul / password123456 authentifizieren, um Zugriff auf ein Administratorkonto zu erhalten.

In unserem Beispiel wurde der Angriff per SQL-Injektion manuell durchgeführt, aber heute gibt es Tools wie SQLMap, die die Erkennung von SQL-Injektionen automatisieren.

OWASP-Empfehlung

Das Open Web Application Security Project (OWASP) stellt einen Leitfaden zur Verfügung, um SQL-Injections zu verhindern. Es gibt verschiedene Möglichkeiten, die ein Entwickler nutzen kann.

  • Vorbereitete Anweisungen, die darin bestehen, SQL-Abfragen zu schreiben und ihnen später Parameter hinzuzufügen.

Mit dieser Methode können Sie Parameter einfügen und die Injektion von Escape-Zeichen vermeiden.

  • Durch die Verwendung einer „Whitelist“ (einer Liste von zulässigen Werten) können Sie den Aktionsbereich des Benutzers einschränken und nur ausgewählte Werte akzeptieren.
  • Das Vermeiden von Escape-Zeichen bei Benutzereingaben ist immer noch eine effektive Methode.

R&S®Cloud Protector gegen SQL-Injektionen

Um SQL-Injections zu vermeiden, stellt R&S®Cloud Protector mehrere Werkzeuge zur Verfügung:

  • Blacklisting“ wird auf allen Schutzebenen verwendet:
    Wenn R&S®Cloud Protector ein Muster erkennt, das üblicherweise zum Ausnutzen einer SQL-Schwachstelle verwendet wird, wird die Anfrage sofort blockiert und umgeleitet.
  • Die „Scoring List„, die für die Schutzstufen Advanced und High verwendet wird:
    R&S®Cloud Protector analysiert die Anfrage und erhöht einen Score, wenn ein bösartiges Muster erkannt wird. Wenn die Punktzahl am Ende der Analyse größer als der zulässige Grenzwert ist, wird die Anfrage blockiert und umgeleitet.

    Dies ist eine intelligente Methode, die False Positives vermeidet.

Fordern Sie Ihre 14-tägige gratis Testversion an

In nur 60 Sekunden Websites und Anwendungen schützen Worauf warten Sie?