Leitlinien

Einspritzung 101

Eine der bekanntesten Klassen von Schwachstellen sind Injektionsschwachstellen, insbesondere, und das überrascht niemanden, das unbestrittene Aushängeschild: SQL-Injektion. Es ist schwer, in der Welt der Technik nicht von SQL-Injection zu hören, also werden wir einfach darüber sprechen. 

Mit SQL Injection ist es möglich, das Verhalten einer SQL-Abfrage so zu manipulieren, dass es den Wünschen eines Angreifers entspricht. 

Es gibt auch viele andere Arten der Injektion, die sich zwar äußerlich unterscheiden, aber alle auf demselben Prinzip beruhen. 

Zur Erinnerung: Einige der häufigsten Injektionsarten sind:

  • SQL-Einschleusung
  • Cross-Site Scripting (HTML/Javascript-Injektion)
  • Path Traversal (Pfad/Url-Injektion)
  • Befehlsinjektion
  • Code-Injektion 

Eine kleine Injektion 101

Wenn Sie sich die vorangegangene Liste der Injektionsarten ansehen, haben sie alle eines gemeinsam: Sie alle beinhalten eine Zeichenkette, die durch einen Interpreter läuft, der dann das tut, was die Zeichenkette darstellt. Wir haben "Benutzereingabe" mit geschweiften Klammern markiert.     

Typ Beispiel-Eingabe Wie sie interpretiert wird
SQL SELECT name FROM users WHERE username = '{admin}' Wählt die Spalte "Name" aus allen Zeilen der Tabelle "Benutzer" aus, in denen der Benutzername "admin" lautet
HTML {John Smith} Zeigt den Namen "John Smith" in fetten Buchstaben
Pfad /var/www/app/documents/{privacy-policy.pdf} Zeigt auf die Datei `privacy-policy.pdf` im Ordner `/var/www/app/documents/`
Befehl ping {8.8.8.8} Sendet eine Reihe von ICMP-Pings an die IP-Adresse "8.8.8.8".
Code const name = '{John Smith}'; Setzt die konstante Variable `name` auf den Wert `John Smith

Was würde also passieren, wenn die Eingabe von Benutzereingaben unsicher wäre? Was könnte ein Angreifer tun? Auch in diesem Szenario gilt alles, was innerhalb der geschweiften Klammern steht, als "Benutzereingabe".

Typ Beispiel-Eingabe Wie sie interpretiert wird
SQL - Eingespritzt SELECT name FROM users WHERE username = '{1' UNION SELECT passwordhash from users WHERE username = 'admin}' Wählt den "Namen" aus allen Zeilen der Tabelle "Benutzer" aus, bei denen der Benutzername "admin" ist, und den Passwort-Hash für die Benutzer, bei denen der Benutzername "admin" ist
HTML - Eingespritzt {} Zeigen Sie den Namen "John Smith" in fetten Buchstaben
Pfad - Eingespritzt /var/www/app/documents/{../../../../../etc/shadow} Zeigt auf die Datei `shadow` im Ordner `/etc/`
Befehl - Injiziert ping {8.8.8.8 && ls . } Sendet eine Reihe von ICMP-Pings an die IP `8.8.8.8`, und gibt den Inhalt des aktuellen Verzeichnisses mit `ls` aus
Code - Eingespritzt const name = '{John Smith'; exec('ls .'); # }'; Setzt die konstante Variable `name` auf den Wert `John Smith` und führt dann den Systembefehl `ls .

Achten Sie bei diesen Beispielen darauf, wie die Eingabe verwendet werden kann, um das Ergebnis der Benutzereingabe zu beeinflussen. 

Das ist die Essenz von Injection. Es geht darum, zu beeinflussen, was an den Interpreter weitergegeben wird, um ihn dazu zu bringen, etwas anderes zu tun, als der ursprüngliche Programmierer beabsichtigt hat.

Das sind nur die Grundlagen, die es zu beachten gilt. Wir haben einige der verschiedenen Injektionsarten auf eigenen Seiten behandelt, weil sie etwas mehr Aufmerksamkeit verdienen. 

Sie können sie hier finden:

Befehlsinjektion‍

Pfadüberquerung‍

SQL-Einschleusung‍

Cross-Site-Scripting