Mittwoch, 8. Februar 2012 |
Die Suche nach Command-Injection-Schwachstellen in Webanwendungen geht weiter: In dieser Folge erfahren Sie, wie Sie die für den Aufruf von Systembefehlen verwendeten Parameter prüfen können.
Es gibt zwei Gruppen üblicher Metazeichen, über die ein neuer Befehl in einen vorhandenen Befehlsaufruf eingeschleust werden kann:
In den in About Security #184 vorgestellten Beispielen war das erfolgreiche Einschleusen von Shell-Befehlen sofort offensichtlich, da die Ausgaben der eingeschleusten Befehle sofort ausgegeben wurden. Das ist jedoch nicht immer der Fall. In manchen Fällen wird die Ausgabe des vorhandenen Befehls und damit auch die des eingeschleusten Befehls von der Webanwendung gar nicht oder erst sehr viel später ausgegeben, in manchen Fällen wird die Ausgabe durch das Aneinanderhängen der Befehle unterdrückt oder verfälscht, in wieder anderen unterscheiden sich die Formate der Ausgaben des normalen und des eingeschleusten Befehls so weit, das die zweite von der Webanwendung nicht verarbeitet und daher ignoriert wird, usw. usf.. Nur, weil keine Ausgabe erscheint, bedeutet das noch lange nicht, das der Befehl nicht ausgeführt wurde. Die zuverlässigste Methode, um auch in solchen Fällen eine Command-Injection-Schwachstelle zu erkennen, besteht im Einsatz von Zeitverzögerungen: Es wird ein Befehl eingeschleust, dessen Ausführung eine bestimmte Zeitspanne benötigt, und die Reaktionszeiten der Anwendung ohne eingeschleusten Befehl und mit eingeschleusten Befehl werden verglichen.
Ein gut für das Verursachen einer Zeitverzögerung geeigneter Befehl
ist z.B. der
ping-Befehl:
Das Loopback-Interface 127.0.0.1 wird für einen bestimmten Zeitraum
angepingt. Um eine Verzögerung von 30 Sekunden zu erhalten, wird der
Befehl dazu für Unix/Linux als
ping -i 30 127.0.0.1
und für Windows als
ping -n 30 127.0.0.1
aufgerufen. Um beide Möglichkeiten auf einmal zu testen, können beide Aufrufe kombiniert werden, z.B. so:
¦¦ ping -i 30 127.0.0.1 ¦¦ ping -n 30 127.0.0.1 &
Evtl. werden einige, aber nicht alle der Shell-Metazeichen von der Webanwendung ausgefiltert. Daher müssen alle möglichen Metazeichen ausprobiert werden:
; ping -i 30 127.0.0.1 ;
¦ ping -i 30 127.0.0.1 ¦
& ping -i 30 127.0.0.1 &
%0a ping -i 30 127.0.0.1 %0a
` ping -i 30 127.0.0.1 `
sowie das gleiche mit -n.
Unterscheiden sich die Ausführungszeiten ohne und mit eingeschleustem
Befehl, ist die Webanwendung evtl. angreifbar. Um das zu
überprüfen, müssen die Tests für den betreffenden
Parameter mehrmals wiederholt werden, um andere Einflüsse, z.B. die
Auslastung des Webservers oder des Netzwerks, auszuschließen.
Außerdem können die Werte für die Parameter -i
und -n variiert werden, um einen Zusammenhang mit der
Zeitverzögerung zu erkennen.
Als weiterer Test wird ein Befehl verwendet, der eine Ausgabe erzeugt, z.B.
ls oder dir, um zu testen, ob die Ausgabe des
Befehls in der nächsten Webseite ausgegeben wird.
Wird die Ausgabe des Befehls nicht ausgegeben, können andere Befehle
verwendet werden, um eine Rückmeldung zu erhalten. Dazu kann z.B. mit
telnet oder netcat eine Shell geöffnet, mit
mail eine Mail verschickt oder mit ftp eine Datei
auf den Server kopiert werden.
Es ist auch möglich, die Ausgabe des eingeschleusten Befehls in eine Datei unterhalb des Web-Wurzelverzeichnis umzuleiten und danach diese Datei aufzurufen, z.B.
dir > c:\inetpub\wwwroot\test.txt
bzw.
ls > /var/www/test.txt
Nachdem eine Schwachstelle gefunden wurde, muss sie behoben werden. Ein Angreifer würde nun erst richtig loslegen. Einer der ersten Schritte dabei ist das Prüfen des aktuellen Benutzers bzw. dessen Rechte, die meist über eine andere Schwachstelle ausgeweitet werden müssen, bevor der Angreifer die vollständige Kontrolle über den Server übernehmen kann. Vielleicht möchte er aber auch nur die Seiten der Webanwendung mit Schadcode für Drive-by-Infektionen verseuchen, wofür meist die bereits erlangten Rechte der Webanwendung bzw. des Webservers ausnutzen. Oder er sucht sensitive Daten, oder ... - die Möglichkeiten sind nahezu grenzenlos.
In der nächsten Folge erfahren Sie, wie ein Angreifer evtl. vorhandene Einschränkungen umgehen kann und wie Sie Command Injection verhindern 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!