Empezaremos con la primera (y más débil) linea de defensa: filtrado del lado del cliente.
Como mencionamos previamente, el filtrado del lado del cliente suele ser extremadamente fácil de bypassear. Como ocurre por completo en la máquina que puedes controlar, al tener acceso al código es fácil de modificar.
Hay cuatro maneras fáciles de bypassear los típicos filtros de subida del lado del cliente:
- Deshabilita JavaScript en tu navegador: Esto funcionará si el sitio web no requiere JavaScript para ofrecer funcionaliddades básicas.
- Intercepta y modifica la página entrante: Usando Burp Suite, podemos interceptar la página entrante y quitarle el filtro JavaScript antes de que tenga oportunidad de ejecutarse.
- Intercepta y modifica el archivo subido: Este método permite que la página se cargue de forma normal pero intercepta el archivo subido después de haber pasado los filtros pero cuando todavía no ha llegado al servidor.
- Manda el archivo directamente al punto de subida: Si puedes mandar el archivo directamente al punto de salida, puedes evitar filtros del navegador. El comando para dicho propósito sería algo así:
curl -X POST -F "submit:<value>" -F "<file-parameter>:@<path-to-file>" <site>. Para poder usar este método deberías primero interceptar una petición de subida exitosa para ver parámetros, headers y demás.
Cubriremos los métodos 2 y 3 en profundidad debajo.
Asumamos que hemos encontrado una página de subida.

Como siempre, miraremos el código fuente. Aquí podemos ver una función JavaScript básica que comprueba el tipo MIME de los archivos subidos:

En esta instancia podemos ver que el filtro está usando una whitelist para excluir cualquier tipo MIME que no sea image/jpeg.
El próximo paso es intentar una subida de archivo. Si seleccionamos JPEG, la función lo acepta y cualquier otra la rechaza.
Habiendo establecido esto, arrancamos BurpSuite y recargamos la página. Veremos nuestra propia petición al sitio web pero lo que realmente queremos es ver es la respuesta del servidor, así que hacemos click derecho en la información interceptada, bajamos hasta "Do Intercept" y seleccionamos "Response to this Request".

Cuando hacemos click en "Forward" arriba de la ventana, veremos la respuesta del servidor a nuestra petición. Aquí, podemos borrar, comentar o romper la función JavaScript antes de que tenga oportunidad de cargar.

Habiendo borrado la función, le damos de nuevo a "Forward" hasta que veamos que el sitio web ha terminado de cargarse y ahora ya podemos subir cualquier tipo de archivo a la página.

Burp Suite no intercepta (por defecto) archivos JavaScript externos que la página cargue. Si necesitas editar un script que no esté en la página principal, necesitas ir a Options > Intercept Client Requests y editar la condición de la primera línea para eliminar ^js$|:

Ya hemos bypasseado este filtro interceptando y eliminándolo antes de que cargue la página, pero intentémoslo hacer subiendo un archivo con una extensión y tipo MIME legítimos e interceptándolo y corrigiéndolo con BurpSuite.
Habiendo recargado la página web, para poner el filtro en su lugar, tomemos la reverse shell que hemos usado antes y renombrémosla para que se llame "shell.jpg". Como el archivo cumple con la condición del tipo MIME, nuestro filtro del lado del cliente deja pasar nuestro payload sin quejas.

Una vez más, activamos Burp Suite y le damos a "Upload" para interceptar la petición.

Observa que el tipo MIME de nuestra shell PHP es image/jpeg. Cambiaremos esto a text/x-php, y la extensión de .jpg a .php y le daremos a forward.

Ahora, al navegar a http://demo.uploadvulns.thm/uploads/shell.php habiendo activado un listener, recibiremos una conexión de la shell.

Hemos cubierto en detalle dos formas de bypassear un filtro de subida de lado del cliente. Ahora es hora de que lo probemos. Ve a java.uploadvulns.thm y bypassea el filtro para conseguir una reverse shell. Recuerda escanear el sitio web con gobuster.
- Vamos al sitio web dado.

- Escanearemos mientras tanto la página con
gobuster.
- Vamos a interceptar una subida de archivo con Burp Suite.
- Abrimos Burp Suite y su navegador y vamos al sitio web que nos dan.

- Seleccionamos un archivo y activamos la intercepción.

- Le damos a "Upload" y esperamos la petición.

- Abrimos Burp Suite y su navegador y vamos al sitio web que nos dan.
- El content type parece ser
image/png.
- Le damos a "Forward".
Parece que se ha subido exitosamente. - Vamos ahora a subir una
shell.phpy a capturar la respuesta.- Editamos la shell.

- Nos ponemos en escucha.

- Subimos la shell y la interceptamos con Burp Suite.
Parece que no nos deja. - Le cambiamos la extensión a
.png.
- Ahora sí.

- Vamos a interceptarlo.

- Cambiamos el filename a
reverseshell.phpy content-type atext/x-php.
- Le damos a forward hasta que ponga success.

- Editamos la shell.
- Ahora debemos navegar a la shell, que basándonos en nuestro escaneo con
gobusterseguramente esté en/images.
La página parece quedarse cargando. - Pero si volvemos al listener:

- Ahora vamos al directorio que nos dan y leemos la flag.

