Injection ist aktuell (2020) der traurige Sieger der OWASP Top 10, also das größte Risiko für Webanwendungen. Dies bedeutet, dass Entwickler von Webanwendungen wissen sollten, wie Injection-Schwachstellen verhindert werden können und Bug-Bounty-Hunter wissen sollten, wie man diese findet und Injection-Angriffe ausführt.

Was sind Injection-Angriffe?

Injection ist leicht direkt übersetzt und bedeutet Injektion. Was man normalerweise eher vom Arzt kennt, beschreibt hier das Injizieren von bösartigem Code in einen Interpreter. Dieser bösartige Code kommt, wie so oft bei Angriffen auf Webanwendungen, von einem Input des Benutzers einer Webseite. Wenn dieser Input gar nicht oder ungenügend bereinigt wird und an eine Funktion weitergereicht wird, welche dann Code interpretiert und ausführt, kann ein Angreifer beliebigen Code ausführen. Dies führt im schlimmsten Fall zur Übernahme des Systems.

Welche Arten von Injections gibt es?

Bei der obigen Erläuterung wurde immer nur pauschal vom Injizieren von Code gesprochen. Dieser Code kann dabei jede Programmiersprache darstellen, welche im Umfeld von Webanwendungen verwendet wird und welche Eingaben eines Nutzers überreicht bekommt. Als Beispiel wird der typischste Fall für Injections genutzt: SQL-Injection, kurz: SQLi.

Beispiel für eine Injection-Attacke mit SQL

SQL ist eine Datenbankabfrage und -manipulationssprache. SQL dient also hauptsächlich zum Abruf von Daten aus SQL-Datenbanken. Oft werden Eingaben eines Nutzers genutzt, um eine SQL-Abfrage zusammenzusetzen, damit die entsprechenden Daten abgerufen und dann zur Anzeige der Webseite genutzt werden können.

Ein Beispiel dafür ist die Suche nach Produkten in einem Onlineshop. Werden die Produkte des Shops in der Tabelle produkt gespeichert, sieht die Abfrage zur Anzeige aller gesuchten Produkte unter Umständen so aus:

select * from produkt where name = '[Nutzereingabe]'

Wird die Nutzereingabe vor dem Einsetzen in die SQL-Abfrage nicht vorverarbeitet und bereinigt, dann wäre es zum Beispiel möglich mit test' OR 1=1-- als Eingabe alle Produkte anzuzeigen. Die SQL-Abfrage sieht dann so aus:

select * from produkt where name = 'test' OR 1=1--'

Was passiert hier? Die zwei Bindestriche (--) sind in SQL (zumindestens auf einem Microsoft SQL-Server) ein Kommentar, also alles was hinter -- wird nicht mehr interpretiert. Dadurch fällt der letzte ' (welcher nicht entfernt werden konnte) weg. Das OR 1=1 manipuliert den boolschen Ausdruck hinter dem where so, dass dieser immer WAHR ist. Somit kann die Zeichenkette test beliebig gewählt werden.

Dieser Angriff zeigt allerdings nur ein paar mehr Produkte als gewollt. Unter Umständen werden Produkte angezeigt, welche noch nicht freigegeben sind, sodass hier sensible Daten preisgegeben werden, aber ein System kann so noch nicht übernommen werden.

SQL-Injection mit UNION

Allerdings kann die obere Schwachstelle auch auf andere Art und Weise ausgenutzt werden. In jeder SQL-Datenbank gibt es eine Tabelle, welche die Benutzer der Datenbank und damit auch den Administrator der Datenbank enthält. Wäre es nun möglich mit SQLi auch andere Tabellen auszulesen als die ursprünglich (vom Entwickler) gewollte, könnte der Benutzername und evtl. das Passwort des Administrators ausgelesen werden. Dafür sind UNION-Angriffe gedacht.

Wird im oberen Beispiel als Nutzereingabe ' UNION SELECT username, password FROM users-- gewählt, entsteht folgende SQL-Abfrage:

select * from produkt where name = ' ' UNION SELECT username, password FROM users--'

Der UNION-Befehl ist dazu gedacht mehrere Tabellen mit einander zu vereinen, d.h. die Einträge von produkt und users werden bei dieser Abfrage zusammen ausgegeben. Das Ergebnis enthält also zuerst alle Produkte und dann alle Benutzernamen mit dazugehörigen Passwörtern. Das Ergebnis der Tabelle produkt ist dabei völlig egal. Wichtig ist, dass danach die Benutzernamen und Passwörter folgen.

Zu einem UNION-Angriff gehört noch etwas mehr. Zum Beispiel muss der Angreifer (meistens blind) herausfinden, wie viele Spalten die ursprüngliche Abfrage erzeugt, da die Anzahl der Spalten der UNION Anfrage dazu passen muss.

SQLi Lab und andere Injections

Wer SQL-Injection mal selber probieren will, kann die Labs der Web Security Academy von Portswigger nutzen.

Außerdem ist zu erwähnen, dass es für SQLi natürlich auch viele automatisiertes Werkzeuge gibt. Das Bekannteste ist sqlmap.

Außerdem war SQLi nur ein Beispiel. In andere Programmiersprachen oder -frameworks gibt es ebenfalls oft Injection-Schwachstellen. Zum Beispiel PHP- oder OS-Injection. Wobei das Prinzip immer das Gleiche bleibt.


3 Kommentare

OWASP Top 10 – Maxanit Consulting · Juni 7, 2020 um 8:52 pm

[…] Injection […]

Überblick Bug-Bounty-Artikel – Maxanit Consulting · Juli 12, 2020 um 12:41 pm

[…] Injection […]

Schreibe einen Kommentar zu Überblick Informationssicherheitsmanagement – Maxanit Consulting Antworten abbrechen

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