Betrifft den Punkt „Schwachstellenausnutzung“ und „Zielerreichung“ der Cyber Kill Chain.


Moderne WebSeiten haben heute quasi immer eine Datenbank im Hintergrund, welche die Informationen der WebSeite speichert. Selbst meine WebSeite hier (itsec-ds.de) hat im Hintergrund eine Datenbank auf der alle Beiträge, statische Seiten, Bilder, Themes oder PlugIns gespeichert sind.

Durch einen SQL-Injection Angriff versucht man Informationen einer Datenbank zu lesen, zu verändern oder zu löschen für die man eigentlich keine Berechtigungen hat. Eine SQL-Injection basiert also auf einer fehlerhaften Programmierung der Anwendung oder auf einer fehlerhaften Konfiguration der Datenbank.

Bei einer SQL-Injection benutzt man die Datenbanksprache „SQL“ um Informationen aus der WebSeiten-Datenbank zu erhalten.

Ich werde hier jetzt nicht SQL erklären. Gleichwohl kann man sich hier einen ersten Überblick verschaffen: https://de.wikipedia.org/wiki/SQL.

Angriffe per SQL-Injection sind sehr gefährlich, da man im schlimmsten Fall die komplette Kontrolle über die Datenbank erhalten kann. Das bringt diese Angriffsmethode auf Platz drei der offiziellen weltweiten Open Web Application Security Project (OWASP) Top 10 Liste (siehe https://owasp.org/Top10/A03_2021-Injection).

Angriffsbeispiel

Ist ein Online-Shop bspw. anfällig für eine SQL-Injection, könnte man vor dem Kauf den Preis für ein bestimmtes Produkt ändern, das Produkt dann regulär erwerben und danach den Preis wieder auf den alten Wert zurücksetzen. Da heute alle Verarbeitung i.d.R. automatisiert ablaufen, würde der geänderte Preis nicht mal mehr auffallen.


Wie erkennt man ob eine WebSeite anfällig für eine SQL-Injection ist?

Datenbankabfragen, die eine WebSeite macht, kann man innerhalb einer URL erkennen; bspw. an einem ?.

Sieht man im Browser eine URL mit bspw.

https://meineseite.de/produkte?produktID=5

kann man davon ausgehen, dass hier eine Datenbankabfrage erfolgt. Wahrscheinlich soll ein Produkt mit der ID=5 aus der Datenbank abgerufen und auf der WebSeite dargestellt werden.

Das ist schonmal ein erster Hinweis. Ob eine SQL-Injection funktioniert kann man mit einem einfachen Trick ausprobieren. Man fügt quasi ein Zeichen hinter der 5 ein, was einen Datenbankfehler hervorrufen kann.

Die populären Zeichen dafür sind * “ ‘ / \ - = -- % # @ ; . :

Man versucht also

https://meineseite.de/produkte?produktID=5 oder

https://meineseite.de/produkte?produktID=5 oder

https://meineseite.de/produkte?produktID=5=

Provoziert man hier bereits einen Fehler oder wird einem evtl. sogar die interne Datenbankfehlermeldung angezeigt, dann ist die WebSeite anfällig für SQL-Injections.

Jetzt könnte man weitermachen und eine Datenbankabfrage erzwingen, die einem bspw. alle Produkte auflistet mit

https://meineseite.de/produkte?produktID=5‘ or 1=1--

(Das — ist eine Auskommentierung und bedeutet quasi, dass die Datenbank alle anderen weiteren Eingaben ignorieren soll.)

Ohne weiter die SQL-Sprache zu erklären … SQL interpretiert die Anfrage logisch und erkennt, dass 1 immer gleich 1 ist. Die SQL-Datenbankabfrage lautet also übersetzt

SELECT * FROM <Tabellenname> WHERE produktID=‘5‘ or 1=1--'

Da 1 immer gleich 1 ist, gibt die Datenbank alle Produkte aus, unabhängig davon das vorher nach der speziellen ID=5 gefragt wurde.

Wenn das klappt, dann kann man auch kompliziertere SQL-Anfragen übergeben, wie bspw.

https://meineseite.de/produkte?produktID=5‘ union select * from <Tabellenname>--

… man könnte auch versuchen die Tabelle zu löschen mit

https://meineseite.de/produkte?produktID=5‘ drop table <Tabellenname>--

Mit diesen Tricks kann man manuell, wenn man ganz viel Zeit hat, die komplette Datenbankstruktur, und natürlich auch die Daten selbst, rauskriegen.

Zum Glück gibt es dafür Werkzeuge die das für uns übernehmen können. Mehr dazu weiter unten in diesem Beitrag.

Beispiel für Selbststudium

Es gibt einige WebSeiten um SQL-Injection Angriffe zu lernen.

Eine populäre WebSeite ist https://hack-yourself-first.com.

Probieren Sie es einfach mal aus mit bspw. https://hack-yourself-first.com/CarsByCylinders?Cylinders=V8 und fügen sie dort jeweils ein und ein or 1=1-- an.


Werkzeug für SQL-Injection

Das populärste Werkzeug für SQL-Injection Angriffe ist sqlmap.

sqlmap ist Teil von Kali Linux und kann hier geladen werden: https://sqlmap.org

sqlmap ist eine Konsolenanwendung und bietet daher keine tolle Benutzeroberfläche. Gleichwohl ist es das mächtigste Werkzeug für eine SQL-Injection.

Ruft man https://hack-yourself-first.com mit

sqlmap -u „https://hack-yourself-first.com/CarsByCylinders?Cylinders=V8“ --schema

auf, dann fährt sqlmap einen vollautomatischen Angriff und listet alle Daten und Tabellen der Datenbank auf, die es finden kann. Das komplette Logfile als TXT können Sie sich hier anschauen


Abwehrmaßnahmen gegen SQL-Injection Angriffe

Ich habe eingangs geschrieben, dass ein SQL-Injection Angriff eigentlich nur möglich ist, wenn die WebSeite Programmierfehler oder Konfigurationsfehler hat. Daher können SQL-Injection Angriffe relativ einfach erschwert oder sogar ganz abgewehrt werden.

1. Ordentliche Behandlung von Fehlermeldungen

Interne Fehlermeldungen dürfen auf keinen Fall dem Benutzer angezeigt werden.

Die Fehlermeldungen enthalten wertvolle Hinweise auf Angriffsvektoren. Wenn diese dem Angreifer nicht angezeigt / mitgeteilt werden ist der manuelle SQL-Injection Angriff signifikant schwerer.

In der Regel können diese Fehlermeldungen über einen Eintrag in der Konfigurationsdatei des WebServers deaktiviert werden. Es wird dann zwar noch immer eine Fehlermeldung angezeigt, diese ist jedoch allgemeiner Natur und hat keine weiteren Spezifika zur internen Struktur der WebSeite.

2. Prüfung welche Abfragen an die Datenbank gegeben werden

Jede Dateneingabe in eine Anwendung ist eine potentielle Schwachstelle. Dabei ist es egal ob man Daten in eine WebSeiten-Suchfunktion, ein Benutzerlogin oder eine URL eingibt. Es muss immer und ausnahmslos eine Überprüfung der eingegebenen Daten gemacht werden.

Das kann über sog. Whitelists oder Blacklists genauso gemacht werden wie über den Einsatz von Plausibilisierungsbibliotheken oder anderen internen selbstprogrammierten Prüfmechanismen.

Sollten unplausible Dateneingaben erkannt worden sein, müssen diese entsprechend behandelt werden. Gerne auch über eine adäquate Fehlermeldung, siehe Punkt 1.

3. Vordefinierte oder parametrisierte SQL-Abfragen benutzen

Vordefinierte SQL-Anfragen sind nicht veränderbar und arbeiten mit parametrisierten variablen Elementen.

Einfach ausgedrückt, diese variablen Elemente werden in der SQL-Anfrage mit dargestellt. Dadurch wird quasi das manuell eingegebene aus unserem Beispiel

https://meineseite.de/produkte?produktID=5

in einem anderen Kontext dargestellt und die SQL-Anfrage ist damit ungültig und erzeugt eine Fehlermeldung, welche natürlich ordentlich abgefangen werden muss, siehe Punkt 1.

4. Ordentliche Berechtigungsverwaltung

Moderne Datenbanken erlauben eine gezielte Rechtevergabe auf Tabellen und einzelnen Spalten der Tabelle.

Ein einfacher Besucher der WebSeite sollte also nur Sichtrechte für bestimmte Tabellen und Spalten erhalten. Damit laufen evtl. SQL-Injections ins Leere, weil die Datenbank den Zugriff auf die „interessanten“ Informationen gar nicht erlaubt.

5. Immer aktuelle Software benutzen (Updates und Patches einspielen)

Das ist sowieso immer Pflicht.

Es müssen immer alle Updates und Patches eingespielt werden. Bitte lassen Sie auch keine Updates aus. Die Hersteller entwickeln Updates so, dass diese immer auf dem Vorgänger aufbauen. Sollte der einmal fehlen, kann das Update ganz schnell Probleme machen.

Ferner beheben die Hersteller auch gerne mal Fehler oder Schwachstellen ohne diese explizit in den Release-Notes zu erwähnen.

Daher gilt: Updates immer und sofort einspielen; ohne Ausnahmen!!


Wichtiger Hinweis:

In Deutschland gibt es den Hackerparagrafen: §202c (StGB). Dieses Gesetz verbietet es fremde Systeme auszuspionieren oder anzugreifen. Falls Sie also selbst Hacken lernen wollen, bspw. mit Kali Linux, analysieren Sie bitte nur Systeme in Ihrem eigenen (Heim)Netzwerk und lassen Sie sich von Ihrer IT-Abteilung eine entsprechende Freigabe dafür geben.


weitere Fachbeiträge …


Informationssicherheit und Datenschutz – Beratung und Konzeption – Landsberg am Lech