File Upload — Impossible
Hoe beveilig je een uploaddienst dan wél definitief?
1. Predict (Voorspel)
De server gooit het roer drastisch om. Alles wat binnenkomt wordt getransformeerd in plaats van alleen gecontroleerd:
// Genereer een veilige, willekeurige naam zonder originele extensie:
$target_file = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
// Herbouw de foto volledig via de GD library:
$img = imagecreatefromjpeg( $uploaded_tmp );
imagejpeg( $img, $temp_file, 100 ); // Verwoest alle metadata en verstopte code
// Gooi het origineel direct weg:
imagedestroy( $img );
Vraag: Hoe lossen het herbouwen (imagecreate) en het hernoemen de kwetsbaarheden op?
Antwoord
- Hernoemen: De willekeurige naam die de server verzint bevat geen door de hacker gekozen extensie. Een
shell.phpof../shell.php-naam verdwijnt volledig. - Herbouwen: Door de foto niet op te slaan maar in het geheugen in te laden en als schone JPEG-pixels opnieuw te schrijven, verdwijnt álle metadata, verstopte PHP-code, of andere inhoud die hackers in het bestand hadden verwerkt. Alleen de zichtbare pixels worden bewaard.
2. Run & Investigate
Start het lab en probeer alle eerder geleerde aanvallen.
Upload shell.php, een .php.jpg-bestand en een afbeelding met metadata-payload. Observeer hoe de applicatie reageert.
3. ✓ Wat moest je zien?
- Elk geüpload PHP-bestand wordt geweigerd of geneutraliseerd.
- Bestanden worden opgeslagen onder een willekeurige naam — geen enkel script kan het bestand voorspellen of direct opvragen.
- Metadata in afbeeldingen verdwijnt door de herbouw-stap.
Wil je de herbouw zelf zien? Upload een afbeelding met exiftool-metadata en bekijk de metadata van het opgeslagen bestand — alles is leeg.
Uploaden = Gecontroleerde uitvoering: Een shell uploaden leidt tot Remote Code Execution (RCE) — de kroonjuwelen voor een aanvaller.
Vertrouw extensie en MIME-types nooit: Beide worden door de client meegestuurd en zijn altijd te vervalsen.
Validatie vs. Mutatie: Alleen controleren is onvoldoende gebleken. Je moet de input fysiek transformeren (image processing) en de bestandsnaam volledig overnemen.