Samstag, 16. Juni 2012


Topthema

Donnerstag, 11. Dezember 2008 | Topthema

About Security #185: Schwachstellen-Suche: OS Command Injection (2)

(Link zum Artikel: http://www.entwickler.de/entwicklerde/kolumnen/046477)
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share

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.

Shell-Metazeichen

Es gibt zwei Gruppen üblicher Metazeichen, über die ein neuer Befehl in einen vorhandenen Befehlsaufruf eingeschleust werden kann:

  • Die Zeichen ; ¦ & und Newline können verwendet werden, um mehrere Befehle hintereinander als Batch auszuführen. Machmal müssen die Zeichen doppelt eingegeben werden, um den gewünschten Effekt zu erzielen, so bedeutet z.B. unter Windows &&, das der zweite Befehl nur ausgeführt wird, wenn der erste erfolgreich ausgeführt wurde, während er bei Eingabe von ¦¦ immer ausgeführt wird.
  • Der Backtick ` kann verwendet werden, um einen separaten Befehl in die vom vorhandenen Befehl verarbeiteten Daten einzukapseln. Der Kommandointerpreter führt dann den eingekapselten Befehl zuerst aus und ersetzt den eingekapselten Text mit der Ausgabe des Befehls, bevor er damit den ursprünglichen Befehl ausführt.
Ausgeführt oder nicht ausgeführt?

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.

Tests durchführen
About Security: Die komplette Serie

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.

Gefundene Schwachstellen prüfen

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
Angriff

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!

Carsten Eilers

About Security - Übersicht zum aktuellen Thema:

Kommentare

Folgende Links könnten Sie auch interessieren