Skip to content

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:

  1. Welche Eigenschaften schlecht validiert werden

    • Größe, Typ, Inhalte, Encoding
  2. 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 .htaccess in Ordnern
    -> kann Execution Rules ändern -> Upload = RCE möglich

Beispiele:

  • .htaccess
  • .user.ini (PHP)
  • .config Files

Nullbytes / Encoding / Parsing Tricks

Klassische Bypasses:

.pHp
.htaccess überschreiben
%2Ephp
.php%00.png
%00.jpg
.asp;.jpg
.php.
exploit.p.phphp

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:

  1. Datei kommt in Sandbox (nicht direkt ins Filesystem)
  2. Dateiname wird randomisiert
  3. komplette Validierung
  4. 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