Informationsoffenlegung durch Verzeichnisauflistung

Beschreibung

Informationsoffenlegung durch Verzeichnisauflistung ist eine Schwachstelle, bei der eine Verzeichnisauflistung offengelegt wird, die Informationen über die Webanwendung preisgibt oder Zugriff auf Dateien ermöglicht, die nicht öffentlich zugänglich sein sollten. Wenn Webserver so konfiguriert sind, dass sie Verzeichnisinhalte anzeigen, wenn keine Standard-Indexdatei existiert, können Angreifer die Verzeichnisstruktur durchsuchen, versteckte Dateien entdecken, auf Backup-Dateien zugreifen, Konfigurationsdateien einsehen und die Anwendungsarchitektur verstehen. Diese Informationen erleichtern weitere Angriffe, indem Dateinamen, Strukturen und potenziell sensible Daten offengelegt werden.

Risiko

Verzeichnisauflistungs-Offenlegung birgt erhebliche Sicherheitsrisiken. Angreifer können sensible Dateien wie Konfigurationsdateien, Backup-Dateien, Datenbank-Dumps, Log-Dateien und Quellcode entdecken. Dateinamenmuster offenbaren Anwendungsstruktur und potenziell Versionsinformationen. Versteckte administrative Schnittstellen oder Entwicklungswerkzeuge können exponiert werden. Backup-Dateien (file.php.bak, file.php~) enthalten oft Quellcode oder sensible Daten. Temporäre Dateien und Upload-Verzeichnisse können Benutzerdaten oder ausnutzbare Inhalte enthalten. In Kombination mit anderen Schwachstellen ermöglichen Verzeichnisinformationen gezielte Angriffe auf spezifische Dateien oder Anwendungskomponenten.

Lösung

Deaktivieren Sie die Verzeichnisauflistung in der Webserver-Konfiguration global und pro Verzeichnis. Verwenden Sie explizite Index-Dateien (index.html, index.php) in allen Verzeichnissen. Konfigurieren Sie Webserver so, dass sie 403 Forbidden oder 404 Not Found für Verzeichnisse ohne Index-Dateien zurückgeben. Entfernen oder beschränken Sie den Zugriff auf Backup-Dateien, temporäre Dateien und Entwicklungsartefakte. Platzieren Sie sensible Dateien außerhalb des Web-Root. Implementieren Sie ordnungsgemäße Zugriffskontrollen für Dateiverzeichnisse. Verwenden Sie Web Application Firewalls, um Verzeichnisdurchlauf-Versuche zu blockieren. Scannen Sie Webserver regelmäßig mit Sicherheitstools auf exponierte Verzeichnisse.

Häufige Auswirkungen

AuswirkungDetails
VertraulichkeitBereich: Vertraulichkeit

Anwendungsdaten lesen - Verzeichnisauflistungen legen Dateinamen, Strukturen und potenziell Dateiinhalte offen und enthüllen sensible Anwendungsinformationen und Daten für Angreifer.
VertraulichkeitBereich: Vertraulichkeit

Dateien oder Verzeichnisse lesen - Angreifer können Dateien entdecken und darauf zugreifen, die nicht öffentlich sein sollten, einschließlich Backup-Dateien, Konfigurationsdateien und Quellcode.

Beispielcode

Verwundbarer Code

# Verwundbar: Apache-Konfiguration mit aktivierter Verzeichnisauflistung
# /etc/apache2/sites-available/example.conf

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html

    # Verwundbar: Indexes-Option aktiviert Verzeichnisauflistung
    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Verwundbar: Keine Einschränkungen für sensible Verzeichnisse
    <Directory /var/www/html/uploads>
        Options Indexes
        # Jeder kann hochgeladene Dateien durchsuchen
    </Directory>

    # Verwundbar: Backup-Verzeichnis exponiert
    <Directory /var/www/html/backup>
        Options Indexes
        # Datenbank-Dumps, Konfigurations-Backups sichtbar
    </Directory>
</VirtualHost>
# Verwundbar: Nginx-Konfiguration mit aktiviertem autoindex
server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # Verwundbar: Globales autoindex aktiviert
    autoindex on;

    location /uploads/ {
        autoindex on;
        # Listet alle hochgeladenen Dateien
    }

    location /logs/ {
        autoindex on;
        # Anwendungslogs exponiert
    }
}
# Verwundbar: Python-Webserver mit Verzeichnisauflistung
from http.server import HTTPServer, SimpleHTTPRequestHandler
import os

class VerwundbarerHandler(SimpleHTTPRequestHandler):
    def do_GET(self):
        path = self.translate_path(self.path)
        if os.path.isdir(path):
            # Verwundbar: Listet Verzeichnisinhalte
            return self.list_directory(path)
        return super().do_GET()

if __name__ == '__main__':
    server = HTTPServer(('0.0.0.0', 8000), VerwundbarerHandler)
    server.serve_forever()

Lösungscode

# Behoben: Apache-Konfiguration ohne Verzeichnisauflistung
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html

    # Behoben: Verzeichnisauflistung global deaktivieren
    <Directory /var/www/html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Behoben: Zugriff auf sensible Dateimuster blockieren
    <FilesMatch "\.(bak|old|orig|save|swp|tmp|~)$">
        Require all denied
    </FilesMatch>

    # Behoben: Versteckte Dateien blockieren
    <FilesMatch "^\.">
        Require all denied
    </FilesMatch>

    # Behoben: Backup-Verzeichnis schützen
    <Directory /var/www/html/backup>
        Require all denied
    </Directory>
</VirtualHost>
# Behoben: Nginx-Konfiguration ohne Verzeichnisauflistung
server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # Behoben: autoindex global deaktivieren
    autoindex off;

    # Behoben: Sensible Dateien blockieren
    location ~ /\. {
        deny all;
        return 404;
    }

    location ~ \.(bak|old|sql|log)$ {
        deny all;
        return 404;
    }

    location /backup/ {
        deny all;
        return 404;
    }
}
# Behoben: Python-Webserver ohne Verzeichnisauflistung
from http.server import HTTPServer, BaseHTTPRequestHandler
import os

class SichererHandler(BaseHTTPRequestHandler):
    WEB_ROOT = '/var/www/html/public'
    ALLOWED_EXTENSIONS = {'.html', '.css', '.js', '.png', '.jpg', '.pdf'}

    def do_GET(self):
        path = os.path.realpath(os.path.join(self.WEB_ROOT, self.path.lstrip('/')))
        
        # Behoben: Pfad innerhalb Web-Root prüfen
        if not path.startswith(os.path.realpath(self.WEB_ROOT)):
            self.send_error(403, 'Forbidden')
            return

        # Behoben: Keine Verzeichnisauflistung
        if os.path.isdir(path):
            self.send_error(403, 'Verzeichnisauflistung nicht erlaubt')
            return

        # Behoben: Dateierweiterung prüfen
        ext = os.path.splitext(path)[1].lower()
        if ext not in self.ALLOWED_EXTENSIONS:
            self.send_error(403, 'Dateityp nicht erlaubt')
            return

        # Datei bereitstellen...

CVE-Beispiele

  • CVE-2021-41773: Apache HTTP Server Pfaddurchlauf- und Verzeichnisauflistungs-Schwachstelle.
  • CVE-2020-5410: Spring Cloud Config Server ermöglichte Verzeichnisdurchlauf.
  • CVE-2019-3799: Spring Cloud Config Server Datei-Offenlegungs-Schwachstelle.

Referenzen

  1. MITRE Corporation. "CWE-548: Exposure of Information Through Directory Listing." https://cwe.mitre.org/data/definitions/548.html
  2. OWASP. "Testing for Directory Traversal/File Include."
  3. Apache. "Apache Module mod_autoindex - Security Considerations."