Die Suche nach Schwachstellen in Webanwendungen geht weiter. Ab dieser Folge erfahren Sie, wie Sie die in About Security #11 beschriebenen SQL-Injection-Schwachstellen in Ihrer Webanwendung finden können.
Vorbemerkungen
Von SQL-Injection sind natürlich nur Webanwendungen betroffen, die Daten in einer SQL-Datenbank speichern. Außerdem müssen vom Benutzer manipulierbare Daten für SQL-Abfragen an die Datenbank verwendet werden. Manipulierbare Daten sind dabei nicht nur Eingabefelder, wie für eine Suche, sondern auch z.B. in versteckten Formularfeldern oder der URL gespeicherte IDs zur Auswahl der nächsten Seite und Ähnliches. Zum Sammeln von Informationen über die Webanwendung gehört auch die Frage, ob ein Parameter für eine SQL-Abfrage verwendet wird. Bei der eigenen Webanwendung weiß man natürlich, welche Parameter in einer SQL-Abfrage verwendet werden und welche nicht. Ein Angreifer hat diesen Vorteil nicht. Er muss die betreffenden Parameter erst ermitteln. Zum einen kann man beim Sammeln von Informationen über die Webanwendung (wie ab About Security #144 beschrieben) für jeden Parameter überlegen, ob er vielleicht in einer Datenbank gespeichert werden könnte. Zum anderen liefern Reaktionen auf Manipulationen der Parameter einen Hinweis auf für SQL-Abfragen verwendete Parameter. Zum einen durch direkte Fehlermeldungen der SQL-Datenbank, zum anderen durch verräterische Informationen der Webanwendung selbst. Darauf werde ich später noch einmal zurückkommen.
Als Grundlage ein erstes Beispiel
N E U ! Security aktuell
Täglich aktuelle Security-Infos!
Um SQL-Injection-Schwachstellen suchen zu können, muss man erst mal
wissen, wie SQL-Injection überhaupt funktioniert. Als Beispiel soll
der SQL-Befehl SELECT zur Auswahl von Daten dienen, der
folgendes Format hat:
SELECT spalte1, spalte2 FROM datenbanktabelle WHERE bedingung
Als Beispiel für eine Webanwendung soll eine Online-Buchhandlung dienen. Die Details zu den Büchern werden in einer SQL-Datenbank gespeichert, die nach den verschiedenen Feldern wie z.B. ISBN, Autor, Titel, Jahr und Verlag durchsucht werden kann. Für die Suche nach allen Büchern aus einem bestimmten Verlag wird dann folgende SQL-Abfrage aus der Eingabe gebildet:
SELECT Autor, Titel, Jahr FROM Buchdatenbank WHERE Verlag = '$verlag'
$verlag ist der Parameter der Webanwendung, in den der
Benutzer den gesuchten Verlag eingibt. Der Parameter muss als String in
'-Zeichen eingeschlossen werden.
Bei der Suche nach allen Büchern des Verlags entwickler.press wird
dann folgende SQL-Abfrage aus der Eingabe gebildet:
SELECT Autor, Titel, Jahr FROM Buchdatenbank WHERE Verlag = 'entwickler.press'
Die Abfrage führt dazu, dass jede Zeile der Datenbank daraufhin geprüft wird, ob in der Spalte Verlag der Wert entwickler.press steht. Alle gefundenen Zeilen werden zusammengefasst und an die Webanwendung zurückgegeben, die das Ergebnis aufbereitet und als HTML-Seite an den Benutzer liefert.
Sicher oder nicht?
Was passiert nun, wenn jemand nach Büchern von O'Reilly sucht? Die Anwendung bildet folgende SQL-Abfrage:
SELECT Autor, Titel, Jahr FROM Buchdatenbank WHERE Verlag = 'O'Reilly'
Der SQL-Interpreter verarbeitet diese Abfrage genau wie die davor: Er parst die Eingabe in den '' und erhält den Wert O. Danach stößt er auf den ihm unbekannten Ausdruck Reilly'. Damit hat die Abfrage keine korrekte SQL-Syntax, und eine Fehlermeldung wird ausgegeben:
Incorrect syntax near Reilly'.
Status [...]
Unclosed quotation mark before the character string '
So eine Fehlermeldung bedeutet, dass die Anwendung für SQL-Injection anfällig ist: Ein Angreifer kann durch Eingabe eines ' den Wert für den manipulierten Parameter beenden und danach beliebigen SQL-Code anfügen, der dann auf dem Server ausgeführt wird. Das Standardbeispiel für diesen Fall ist eine Eingabe, die zur Ausgabe der gesamten Datenbank führt. Hier wäre das z.B. mit dem Wert
irgendwas' OR 1=1--
möglich. Der führt zur SQL-Abfrage
SELECT Autor, Titel, Jahr FROM Buchdatenbank WHERE Verlag = 'irgendwas' OR 1=1--'
Jede Zeile der Datenbank wird daraufhin geprüft, ob sie in der Spalte Verlag den Wert irgendetwas enthält oder ob 1=1 ist. Da 1 immer gleich 1 ist, wird jede Zeile ausgegeben. Die angehängten -- markieren einen Kommentar und sorgen dafür, dass das folgende '-Zeichen keinen Fehler verursacht. Manchmal muss die Anzahl der '-Zeichen ohne Kommentar-Zeichen ausgeglichen werden. Dann würde folgende Eingabe zum gleichen Ergebnis führen:
irgendwas' OR 'a' = 'a
ergibt als Abfrage
SELECT Autor, Titel, Jahr FROM Buchdatenbank WHERE Verlag = 'irgendwas' OR 'a' = 'a'
Dieses Beispiel ist relativ harmlos, der Angreifer könnte sich die gesamte Datenbank auch durch Eingabe eines Verlags nach dem anderen herunterladen. Es gibt aber auch weitaus gefährlichere Möglichkeiten, wie mit eingeschleusten SQL-Code Schaden angerichtet werden kann.
In der nächsten Folge lernen Sie weitere mögliche SQL-Injection-Angriffe kennen und erfahren, wie Sie gefährliche Parameter erkennen können.
Wenn Sie Fragen oder Themenvorschläge haben, können Sie diese gerne an die angegebene E-Mail-Adresse senden oder im Security-Forum einbringen!




