Eine sichere Upload-Funktion beruht auf mehreren Maßnahmen, die gemeinsam umgesetzt werden. Das OWASP File Upload Cheat Sheet listet sie auf. Dieser Artikel geht die Liste durch, weist auf die Punkte hin, die sich leicht übersehen lassen, und überführt sie in Tests, die Sie gegen jeden Upload-Endpunkt ausführen können.
Wogegen Sie sich schützen
Das Cheat Sheet fasst die Bedrohungen unter dem Begriff "malicious files" zusammen. Die erste ist ein Angriff auf die Software, die die Datei verarbeitet. Ein Angreifer liefert eine Datei, die eine Schwachstelle im Parser oder im Verarbeitungsmodul ausnutzt. Als Beispiele nennt das Cheat Sheet den ImageTrick-Exploit und XXE.
Die zweite ist Phishing. Das Cheat Sheet nennt als Beispiel ein Bewerbungsformular. Der Upload wird damit zu einem Weg, den Personen, die die Datei öffnen, eine schädliche Datei zu präsentieren.
Die dritte betrifft die Verfügbarkeit. ZIP-Bomben, XML-Bomben (der Billion-Laughs-Angriff) und schlicht riesige Dateien können den Speicherplatz des Servers füllen und seine Verfügbarkeit beeinträchtigen.
Validieren, bevor Sie akzeptieren
Das Cheat Sheet legt eine Reihenfolge fest: Wenden Sie die Eingabevalidierung an, bevor Sie die Dateiendung prüfen. Anschließend wird mit einer Allowlist gearbeitet.
- Erlaubte Dateiendungen auflisten. Lassen Sie nur die unbedenklichen Endungen zu, die die Geschäftsfunktion benötigt. Ein Formular für Profilfotos hat keinen Grund, etwas anderes als einige wenige Bildformate zu akzeptieren.
- Dateityp validieren. Verlassen Sie sich nicht auf den angegebenen
Content-Type, da er gefälscht werden kann. Validieren Sie Dateityp und Signatur, bevor Sie den Upload akzeptieren. - Eine Obergrenze für die Länge des Dateinamens festlegen und nach Möglichkeit die zulässigen Zeichen einschränken.
- Eine Obergrenze für die Dateigröße festlegen.
Besteht eine Datei eine dieser Prüfungen nicht, weisen Sie sie ab.
Name und Speicherort sorgfältig behandeln
Das Cheat Sheet empfiehlt, den vom Benutzer vergebenen Dateinamen durch einen von der Anwendung generierten Namen zu ersetzen. Tun Sie das bei jedem Upload, unabhängig vom Dateityp.
Der Speicherort ist ebenso wichtig wie die Datei selbst. Speichern Sie Uploads nach Möglichkeit auf einem anderen Server. Ist das nicht möglich, legen Sie sie außerhalb des Webroots ab.
Müssen Dateien öffentlich erreichbar sein, verwenden Sie einen Handler innerhalb der Anwendung, der eine Kennung einer Datei zuordnet (someid zu file.ext), statt den Speicherpfad offenzulegen.
Zwei weitere Punkte der Liste werden leicht vergessen:
- Nur autorisierte Benutzer sollten Dateien hochladen können.
- Schützen Sie den Upload vor CSRF-Angriffen.
Gespeicherte Dateien prüfen und verarbeiten
Die Validierung prüft, ob eine Datei plausibel aussieht. Das Cheat Sheet ergänzt einen weiteren Schritt: Lassen Sie die Datei, sofern verfügbar, durch eine Antivirus-Engine oder eine Sandbox laufen, um sicherzustellen, dass sie keine schädlichen Daten enthält.
Für geeignete Dokumenttypen wie PDF und DOCX sollten Sie CDR (Content Disarm & Reconstruct) als zusätzlichen Verarbeitungsschritt in Betracht ziehen.
Das Cheat Sheet verlangt außerdem, dass alle eingesetzten Bibliotheken sicher konfiguriert und aktuell gehalten werden. Da Schwachstellen in Parsern zu den genannten Bedrohungen zählen, sollten Sie diesen Punkt einer namentlich benannten Person mit einem Termin für die Überprüfung zuweisen.
Jeden Endpunkt testen
Das Cheat Sheet listet Maßnahmen auf, keine Testfälle. Jede Zeile der folgenden Tabelle ist unsere eigene Ableitung aus seiner Checkliste, und die dritte Spalte zeigt, aus welchem Punkt sie stammt. Führen Sie die Tests gegen jeden Upload-Endpunkt aus, auch gegen Admin-Werkzeuge und Endpunkte, die nur für einen einzelnen Kunden ergänzt wurden.
| Test | So sieht ein bestandener Test aus | Grundlage |
|---|---|---|
| Eine Skriptdatei hochladen, die auf eine erlaubte Endung umbenannt wurde | Wird nach der Dateitypvalidierung abgewiesen | Abgeleitet: Dateityp validieren |
Eine nicht erlaubte Datei mit einem erlaubten Content-Type senden | Wird weiterhin abgewiesen | Abgeleitet: dem Content-Type-Header nicht vertrauen |
| Einen sehr langen Dateinamen übermitteln | Wird abgewiesen oder durch einen generierten Namen ersetzt | Abgeleitet: Obergrenze für die Länge des Dateinamens, generierte Dateinamen |
| Eine Datei oberhalb der Größenbeschränkung hochladen | Wird abgelehnt | Abgeleitet: Obergrenze für die Dateigröße |
| Die gespeicherte Datei durch Erraten ihres Pfads abrufen | Nur über den Handler erreichbar | Abgeleitet: Speicherort, zuordnender Handler |
| Upload ohne Session oder ohne CSRF-Token | Wird abgelehnt | Abgeleitet: autorisierte Benutzer, CSRF-Schutz |
| In einer Testumgebung eine ZIP- oder XML-Bombe hochladen | Der Dienst bleibt verfügbar | Abgeleitet: Bedrohung der Verfügbarkeit |
Als weiterführende Referenz beschreibt sich der OWASP Web Security Testing Guide selbst als die führende Ressource für Cybersecurity-Tests für Entwickler von Webanwendungen und Sicherheitsexperten. Der OWASP Application Security Verification Standard liefert nummerierte Anforderungen, gegen die Sie prüfen können. Wenn Sie eine davon in einem Ticket oder Bericht zitieren, geben Sie die Version an, zum Beispiel v5.0.0-1.2.5, da sich Kennungen zwischen Versionen des Standards ändern können.
Wo Sie anfangen
- Listen Sie jeden Endpunkt auf, der eine Datei annimmt, einschließlich Admin-Werkzeugen, Importfunktionen und alter Plugins.
- Legen Sie für jeden Endpunkt die erlaubten Dateiendungen, die maximale Dateigröße und die maximale Länge des Dateinamens fest und wenden Sie die Eingabevalidierung vor der Prüfung der Dateiendung an.
- Ersetzen Sie vom Benutzer vergebene Dateinamen durch generierte. Verlagern Sie den Speicher auf einen separaten Server oder außerhalb des Webroots und liefern Sie öffentliche Dateien über einen Handler aus, der IDs Dateinamen zuordnet.
- Ergänzen Sie Dateityp- und Signaturvalidierung, einen Schritt mit Antivirus oder Sandbox sowie CDR für die Dokumenttypen, die Sie akzeptieren. Prüfen Sie, ob die Parsing-Bibliotheken aktuell und sicher konfiguriert sind.
- Überführen Sie die Testtabelle in automatisierte Prüfungen und führen Sie diese vor jedem Release aus. Wenn Sie das Ergebnis extern prüfen lassen möchten, kann unser Penetrationstest-Service die Endpunkte testen, und unsere Unterstützung bei der sicheren Softwareentwicklung hilft Ihnen, wenn sich die Funktion noch in der Designphase befindet. Die OWASP-Hinweise zu Datei-Uploads dienen in beiden Fällen als Prüfcheckliste.
