Sichere Programmierung von Web-Anwendungen - Remote File Inclusion / Local File Inclusion / Directory/Path Traversal
Zahlreiche erfolgreiche Angriffe auf bekannte Web-Anwendungen finden wöchentlich Einzug in einschlägige Medien. Grund genug bei der Entwicklung eigener Anwendung - egal ob zur rein internen Nutzung oder mit öffentlichem Zugang - sich mit den Hintergründen der "Web Application Security" zu beschäftigen.
Dies ist ein Auszug aus dem Buch und dem Onlinekurs "Sicherheit von Web-Anwendungen: Für Software-Entwickler und Software-Projektleiter".
Beschreibung
Wenn eine Web-Anwendung zur Laufzeit Dateien (per lokalem Dateizugriff oder auch per Web-Zugriff, z.B. HTTP) nachlädt, kann im Falle einer Sicherheitslücke, die Angabe des Dateipfades so manipuliert werden, dass interne Dateien ausgeben oder sogar interne oder externe Scripte ungewollt ausgeführt werden.
In Kombination mit einer lückenhaften Datei-Uploadfunktion kann ein Angreifer sogar eigene Script in die Web-Anwendung hochladen und zur Ausführung bringen.
Ziel eines solchen Angriffs ist meist direkt der Server bzw. die Web-Anwendung (z.B. Auslesen von Accounts, Passwörtern, Konfiguration etc.). Aber im Falle von manipulierten Scripten bzw. Links der Web-Anwendung mit eingebundenen externen Scripten können auch Nutzer direkt betroffen sein.
Beispiel mit Sicherheitslücke:
Ein typischer Versuch aus einem Dateipfad auszubrechen ist es seitens des Angreifers lokale Dateisystem-Kommandozeichen zu nutzen, etwa
https://example.com/action/show?value=/etc/passwd
ODER
https://example.com/action/show?value=../../../../passwd
Auch Steuerzeichen wie das Nullbyte (%00) können Pfadangaben manipulieren und beispielsweise abbrechen.
Gefährdete Scriptaufrufe andererseits sehen typischerweise so aus:
https://example.com/execute?script=add.php
Hierbei würde ein Angreifer ebenfalls mittels Manipulation der Pfadangaben prüfen, ob andere ausführbare Scripte (Beispiel: Web-Shop-Baukasten, LAMP-Stack) auffindbar sind oder gar ein eigenes remote Script ausführbar ist (HTTP).
Sichere Programmierung:
1)
Externe Dateien und Scripte sollten nur statisch verlinkt werden.
Soweit möglich sollten Dateiverweise programmatisch intern gelöst werden und nicht durch URL-basierte Parametrisierung. Ggf. kann eine Konfigurationsdatei oder Tabelle dafür notwendig sein. Die Auswahl von Scripten, welche zur Benutzung der Web-Anwendung ausgeführt werden, sollte statisch erfolgen. Werden Scripte extern geladen, muss dies auf Basis von explizit definierten Whitelists erfolgen (vgl. Abschnitt "Open-Redirection").
2)
Bei Dateizugriffen, z.B. auch bei nutzerbasierten Dateiuploads, müssen Filter den "Ausbruch" aus dem Zielverzeichnis verhindern.
Der Ablage im Dateisystem ist ein Datenbanksystem vorzuziehen, da hier keine Dateizugriffe über ein Dateisystem stattfinden!
Sind lokale Dateizugriffe - insbesondere aufgrund nutzerbasierten Contents - dennoch notwendig, so muss sichergestellt werden, dass Zielverzeichnisse nicht verlassen werden. Jede Programmierumgebung ermöglicht die "Kanonisierung" von Pfadangaben, die zum Überprüfen und Vergleichen von Pfadangaben genutzt werden kann. Als Beispiel sei auf folgende Methode verwiesen:
//Java
class java.io.File
getCanonicalFile(): Returns the canonical form of this abstract pathname.
Diese Variante ist als sicherer anzusehen, als eigene Filter zu bauen. Sollten Filter genutzt werden, so ist auf ein Blacklisting (etwa von Steuerzeichen wie das Nullbyte oder Absatzmarken) zu verzichten und ein Whitelisting vorzunehmen. D.h., die erlaubten Zeichen in Dateinamen werden explizit definiert, alle anderen werden verworfen. Auf Nullbyte-Verarbeitung bei eingehenden Strings ist dennoch zu achten.
Schlagworte
Remote File Inclusion, RFI, Local File Inclusion, LFI, Directory Traversal, Path Traversal, OWASP, IT-Security, Sichere Programmierung, Web-/Anwendungssicherheit, IT-Securitymanagement, Security Awareness
Kategorien: IT-Sicherheit Hintergrundartikel Programmieren/Java
Kommentare
Eigenen Kommentar hinzufügen
Teilen / Weiterempfehlen
Wenn Sie diese Seite gut finden, teilen Sie es doch ihren Kontakten mit: