1.5.5.1 Injections

Unter Injection versteht man die Eingabe von Code durch böswillige Nutzer, wo eigentlich nur normale Zeichen als Eingabe erwartet werden.

Die meistgenannte Fall bei Injections ist die SQL Injection, die bei der Verwendung einer SQL-Datenbank möglich sein kann. Sehr viele Webseiten werden auf Basis einer Kombination eines Servers (meistens Apache Webserver) mit einer SQL-Datenbank (häufige Verwendung von MySQL und PostgreSQL) realisiert, bei der die ausgelieferte Webseite dynamisch unter Verwendung von Informationen aus der Datenbank aufgebaut wird. Falls nicht entsprechende Programmierrichtlinien eingehalten werden oder ein geeignetes Programmierrahmenwerk verwendet wird, kann es bei Formularen auf der Webseite sein, dass Angreifer diese zu direkten Zugriffen auf die Datenbank nutzen können.

Hierzu ein einfaches Beispiel: Auf einer Webseite kann man sich mit einer Login/Passwort-Kombination einloggen. In ein Login-Feld soll der Benutzername und in ein Passwort-Feld das Passwort geschrieben werden. Die Eingaben in den beiden Feldern werden in Variablen gespeichert, die dann in einer SQL-Anfrage weiterverwendet werden. Ein Beispiel für eine solche Anfrage ist SELECT * FROM Benutzer WHERE login='$login' and password='$password', mit der der Benutzer mit dieser Login/Passwort-Kombination in der Datenbank gefunden würde. Bei SQL bedeuten zwei Striche, dass der Rest als Kommentar zu verstehen ist. Der Angreifer kann sich damit unberechtigt Zugriff verschaffen, wenn er einen Benutzernamen kennt, die oftmals leicht zu erraten sind (z.B. Vorname.Nachname). Dann kann er beim Login-Feld einen Benutzernamen eingeben, den er aber um zwei Striche ergänzt (z.B. Vorname.Nachname --). Bei der SQL-Anweisung bedeutet dieses, dass der Rest der Anweisung zum Kommentar wird und damit die Bedingung ("and password='$password'") nicht mehr relevant ist. Die Authentifizierung erfolgt also lediglich dadurch, dass es den Nutzernamen in der Datenbanktabelle gibt.

Dieses ist aber nur eine Möglichkeit von vielen. Angreifer können zum Beispiel auch versuchen, zusätzliche Datenbankabfragen zu starten, indem sie hinter einem Eingabewert ein Semikolon und dahinter eine komplette Datenbankanfrage schreiben. Das Semikolon hat bei SQL die Bedeutung, dass es zwei Anweisungen voneinander trennt. Hier muss der Angreifer etwas raten, wie die Tabellen und Attribute benannt sind, aber dieses wird in Datenbankschemata oftmals mit üblichen Begriffen bezeichnet.

Diese Angriffe lassen sich durch Prepared Statements verhindern, wobei es sich um vorformulierte Anfragen an die Datenbank handelt. Die Eingaben des Angreifers können so nicht Teil des Codes der SQL-Anfrage werden.

Außerdem kann man bei der Programmierung beispielsweise nicht direkt in PHP programmieren, sondern unter Verwendung eines PHP-Rahmenwerks (z.B. Symfony2, Zend), bei dem bei der Umsetzung des Codes in PHP Code bereits auf die Schwachstellen geachtet wird.