vuln-class-path-traversal
Path Traversal, verständlich erklärt
Path Traversal erlaubt Angreifern, Dateien außerhalb des für die Anwendung gedachten Verzeichnisses zu lesen oder zu schreiben. Oft der zweite Schritt zur vollständigen Server-Übernahme.
Worum es geht
Path Traversal (auch Directory Traversal, “Dot-Dot-Slash” oder
LFI für “Local File Inclusion”) ist eine Bug-Kategorie, bei der die
Anwendung einen Dateinamen aus Benutzereingabe nimmt, ihn mit einem
Basis-Verzeichnis zusammenfügt und die Datei zurückgibt, ohne zu
verhindern, dass die Person mit .. aus dem Verzeichnis ausbricht.
Mini-Beispiel. Die Anwendung tut:
fs.readFile('./uploads/' + filename)
Die Person ruft filename=../../etc/passwd ab. Aufgelöster Pfad:
/etc/passwd, das Betriebssystem liefert ihn artig aus.
Warum es noch immer passiert
Moderne Frameworks haben sichere Wege, Dateien auszuliefern
(sendFile(), Static-Asset-Middleware), aber an vielen Stellen
greift Code zu rohen Datei-APIs:
- Download-Endpoints. “Anhang herunterladen”, “Bericht exportieren”, die den Pfad aus einem Dateinamen in der URL bauen.
- Bild- und Template-Auswahl. “diese Vorlage benutzen”, “dieses Hintergrundbild verwenden”, die einen nutzerseitigen Namen auflösen.
- Unzip- / Entpack-Code. “Zip Slip” ist die Variante, bei der
ein Archiv mit
..-Einträgen Dateien außerhalb des Extraktions-Verzeichnisses überschreibt. Hat Spring, Kubernetes und mehrere Apache-Projekte mehrfach getroffen. - Log-Viewer. “Log-Datei X anzeigen”, die einen vom Nutzer kontrollierten Pfad lesen.
Was ein Angreifer gewinnt
Standard-Resultat: beliebiger Dateilesezugriff im Kontext des Service-Users:
/etc/passwdund/etc/shadow, um Nutzer aufzuzählen und (falls als root laufend) Hashes offline zu cracken.~/.aws/credentials,~/.ssh/id_rsa,~/.docker/config.jsonfür Cloud- und Remote-Server-Zugriff.- Anwendungs-Konfigurationsdateien mit DB-Passwörtern, API-Keys, Signing-Secrets.
- Quellcode der Anwendung, auf der Suche nach weiteren Bugs.
Erlaubt der Bug auch Schreiben beliebiger Dateien (selten, aber
real, vor allem in Upload-Handlern und Unzip-Code), eskaliert die
Folge stark. Webshell ins Document-Root → vollständige
Remote-Code-Execution. ~/.ssh/authorized_keys überschreiben, wenn
der Dienst ein Heimverzeichnis hat → SSH-Zugriff. Startup-Skript
überschreiben → Persistenz über Reboot.
Wie das behoben wird
Für Datei-Lese-Endpoints:
- Möglichst gar keine Dateinamen aus Benutzereingaben akzeptieren. Stattdessen opaque IDs verwenden, die serverseitig auf bekannte Dateien gemappt werden.
- Wenn nutzerseitige Dateinamen unvermeidbar sind: auflösen und
prüfen. Nach Join mit dem Basis-Verzeichnis das Betriebssystem
nach dem kanonischen Pfad fragen (
realpath(),os.path.realpath(),Path.GetFullPath()) und sicherstellen, dass er weiterhin mit dem kanonischen Basis-Pfad beginnt. Alles andere ablehnen. - Verzeichnis-Inhalt allowlisten:
safeFile = base + path.basename(input)wirft jeden Verzeichnis-Anteil weg, den der Angreifer einschleusen will.
Für Zip-/Tar-Entpackung:
- Eine Bibliothek nutzen, die bereits gegen Zip Slip schützt
(aktuelle Versionen von
commons-compress,node-tar,unzippertun das). - Oder dieselbe Kanonisierungs-Regel auf jeden Eintragsnamen anwenden, bevor entpackt wird.
Für URL-zu-Datei-Resolver:
- Erst Percent-Decoding und Unicode-Normalisierung, dann
Validierung. Angreifer verstecken
..gerne als%2e%2e,%252e%252e(doppelt encoded) oder als Unicode-Equivalente.
Wie blueredix Path Traversal meldet
Path-Traversal-CVEs tauchen in CMSs (Drupal, Joomla, WordPress-Plugins), Admin-Panels, Datei-Managern und Archiv-Viewern auf. Der Scanner meldet sie wie jede CVE: mit Schwere, Ausnutzungs-Wahrscheinlichkeit und einem Link zurück auf Wie man eine CVE liest.
Zusätzlich laufen kuratierte Templates, die bekannte verwundbare Produkte an bekannten URLs prüfen. Solche Befunde enthalten die konkrete URL und die im Proof zurückgegebene Datei.