Mittwoch, 6. Oktober 2010


Topthema

Montag, 27. Oktober 2008 | Topthema

About Security #179: Schwachstellen-Suche: Directory-Traversal (3)

(Link zum Artikel: http://www.entwickler.de/entwicklerde/kolumnen/045659)

Auch in dieser Folge geht es weiter um die Beschreibung von Directory-Traversal-Angriffen. In About Security #178 wurden Angriffe beschrieben, bei denen der Angreifer weiß, in welchem Verzeichnis er seinen Angriff startet. In dieser Folge geht es zuerst um Angriffe ohne Kenntnis des Start-Verzeichnis.

Directory Traversal ohne Kenntnis des Start-Verzeichnis

Auch wenn der Angreifer nicht weiß, in welchem Verzeichnis er startet, ist er nicht hilflos: Die Webseiten werden je nach verwendeten Webserver in bestimmten Standardverzeichnissen gespeichert, von denen nur sehr selten abgewichen wird. Mit welchem Webserver und welcher Version er es zu tun hat, hat der Angreifer schon beim Sammeln der Informationen über die Webanwendung ermittelt. Er kann nun ausgehend von diesen Standardverzeichnissen und dem angezeigten Pfad versuchen, eine bekannte Datei aufzurufen. Dabei kommt ihm zu Gute, das die meisten Dateisysteme redundante Directory-Traversal-Sequenzen, die über die Wurzel des Dateisystems hinaus führen würden, tolerieren. Es dürfen also ruhig mehr als die benötigte Anzahl Directory-Traversal-Sequenzen eingegeben werden, solange sie mindestens bis zur Wurzel des Dateisystem reichen, wird der Pfad danach ab der Wurzel neu begonnen.

Freie Auswahl

Hat der Angreifer einen Parameter gefunden, durch dessen Manipulation er sich frei auf dem Server bewegen kann, kann er danach beliebige Dateien betrachten. Für die Nutzung der dabei gesammelten Informationen gibt es im Wesentlichen zwei Möglichkeiten: Die Informationen werden für weitergehende Angriffe (z.B. ausgespähte Zugangsdaten, Erkenntnisse über die Programme, ...) oder direkt verwendet (z.B. Verkauf von ausgespähten Betriebsgeheimnissen oder Kreditkartendaten ...).

Schreiben ist besser als Lesen

Bisher wurden nur Angriffe mit lesenden Zugriffen beschrieben. Directory-Travesal-Angriffe können aber auch über Parameter möglich sein, die eine zu schreibende Datei definieren. Für einen Angreifer ist das natürlich ein Glücksfall, da er darüber beliebige Befehle auf dem Server ausführen kann. Dazu kann er z.B. ein Skript im Startup-Verzeichnis eines Benutzers erzeugen, Konfigurationsdateien ändern oder Skripte in ein Verzeichnis schreiben, aus dem sie von ihm gestartet werden können.

To write or not to write?
About Security: Die komplette Serie

Während bei einem Lesezugriff ein erfolgreicher Angriff sofort an der Ausgabe der aufgerufenen Datei erkannt werden kann, ist das gleiche bei einem Schreibzugriff sehr viel schwieriger. Ein möglicher Test besteht darin, sowohl eine für alle Benutzer beschreibbare Datei als auch eine nicht einmal für den Administrator oder root beschreibbare Datei anzugeben. Für Windows könnten das z.B.

../../../../../../../../../../schreibtest

und

../../../../../../../../../../windows/system32/config/sam

sein, für Unix-artige Systeme

../../../../../../../../../../tmp/schreibtest

und

../../../../../../../../../../tmp

(Der Versuch, ein Verzeichnis mit einer Datei zu überschreiben, sollte immer zu einer Fehlermeldung führen).

Eine weitere Testmöglichkeit ist das Schreiben in eine neue Datei unterhalb des Webroot-Verzeichnisses, die danach im Webbrowser aufgerufen wird. Das setzt aber voraus, dass dem Angreifer die Lage des Webroot-Verzeichnisses bekannt ist und der Benutzer, mit dessen Rechten die Datei geschrieben wird, dort Schreibberechtigung hat.

Sonderfall PHP

Beim Lesen von Dateien gibt es im Fall von PHP einen entscheidenden Unterschied zwischen den verschiedenen Funktionen: Während z.B. readfile() die Datei tatsächlich nur liest und in den Ausgabepuffer schreibt, wird von den Funktionen include()/include_once() und require()/require_once() beim Einbinden der Datei darin enthaltener PHP-Code ausgeführt. Für entsprechende Schwachstellen, d.h. das Einbinden lokaler Dateien, gibt es eine eigene Bezeichnung: Local File Inclusion bzw. LFI.

Solange der Angreifer über eine solche Schwachstelle nur normale Textdateien aufruft, ist der Unterschied ohne Bedeutung. Kritisch wird es, wenn die Datei PHP-Code enthält. PHP-Code in Dateien, die aufgrund eine unpassenden Endung normalerweise nicht an den PHP-Interpreter übergeben werden, wird beim Einbinden über include()/include_once() oder require()/require_once() ausgeführt.

Das kann ein Angreifer ausnutzen, um eigenen Code auszuführen. Er muss ihn nur irgendwie in irgendeine Datei auf dem Server bekommen und diese Datei danach über eine Local-File-Inclusion-Schwachstelle einbinden. Für das "irgendwie" gibt es mehrere Möglichkeiten: Gebräuchlich ist das Einschleusen des Schadcodes in Logfiles, meist des Webservers. Fertige Exploits für solche Angriffe gibt es im Exploit-Archiv vom Milw0rm (siehe z.B. dieses Beispiel). Ein weiterer Weg sind nicht ausreichend geprüfte Dateien, die ein Benutzer heraufladen darf, z.B. Bilder für Avatare: Auch eine vermeintliche Bilddatei kann eingebunden und enthaltener PHP-Code ausgeführt werden.

Nachdem nun die möglichen Folgen einer Directory-Traversal-Schwachstelle bekannt sind, geht es in der nächsten Folge um die Suche nach diesen Schwachstellen.

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