Ungeparster roher Web-Inhalt-Auslieferung
Beschreibung
Ungeparster roher Web-Inhalt-Auslieferung ist eine Schwachstelle, bei der ein Produkt rohen Inhalt oder unterstützenden Code unterhalb des Web-Dokumentenstamms mit einer Erweiterung speichert, die der Server nicht spezifisch behandelt. Wenn Code in Dateien mit Erweiterungen wie ".inc", ".bak", ".conf" oder ".pl" liegt, die keine Server-Handler haben, sendet der Server typischerweise Dateiinhalte direkt an Anfragende ohne erwartete Vorverarbeitung. Dies legt sensible Daten wie Datenbank-Anmeldedaten, API-Schlüssel und interne Logik offen und gefährdet möglicherweise Anwendungen und zugehörige Komponenten.
Risiko
Ungeparste Inhaltsauslieferung führt zu kritischer Informationsoffenlegung. Include-Dateien (.inc), die Datenbank-Anmeldedaten enthalten, werden offengelegt, wenn sie direkt angefordert werden. Backup-Dateien (.bak, .old, .swp) können frühere Versionen mit Schwachstellen oder Geheimnissen enthalten. Konfigurationsdateien ohne Handler legen Servereinstellungen und Anmeldedaten offen. Quellcode-Offenlegung enthüllt Geschäftslogik, Algorithmen und Sicherheitsmechanismen. Angreifer nutzen diese Informationen, um gezielte Angriffe gegen die Anwendung und ihre Infrastruktur zu entwickeln. Die Schwachstelle wird durch automatisiertes Scannen leicht entdeckt.
Lösung
Führen Sie Typprüfungen durch, bevor Dateien interpretiert werden, und konfigurieren Sie Handler für alle Dateitypen, die ausführbaren Code enthalten. Speichern Sie keine sensiblen Informationen in Dateien mit Erweiterungen, die fehlinterpretiert werden könnten. Verschieben Sie Include-Dateien und Konfigurationsdateien außerhalb des Web-Roots. Verwenden Sie ordnungsgemäße Erweiterungen (.php, .asp, .jsp) für Dateien, die Code enthalten, damit sie vom entsprechenden Handler verarbeitet werden. Konfigurieren Sie den Webserver so, dass er Zugriff auf sensible Dateierweiterungen verweigert. Implementieren Sie Defense-in-Depth, indem Sie auch sensible Konfigurationsdaten verschlüsseln.
Häufige Auswirkungen
| Auswirkung | Details |
|---|---|
| Vertraulichkeit | Umfang: Vertraulichkeit Anwendungsdaten lesen - Angreifer können auf sensible Anwendungsinformationen zugreifen, die in ungeparsten Dateien gespeichert sind, einschließlich Datenbank-Anmeldedaten, API-Schlüssel und Anwendungslogik. |
Beispielcode
Anfälliger Code
<!-- Anfällig: Include-Datei mit .inc-Erweiterung gespeichert -->
<!-- Datei: /var/www/html/includes/database.inc -->
<?php
$dbHost = 'localhost';
$dbName = 'usersDB';
$dbUser = 'admin';
$dbPassword = 'skjdh#67nkjd3$3
Anfällig: Apache-Konfiguration ohne .inc-Handler
Datei: /etc/apache2/sites-enabled/default.conf
<VirtualHost *:80>
DocumentRoot /var/www/html
# Anfällig: Kein Handler für .inc-Dateien
# Sie werden als Klartext ausgeliefert
# Anfällig: Keine Zugriffsbeschränkung auf Include-Verzeichnisse
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
```
# Anfällig: Perl-Skript mit .pl-Erweiterung aber ohne CGI-Handler
# Datei: /var/www/html/admin/config.pl
#!/usr/bin/perl
# Datenbankkonfiguration
$db_host = "db.internal.company.com";
$db_user = "webapp";
$db_pass = "Sup3rS3cr3tP@ss!";
$db_name = "production";
# API-Schlüssel
$stripe_key = "sk_live_xxxxxxxxxxxx";
$aws_secret = "AWS_SECRET_KEY_HERE";
# Wenn Server kein CGI für .pl-Dateien konfiguriert hat,
# gibt Anfrage an /admin/config.pl diesen Quellcode zurück
# Anfällig: Python-Konfigurationsdatei im Web-Root
# Datei: /var/www/html/app/settings.py
SECRET_KEY = 'django-insecure-xxxxxxxxxxxxxxxxx'
DEBUG = True
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'production_db',
'USER': 'dbadmin',
'PASSWORD': 'ProductionPassword123!',
'HOST': 'db.example.com',
}
}
# AWS-Anmeldedaten
AWS_ACCESS_KEY_ID = 'AKIAIOSFODNN7EXAMPLE'
AWS_SECRET_ACCESS_KEY = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'
# Wenn Python-Dateien nicht von WSGI behandelt werden, wird Quellcode offengelegt
Korrigierter Code
<!-- Korrigiert: Sensible Dateien außerhalb des Web-Roots verschieben -->
<!-- Datei: /var/www/config/database.php (AUSSERHALB des Web-Roots) -->
<?php
return [
'host' => getenv('DB_HOST') ?: 'localhost',
'name' => getenv('DB_NAME') ?: 'usersDB',
'user' => getenv('DB_USER'),
'password' => getenv('DB_PASSWORD'),
];
?>
<!-- Datei: /var/www/html/login.php -->
<?php
// Korrigiert: Include von außerhalb des Web-Roots
$dbConfig = require('/var/www/config/database.php');
try {
$db = new PDO(
"mysql:host={$dbConfig['host']};dbname={$dbConfig['name']}",
$dbConfig['user'],
$dbConfig['password']
);
} catch (PDOException $e) {
// Korrigiert: Verbindungsdetails nicht im Fehler offenlegen
error_log($e->getMessage());
die("Datenbankverbindung fehlgeschlagen");
}
?>
# Korrigiert: Apache-Konfiguration mit ordnungsgemäßen Einschränkungen
# Datei: /etc/apache2/sites-enabled/default.conf
<VirtualHost *:80>
DocumentRoot /var/www/html
# Korrigiert: .inc-Dateien als PHP parsen
<FilesMatch "\.inc$">
SetHandler application/x-httpd-php
</FilesMatch>
# Korrigiert: Zugriff auf sensible Dateitypen vollständig verweigern
<FilesMatch "\.(inc|bak|old|swp|conf|config|ini|log|sql)$">
Require all denied
</FilesMatch>
# Korrigiert: Zugriff auf Backup-Dateien verweigern
<FilesMatch "~$">
Require all denied
</FilesMatch>
# Korrigiert: Zugriff auf versteckte Dateien verweigern
<FilesMatch "^\.">
Require all denied
</FilesMatch>
# Korrigiert: Verzeichnisauflistung deaktivieren
<Directory /var/www/html>
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
# Korrigiert: Bestimmte Verzeichnisse schützen
<Directory /var/www/html/includes>
Require all denied
</Directory>
</VirtualHost>
# Korrigiert: Nginx-Konfiguration mit Dateityp-Einschränkungen
server {
listen 80;
root /var/www/html;
# Korrigiert: Zugriff auf sensible Dateien verweigern
location ~* \.(inc|bak|old|swp|conf|config|ini|log|sql|env)$ {
deny all;
return 404;
}
# Korrigiert: Zugriff auf versteckte Dateien verweigern
location ~ /\. {
deny all;
return 404;
}
# Korrigiert: Zugriff auf Backup-Dateien verweigern (enden mit ~)
location ~ ~$ {
deny all;
return 404;
}
# Korrigiert: Include-Verzeichnisse schützen
location ^~ /includes/ {
deny all;
return 404;
}
# Korrigiert: PHP-Dateien durch PHP-FPM verarbeiten
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# Korrigiert: Konfiguration über Umgebungsvariablen
# Datei: /var/www/app/settings.py (ohne Geheimnisse)
import os
from pathlib import Path
# Korrigiert: Geheimnis aus Umgebung, nicht hartcodiert
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')
if not SECRET_KEY:
raise ValueError("DJANGO_SECRET_KEY Umgebungsvariable nicht gesetzt")
DEBUG = os.environ.get('DEBUG', 'False').lower() == 'true'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': os.environ.get('DB_NAME'),
'USER': os.environ.get('DB_USER'),
'PASSWORD': os.environ.get('DB_PASSWORD'),
'HOST': os.environ.get('DB_HOST'),
}
}
# Korrigiert: AWS-Anmeldedaten aus Umgebung
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
# Selbst wenn diese Datei offengelegt wird, werden keine Geheimnisse enthüllt
# Korrigiert: .htaccess-Datei für zusätzlichen Schutz
# Datei: /var/www/html/.htaccess
# Zugriff auf alle .inc-Dateien verweigern
<Files ~ "\.inc$">
Order allow,deny
Deny from all
</Files>
# Zugriff auf gängige Backup-Erweiterungen verweigern
<FilesMatch "\.(bak|backup|old|orig|swp|tmp)$">
Order allow,deny
Deny from all
</FilesMatch>
# Zugriff auf Konfigurationsdateien verweigern
<FilesMatch "\.(conf|config|ini|env|yml|yaml|json)$">
Order allow,deny
Deny from all
</FilesMatch>
CVE-Beispiele
- CVE-2002-1886 — ".inc"-Datei unter Web-Root wurde ungeparst zurückgegeben und legte Quellcode offen.
- CVE-2002-2065 — ".inc"-Datei unter Web-Root wurde ungeparst zurückgegeben.
- CVE-2005-2029 — ".inc"-Datei unter Web-Root wurde ungeparst zurückgegeben.
- CVE-2001-0330 — Direkte ".pl"-Dateianfrage blieb ungeparst und legte Perl-Quellcode offen.
- CVE-2007-3365 — Großgeschriebene Dateierweiterungen veranlassten Webserver, Skript-Quellcode zurückzugeben anstatt auszuführen.
Referenzen
- MITRE Corporation. "CWE-433: Unparsed Raw Web Content Delivery." https://cwe.mitre.org/data/definitions/433.html
- OWASP. "Source Code Disclosure." https://owasp.org/www-community/attacks/Source_Code_Disclosure