El formulario usa atributos como accept=".jpg,.jpeg,.png" y una función JavaScript (checkFile()) para asegurarse de que solo se seleccionen imágenes. Si eliminamos checkFile y el accept, o cambiamos el JS, lo bypasseamos. A veces también hay que modificar el Content-Type.
Filtros en BlackList
A veces filtran extensiones como .php, php7, phps; es débil porque no considera otras que ejecutan PHP y puede ser sensible a mayúsculas/minúsculas. Fuzzing de extensiones con FFUF/Burp: puede que .phar sí funcione; sube un hello world y filtra por la extensión que lo devuelve en el body. Lista: PayloadsAllTheThings / Extension PHP / extensions.lst.
Filtros en WhiteList
El servidor solo permite extensiones específicas. Bypass con shell.jpg.php; a veces Apache está mal configurado y shell.php.jpg funciona porque contiene .php. Otra técnica, insertar caracteres:
txt
%20 %0a %00 %0d0a / .\ . … :
Por ejemplo shell.php%00.jpg.
Filtros Type
Content-Type Header: el servidor compara con image/jpg, image/jpeg, image/png, image/gif.
MIME-Type: un archivo cuyo contenido empieza por GIF8 se identifica como imagen GIF.