File Upload Attacks

Target(s): 94.237.51.163:56227

Le han contratado para realizar una pentest en la aplicación web de comercio electrónico de una empresa. La aplicación web está en sus primeras etapas, por lo que sólo probará los formularios de carga de archivos que pueda encontrar.

Intenta utilizar lo que has aprendido en este módulo para entender cómo funciona el formulario de carga y cómo saltarse varias validaciones (si las hay) para conseguir la ejecución remota de código en el servidor back-end.

Extra Exercise

Intente anotar los principales problemas de seguridad detectados en la aplicación web y las medidas de seguridad necesarias para mitigarlos y evitar que sigan explotándose.

Pregunta 1: Intenta explotar el formulario de carga para leer la bandera que se encuentra en el directorio raíz /.

  1. Rellenamos el formulario adjuntando una imagen y capturamos las request, enviamos al Repeater la de /contact/script.js:

  1. Desde el Repeater enviamos la request y nos responde con el contenido de script.js:

  1. Cómo necesitamos que el form haga uso del método POST lo cambiamos en el código fuente de la página:

  1. Capturamos la request en el Proxy y lo enviamos al Repeater:

  1. En el Repeater cambios el path donde se hace el POST a /contact/upload.php y enviamos la request, nos da la respuesta de que solamente se permiten imágenes:

  1. Modificamos la request para que al hacer POST nos muestre el contenido de /etc/passwd:

  1. La response devuelve el contenido de /etc/passwd por lo que vemos que podemos usar esto en nuestro favor. Vamos a mostrar el contenido de upload.php encodeado en base64:

  • Código fuente cifrado en base64:

  • Código fuente descifrado:

  • En el código fuente se identifica el directorio de subidas: /user_feedback_submissions/ y el archivo se renombra como 250512_archivo.php

  1. Vamos a PayloadAllTheThings para una lista de extensiones PHP con las que podremos probar a bypassear el filtro de imágenes:

  1. Confirmamos ejecutando en php la formula de fecha PHP para saber como guarda el nombre del archivo según el código fuente descifrado de upload.php:

  1. Modificamos el POST añadiendo la línea con el resto del contenido de la request, y si vamos a la request de GET modificamos para que muestre el contenido del archivo que acabamos de subir:

  1. Modificamos la request de POST de nuevo para probar con otra de las extensiones PHP para ver si se ejecuta el echo PHP que en la anterior no se ha ejecutado, solamente lo muestra como texto plano:

  1. Volvemos a enviar la request cambiando el nombre del archivo, lanzamos de nuevo la request del GET para ver si el código se ejecuta:

  1. Comprobamos que esta vez si se ejecuta el echo de PHP, por lo que podremos ejecutar más código PHP con esta extensión. Ahora enviaremos en la request una shell PHP para ejecutar comandos de cmd:

  1. Enviamos la request POST y volvemos a enviar la request GET, añadiendo al final del archivo el ?cmd=id para ver si funciona la ejecución de comandos:

  1. Comprobamos que se pueden ejecutar correctamente los comandos, por lo que podemos utilizar comandos para encontrar la flag. Listamos el contenido de la raíz para ver cuál es el archivo flag:

  1. Vemos que el archivo flag tiene un nombre extenso, lo copiamos, preparamos el comando en la request y la enviamos desde el Repeater y obtenemos la flag:

Última actualización