• Startseite
  • Security
  • SQL-Injections einfach erklärt: Wie funktionieren sie und wie verhindert man sie?

SQL-Injections einfach erklärt: Wie funktionieren sie und wie verhindert man sie?

Es gibt verschiedene Arten von SQL-Injections, die ein Angreifer mittels SQL in eine Webanwendung einschleusen kann.

Definition „SQL-Injection“

Bei einer SQL-Injection (dt. SQL-Einschleusung) handelt es sich um die Ausnutzung einer Sicherheitslücke in Zusammenhang mit SQL-Datenbanken, welche durch mangelnde Maskierung oder Überprüfung von Metazeichen in Benutzereingaben entstehen.

Typen von SQL-Injections

SQL-Injection

Es gibt verschiedene Arten von SQL-Injections. Jede SQL-Injection erfordert einen Angreifer, der mittels SQL beliebigen „Code“ in eine Datenbankabfrage einschleust.
Zur einfachsten Form einer SQL-Injection zählt die Benutzereingabe. In der Regel werden Benutzereingaben über ein Formular im Frontend der Webseite eingegeben und anschließend an das Backend der Webseite weitergeleitet. Dort angekommen werden die eingegeben Daten verarbeitet und zur Datenabfrage verwendet.
Wenn diese Daten zuvor nicht ordentlich maskiert und überprüft werden, können die Daten in der Datenbank gelöscht, kopiert, geändert oder neue Daten hinzugefügt werden.

Cookies

Es besteht dem Angreifer auch die Möglichkeit, die s.g. Cookies zu verändern, um Datenbankabfragen zu manipulieren. Cookies speichern lokal Informationen des Clients, sodass Webanwendungen diese Informationen bspw. beim erneuten Besuch einer Webseite auslesen und dem Nutzer so den zuletzt bekannten Stand der Webseite darstellen kann. Das beste Beispiel dafür ist die Sprache einer Webseite. Wählt man auf einer zweisprachigen Webseite die Sprache „Englisch“ aus, so wird oftmals ein Cookie angelegt, welches den Wert „en“ oder „en-GB“ enthält. Beim erneuten Aufruf der Webseite wird diese dann wieder in Englisch angezeigt.
Grundsätzlich kann ein böswilliger Benutzer oder Malware einen Cookie so manipulieren, dass SQL-Abfragen in die Datenbankabfrage eingeschleust wird.

Test einer SQL-Injection

Heutzutage werden SQL-Injections automatisch erstellt. Viele Tools wie SQLninja, SQLmap und Havij vereinfachen die Überprüfung der eigenen Webanwendung auf etwaige Sicherheitslücken. Leider ist es für den Angreifer natürlich somit auch möglich, potentielle Ziele auszumachen.

Beispiel einer SQL-Injection

Eine beispielhafte SQL-Injection sieht folgendermaßen aus. Ein Benutzer kann im Frontend der Webseite seine Client-ID eingeben, um sein Profil aufzurufen. Dieser Client-ID wird daraufhin an das Backend übermittelt, welches dort zu einem SQL-Query verarbeitet wird und das Ergebnis aus der Datenbank ausliest:

Beispielhaftes SQL-Query:

SELECT *
FROM clients
WHERE client_id = '12345'

Mögliche SQL-Injection:

Sollte der Benutzer nicht nur den Wert 12345 eingeben, sondern folgendes, spricht man von einer SQL-Injection:

12345; DELETE * FROM clients WHERE 1 = 1

Resultierender SQL-Query:

SELECT * 
FROM clients
WHERE client_id = '12345';
DELETE * 
FROM clients
WHERE 1 = 1

Hier ist anzumerken, dass Datenbanken problemlos mit einem Semikolon getrennte SQL-Statements ausführen können. Wenn die Benutzereingabe in den einfachen Anführungszeichen also nicht überprüft wird, kann ein Angreifer in diesem Falle den gesamten Tabelleninhalt löschen.

SQL-Injections erkennen

SQL-Injection lassen sich in der Regel recht schnell erkennen. Dennoch passiert es oftmals auch erfahrenden Entwicklern, dass sie einen Fehler in ihre Anwendung einbauen. Eine s.g. Web Application Firewall (WAF) kann grundlegende SQL-Injections erkennen und blockieren. Dennoch sollte man sich nicht nur auf diese eine vorbeugende Maßnahme verlassen.
Eine weitere Möglichkeit sind s.g. Intrusion detection systems (IDS), welche sowohl netzwerk- als auch hostbasiert so eingestellt werden können, dass SQL-Injections erkannt werden. Ein hostbasierter IDS kann sie darüber informieren, wenn etwas außergewöhnliches auf dem Server passiert.
Grundsätzlich kann man sagen, dass sich SQL-Injections einfach erkennen und verhindern lassen.

SQL-Injections verhindern

Legen sich grundlegend fest, dass jede Benutzereingabe auf der Webseite nicht vertrauenswürdig ist. Dies bedeutet, dass jede Benutzereingabe von Ihnen überprüft werden muss. Eine Möglichkeit ist die Eingabevalidierung mittels einer s.g. Whitelist. So ist es bei der Abfrage einer ID nur möglich, Ganzzahlen einzugeben.
Ein weiterer Punkt wäre, dem Datenbankbenutzer Einschränkungen beim Zugriff auf die Datenbank einzuräumen. So wäre es möglich, dem Datenbankbenutzer das Löschen (DROP) von Tabellen nicht zu ermöglichen.

Abschließend sei das wichtigste für Ihre Webseite anzumerken:

Legen Sie in regelmäßigen Zeitabständen Backups Ihrer Webseite an!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Kontakt

Ihre Full-Stack-Entwickler aus Köln

Seit mehr als 12 Jahren stehe ich meinen Kunden in Köln und deutschlandweit als Full-Stack-Entwickler zur Verfügung.

Neben der grundlegenden Entwicklung von modernen Webseiten liegen meine Stärken bei der Beratung und der Betreuung komplexer Internetanwendungen.

Habe ich Ihr Interesse geweckt? – Dann nehmen Sie doch gerne Kontakt mit mir auf. Ich werde mich umgehend mit Ihnen in Verbindung setzen.

2020 © Thorsten Kötzsch