Upload di file: dalla foto profilo alla webshell
Accettare file dagli utenti è rischioso se il file può essere eseguito o servito. Il caso peggiore: caricare shell.php in una cartella servita dal web server.
I bypass comuni
Controllo della sola estensione: si aggira con shell.php.jpg, doppie estensioni, .phtml, o maiuscole. Controllo del solo Content-Type: è impostato dal client. Controllo dei magic bytes: si mette un header GIF valido davanti a codice PHP (GIF89a;<?php...). Path traversal nel nome per uscire dalla cartella upload.
Content-Type: image/jpeg
filename="a.php"
GIF89a;<?php system($_GET['c']); ?>Difesa
Whitelist rigida delle estensioni, rinomina i file con nomi generati, salva fuori dalla webroot o in storage che non esegue codice, servi con Content-Disposition: attachment. Disabilita l'esecuzione nella cartella upload (nginx: nessun handler PHP lì). Valida il contenuto reale, limita dimensione e tipo.