Path Traversal und unsichere Datei-Uploads: erkennen und verhindern
Kurz: Bei Path Traversal schmuggelt ein Angreifer Pfadteile wie ../ in eine Dateianfrage, um Dateien außerhalb des erlaubten Ordners zu lesen; unsichere Uploads erlauben das Einschleusen schädlicher Dateien.
Genauer: Webanwendungen lesen oder speichern oft Dateien anhand von Nutzereingaben (/download?datei=bericht.pdf). Wird die Eingabe ungeprüft in einen Pfad eingebaut, kann datei=../../etc/passwd Systemdateien preisgeben. Dieser Artikel erklärt Verstehen und Abwehr für eigene Anwendungen.
Im Detail
Path Traversal (Directory Traversal)
../ steigt im Verzeichnisbaum nach oben. Beispiel: Basis /var/www/dateien/ + Eingabe ../../../etc/passwd → /etc/passwd. Varianten: URL-kodiert (%2e%2e%2f), doppelt kodiert, Backslashes (..\) unter Windows, absolute Pfade, Null-Bytes, Symlinks. Folgen: Lesen von Konfigurationen, Schlüsseln, Quellcode, Datenbank-Zugangsdaten; mit Schreibzugriff sogar Code-Ausführung.
Typische Orte: Download-/Bild-/Vorlagen-Endpunkte, ZIP-Entpacken (Zip Slip: Eintrag ../../evil), Log-Viewer, Template-Auswahl.
Abwehr
- Keine Dateinamen aus Nutzereingaben verwenden, sondern IDs (Datenbank-Eintrag → gespeicherter Pfad) oder eine Allowlist.
- Pfad normalisieren und prüfen: aufgelösten Pfad bilden (
Path.resolve(),realpath) und sicherstellen, dass er mit dem Basisordner beginnt.
basis = Path("/var/www/dateien").resolve()
ziel = (basis / eingabe).resolve()
if not ziel.is_relative_to(basis):
abort(400)- Rechte minimieren (Prozess darf nur seinen Ordner lesen), Chroot/Container, schreibgeschützte Dateisysteme.
- Frameworks nutzen (
send_from_directory), ZIP-Einträge prüfen. - Fehlermeldungen ohne Pfade.
Unsichere Datei-Uploads
Risiken: ausführbare Dateien (PHP/JSP-Webshell) im Webroot, Überschreiben fremder Dateien, riesige Dateien (DoS), Bild-/Dokumentformate mit Schadcode (SVG mit Script → XSS, PDF/Office-Makros, polyglotte Dateien), falsche Typen (Endung ≠ Inhalt), Pfad im Dateinamen. Schutz:
- Typ prüfen (Magic Bytes/Inhalt, nicht nur Endung/
Content-Type), Allowlist der Formate. - Neu benennen (zufällige ID), Originalname nur als Metadatum.
- Außerhalb des Webroots speichern oder über Objektspeicher (S3) ausliefern, kein Ausführen (
noexec, HeaderX-Content-Type-Options: nosniff,Content-Disposition: attachment). - Größenlimit, Rate Limiting, Virenscan, Bilder neu kodieren (entfernt Metadaten/Payload).
- SVG bereinigen oder verbieten, auf eigener Domain ausliefern (Cookies/Origin trennen).
Testen und Lernen
- Eigene Anwendung mit
../-Eingaben testen (Unit-Tests), statische Analyse (Semgrep/CodeQL), Dependency-Updates (Bibliotheken zum Entpacken). - Legal üben: OWASP Juice Shop, DVWA, WebGoat, PortSwigger Academy, TryHackMe (eigene Lernumgebung!).
- Rechtlich: Fremde Systeme nie ohne Erlaubnis testen (§ 202a–c StGB, siehe Hacking-Recht).
- Einordnung: OWASP Top 10 (Broken Access Control, Injection, Security Misconfiguration).
- Meldung von Funden über Responsible Disclosure.
Siehe auch: OWASP Top 10, SQL-Injection, Responsible Disclosure