Een veilige uploadfunctie berust op meerdere maatregelen die samen worden toegepast, en de OWASP File Upload Cheat Sheet zet ze op een rij. Dit artikel loopt die lijst door, wijst de punten aan die makkelijk worden overgeslagen en vertaalt de lijst naar tests die u op elk upload-endpoint kunt uitvoeren.
Waartegen u zich verdedigt
De cheatsheet groepeert de dreigingen onder "malicious files". De eerste is een aanval op de software die het bestand verwerkt. Een aanvaller levert een bestand aan dat misbruik maakt van een kwetsbaarheid in de parser of de verwerkingsmodule. De cheatsheet noemt de ImageTrick-exploit en XXE als voorbeelden.
De tweede is phishing. De cheatsheet gebruikt een sollicitatieformulier als voorbeeld. De upload wordt dan een manier om een kwaadaardig bestand voor te leggen aan de mensen die het openen.
De derde is beschikbaarheid. ZIP-bommen, XML-bommen (de billion laughs-aanval) en simpelweg enorme bestanden kunnen de opslagruimte van de server vullen en de beschikbaarheid van de server schaden.
Valideer voordat u accepteert
De cheatsheet schrijft een volgorde voor: pas input validation toe voordat u de extensie valideert. Vervolgens werkt u met een allowlist.
- Maak een lijst van toegestane extensies. Sta alleen de veilige extensies toe die de bedrijfsfunctie nodig heeft. Een formulier voor een profielfoto heeft geen reden om iets anders te accepteren dan enkele afbeeldingstypen.
- Valideer het bestandstype. Vertrouw niet op de opgegeven
Content-Type, want die kan worden vervalst. Valideer het bestandstype en de signature voordat u de upload accepteert. - Stel een maximale lengte voor bestandsnamen in en beperk waar mogelijk de toegestane tekens.
- Stel een maximale bestandsgrootte in.
Als een bestand bij een van deze controles faalt, weigert u het.
Ga zorgvuldig om met naam en locatie
De cheatsheet adviseert om de door de gebruiker opgegeven bestandsnaam te vervangen door een naam die de applicatie zelf genereert. Doe dit bij elke upload, ongeacht het bestandstype.
Waar het bestand wordt opgeslagen is even belangrijk als wat het bestand is. Sla uploads waar mogelijk op een andere server op. Is dat niet mogelijk, sla ze dan op buiten de webroot.
Moeten bestanden openbaar bereikbaar zijn, gebruik dan een handler binnen de applicatie die een identifier koppelt aan een bestand (someid naar file.ext), in plaats van het opslagpad bloot te geven.
Twee andere punten uit de lijst vergeet u gemakkelijk:
- Alleen geautoriseerde gebruikers mogen bestanden kunnen uploaden.
- Bescherm de upload tegen CSRF-aanvallen.
Scan en verwerk wat u bewaart
Validatie controleert of een bestand er goed uitziet. De cheatsheet voegt een extra stap toe: laat het bestand, indien beschikbaar, door een antivirusengine of sandbox controleren om vast te stellen dat het geen kwaadaardige data bevat.
Overweeg voor geschikte documenttypen, zoals PDF en DOCX, CDR (Content Disarm & Reconstruct) als aanvullende verwerkingsstap.
De cheatsheet stelt ook dat alle gebruikte libraries veilig geconfigureerd en up-to-date moeten zijn. Omdat kwetsbaarheden in parsers een van de genoemde dreigingen zijn, is dit het punt dat u het best toewijst aan een met naam genoemde persoon, met een reviewdatum.
Test elk endpoint
De cheatsheet bevat maatregelen, geen testcases. Elke rij hieronder is onze eigen afleiding uit de checklist, en de derde kolom laat zien van welk punt de test is afgeleid. Voer de tests uit op elk upload-endpoint, inclusief beheertools en endpoints die voor één enkele klant zijn toegevoegd.
| Test | Hoe een geslaagde test eruitziet | Grondslag |
|---|---|---|
| Upload een scriptbestand dat is hernoemd naar een toegestane extensie | Geweigerd na validatie van het bestandstype | Afgeleid: valideer het bestandstype |
Verstuur een niet-toegestaan bestand met een toegestane Content-Type | Wordt nog steeds geweigerd | Afgeleid: vertrouw de Content-Type-header niet |
| Verstuur een zeer lange bestandsnaam | Geweigerd, of vervangen door een gegenereerde naam | Afgeleid: maximale lengte bestandsnaam, gegenereerde bestandsnamen |
| Upload een bestand boven de maximale grootte | Geweigerd | Afgeleid: maximale bestandsgrootte |
| Vraag het opgeslagen bestand op door het pad te raden | Alleen bereikbaar via de handler | Afgeleid: opslaglocatie, handler met mapping |
| Upload zonder sessie of zonder CSRF-token | Geweigerd | Afgeleid: geautoriseerde gebruikers, CSRF-bescherming |
| Upload een ZIP- of XML-bom in een testomgeving | De dienst blijft beschikbaar | Afgeleid: dreiging voor beschikbaarheid |
Als bredere referentie beschrijft de OWASP Web Security Testing Guide zichzelf als de belangrijkste cybersecurity-testbron voor webapplicatieontwikkelaars en beveiligingsprofessionals. De OWASP Application Security Verification Standard biedt genummerde eisen om tegen te toetsen. Als u een van beide aanhaalt in een ticket of rapport, vermeld dan de versie, bijvoorbeeld v5.0.0-1.2.5, omdat identifiers tussen versies van de standaard kunnen veranderen.
Waar u kunt beginnen
- Maak een lijst van elk endpoint dat een bestand accepteert, inclusief beheertools, importfuncties en oude plugins.
- Bepaal per endpoint de toegestane extensies, de maximale bestandsgrootte en de maximale lengte van de bestandsnaam, en pas input validation toe vóór de extensiecontrole.
- Vervang door gebruikers opgegeven bestandsnamen door gegenereerde namen. Verplaats de opslag naar een aparte server of buiten de webroot, en lever openbare bestanden via een handler die ID's koppelt aan bestandsnamen.
- Voeg validatie van bestandstype en signature toe, een antivirus- of sandboxstap, en CDR voor de documenttypen die u accepteert. Controleer of parsing-libraries up-to-date en veilig geconfigureerd zijn.
- Zet de testtabel om in gescripte controles en voer die uit vóór elke release. Wilt u een externe beoordeling van het resultaat, dan kan onze pentestdienst de endpoints testen, en onze ondersteuning bij veilige softwareontwikkeling kan helpen als de functie nog in de ontwerpfase zit. De OWASP-richtlijnen voor bestandsuploads dienen in beide gevallen als reviewchecklist.
