Was ist das?¶
Wenn User Dateien auf einen Server hochladen dürfen, ohne dass diese vorher valide geprüft werden (Name, Typ, Inhalt, Größe), entsteht das Risiko, dass selbst ein harmloser Image-Upload zur kritischen Schwachstelle wird.
Gefahren: - Upload beliebiger Dateien, inkl. Exploits - Remote Code Execution (Worst Case) - Path Traversal + File Upload = extrem gefährlich - Überschreiben existierender Dateien bei gleichen Namen
Zwei zentrale Faktoren:¶
-
Welche Eigenschaften schlecht validiert werden
- Größe, Typ, Inhalte, Encoding
-
Was nach dem Upload mit der Datei passiert
- Speicherort, Rechte, Ausführbarkeit
Worst Case:
Server erlaubt z. B. Upload von .php -> Datei wird ausgeführt -> Webshell = Server-Komplettübernahme.
Wie entstehen solche Schwachstellen?¶
Auch wenn fast jede Website Upload-Restriktionen hat, scheitert es oft an:
1. Fehlerhaften Validierungsmechanismen¶
- Blacklisting gefährlicher Types -> unvollständig, leicht zu umgehen
- Parsing-Unterschiede (z. B.
.phP,.php.oder.php%00.jpg) - Manipulierbare Eigenschaften wie
Content-Type
2. Inkonsequente Validierung¶
- Unterschiedliche Hosts/Verzeichnisse prüfen unterschiedlich
- Einzelne Endpunkte vergessen oder anders konfiguriert
3. Schwache Prüfung des Datei-Inhalts¶
- MIME-Type wird blind vertraut
- Magic Bytes nicht geprüft
- Tools können Fake-JPEG, Fake-PNG usw. generieren
Wie Webserver mit statischen Dateien umgehen¶
1. Nicht-ausführbare Dateien¶
(z. B. Bilder, CSS, statisches HTML)
-> Server gibt die Datei direkt aus.
2. Ausführbare Dateien¶
(z. B. PHP, JSP)
-> Server interpretiert die Datei:
- setzt Variablen anhand des Requests
- führt Skript aus
- schickt Script-Output zurück
3. Ausführbare Dateien, die nicht ausgeführt werden dürfen¶
-> Normalerweise Fehler
-> Bei Fehlkonfiguration: Quellcode-Leak!
Hinweis:
Content-Type zeigt oft, was der Server denkt verschickt zu haben (nicht immer zuverlässig).
Webshell Deployment (RCE)¶
Das kritischste Szenario:
Server erlaubt Upload + Ausführung von serverseitigem Code.
Beispiele¶
File lesen:
<?php echo file_get_contents('/path/to/target/file'); ?>
Beliebige Befehle ausführen:
<?php echo system($_GET['command']); ?>
Anfrage-Beispiel:
GET /example/exploit.php?command=id HTTP/1.1
Resultat:
Volle Kontrolle über den Server (lesen/schreiben, pivoting, exfiltration usw.)
Wie verhindert man das?¶
1. Whitelist statt Blacklist¶
Definiere erlaubte File-Types (z. B. JPG, PNG) - alles andere blockieren.
2. Dateinamen bereinigen¶
- keine Traversal-Sequenzen (
../) - keine Sonderzeichen, keine Nullbytes
3. Dateien umbenennen¶
- verhindert Überschreiben
- verhindert Ausnutzen bestimmter Namensmuster
4. Dateien erst nach kompletter Validierung speichern¶
- vorher Sandbox / tmp-Ordner nutzen
5. Best Practices / Frameworks nutzen¶
- nie eigene „Quick & Dirty“-Validierung bauen
🔧 Erweitere Angriffsszenarien¶
🛠️ Überschreiben von Server-Konfigurationen¶
- Apache liest
.htaccessin Ordnern
-> kann Execution Rules ändern -> Upload = RCE möglich
Beispiele:
.htaccess.user.ini(PHP).configFiles
Nullbytes / Encoding / Parsing Tricks¶
Klassische Bypasses:
Mix aus Encodings erzeugt oft Parsing-Inkonsistenzen.
Schwachstellen bei der Dateiinhaltsvalidierung¶
Magic Bytes prüfen¶
Beispiele:
- JPEG: FF D8 FF
- PNG: 89 50 4E 47
Angreifer können: - Magic Bytes faken - Polyglot-Files bauen (.jpg + .php gleichzeitig)
Moderne Systeme & Sandbox-Validierung¶
Viele moderne Upload-Systeme arbeiten so:
- Datei kommt in Sandbox (nicht direkt ins Filesystem)
- Dateiname wird randomisiert
- komplette Validierung
- Wenn OK -> Übernahme ins echte Filesystem
Race Conditions möglich:
- Datei wird ausgeführt, bevor sie gelöscht wird
- besonders bei URL-Uploads (System muss erst downloaden)
Alternative Angriffe (ohne RCE)¶
1. Client-Side Script Uploads¶
- HTML, SVG, Markdown -> XSS payloads
- DOCX/XLSX -> XXE / Macro-Abuse
2. PUT-Uploads¶
Wenn WebDAV / PUT offen ist:
PUT /images/exploit.php HTTP/1.1 Host: vulnerable-website.com Content-Type: application/x-httpd-php
-> Datei wird direkt gespeichert = RCE
🛡️ Zusammenfassung - Wie verhindert man File-Upload Vulnerabilities¶
- Whitelist erlaubter Endungen
- Dateinamen bereinigen & umbenennen
- Content-Type und Magic Bytes prüfen
- Sandbox-Validierung nutzen
- Frameworks statt eigene Validatoren
- Ausführbare Dateien generell verbieten
- Konfigurationsdateien nicht im Upload-Pfad erlauben
- Uploads niemals mit Ausführungsrechten speichern