Ya hemos visto el filtrado de extensiones del lado del servidor, pero vamos a aprovechar para ver cómo se comprueban los magic numbers del lado del servidor también.
Los magic numbers se utilizan para identificar los archivos de manera más precisa. El magic number de un archivo es una string de dígitos hexadecimales y es siempre la primera parte de un archivo. De esta manera, leyendo los primeros bytes de un archivo y comparándolos con una whitelist o blacklist, podemos verificar si el archivo es o no legítimo para su subida.
Esta técnica puede ser efectiva contra servidores basados en PHP pero puede fallar contra otros tipos de servidores web.
Veamos un ejemplo. Como generalmente, tenemos una página de subida.

Como es esperado, si subimos una shell.php, obtendremos un error. Sin embargo, si subimos un JPEG, el sitio web lo acepta.
Del intento anterior sabemos que los archivos JPEG son aceptados, por lo que le meteremos los magic numbers de JPEG a nuestro shell.php. Una vista rápida a la lista de firmas de la Wikipedia muestra que hay varias posibilidades de magic numbers para archivos JPEG. No debería importar cuál usemos aquí, así que elegiremos uno (FF D8 FF DB). Podríamos añadir la representación ASCII de estos caracteres (ÿØÿÛ) al principio del documento, pero es más fácil trabajar directamente en hexadecimal.
Antes de empezar, usaremos el comando file para comprobar el tipo de archivo de shell.php:

Obviamente nos dice que es un archivo PHP. Ahora vamos a añadir 4 caracteres (porque el magic number que hemos seleccionado son 4 caracteres) al inicio del documento. No importa qué caracteres sean.

Ahora vamos a abrirlo con hexeditor o cualquier otra herramienta que permita editar en hexadecimal.

Por lo que se ve la "A" se representa como 41 en hezadecimal. Vamos a cambiar las 4 "A"s por magic numbers.

Si ahora usamos el comando file:

Ahora vamos a subir la shell.

Ahí lo tenemos, hemos bypasseado el filtro basado en magic numbers del lado del servidor y obtenido una reverse shell.
Ve a magic.uploadvulns.thm y encuentra la flag en /var/www/.
- Vamos a la página dada.

- Vamos a escanear la página con
gobuster.
- Vamos a probar a subir nuestra reverse shell del tirón.
Parece que sólo admiten GIFs. - Vamos a la página de firmas de la Wikipedia y buscamos por GIF.

- Abrimos nuestro archivo shell y le metemos 6 caracteres cualquiera.

- Abrimos el documento con
hexeditor.
- Cambiamos los "42" por los caracteres seleccionados, por ejemplo
47 49 46 38 37 61.
- Guardamos y comprobamos con
file.
- Subimos el archivo "GIF".

- Nos ponemos en escucha.

- Intentamos navegar a nuestra shell, que estará en
/graphics.
Hemos recibido la reverse shell. - Vamos a leer la flag.

