file-import5. File upload vulnerabilities

File upload vulnerabilities

Este tipo de vulnerabilidad se centra en la mala configuración o nula existencia de filtros de seguridad en las entradas de subida de archivos, los que permiten al atacante alojar archivos maliciosos que alteren el comportamiento esperado de un sistema e incluso le permitan ganar el acceso total al sistema.

Causas

La causa principal es la debilidad en las políticas de subida de archivos, empleando escasas o nulas reglas para los archivos, existe una serie básica de filtros para garantizar la legitimidad del archivo que se intenta subir. Aún así, el desarrollador debe contemplar las múltiples formas de evadir dichos filtros para robustecer los filtros de seguridad. El atacante puede emplear largas listas de payloads o cargas útiles que buscan evadir los filtros presentes en un sistema, un recurso recurrente el el repositorio PayloadsAllTheThingsarrow-up-right de Swisskyarrow-up-right, que cuenta con colecciones amplias de wordlists para cada escenario, donde ya incluye payloads ofuscados para evitar los filtros, incluso algunos payloads cuentan con métodos de evasión anidados para mayor porcentaje de efectividad.

Filtros

Algunos de los filtros que se pueden implementar y a su vez probar su existencia en caso de un atacante son:

  • Filetype

  • Contenido

  • Tamaño

  • Nombre

  • Extensiones

Validación defectuosa

Cuando se manda un formulario HTML, el buscador normalmente envía el tipo de dato con el content type Header application/x-www-form-url-encoded. Usado para mandar un texto simple como un nombre o una dirección. Sin embargo no es eficiente para mandar una gran cantidad de datos binarios como es en el escenario de la subida de imágenes o archivos PDF. En este caso, el content type multipart/form-data es preferible. Considera un formulario el cual contiene campos para subir una imagen, proveyendo una descripción a esta e ingresando tu nombre de usuario. Mandando el formulario resulta en una petición que luce como esto:

Como puedes ver, el cuerpo del mensaje se divide en partes separadas por cada una de las entradas del formulario. Cada parte contiene un Content-Disposition que otorga información básica sobre la entrada relacionada. Cada parte individual puede también contener su propio Content-Type, que informa al servidor el tipo de MIMEarrow-up-right de los datos mandados. Una de las maneras en que un sitio web puede intentar validad la subida de archivos es mediante la validación del content type del campo mandado, esperando que coincida con el tipo de MIME esperado. Como puede ser que si espera solamente imágenes, solo acepte tipos como image/jpeg e image/png. Así se evita confiar de primera mando en los headers de los formularios, pues dichos headers pueden ser fácilmente manipulados con herramientas como Burpsuite que en caso de no tener una segunda validación a nivel back-end puede resultar en una evasión de seguridad.

Ejemplos

Explotando subidas de archivos sin filtros

Las entradas que esperan un archivo, sin ningún filtro de por medio, pueden ser vulneradas con un reverse shell el cual garantizaría el acceso remoto no deseado a cualquier atacante. Los tipos de archivos mayormente usados para este propósito son los archivos PHP, Java o Python, y que son configurados también para ejecutar código, lo que hace una tarea trivial para el atacante el crear su propio web shell en el servidor. La habilidad de ejecutar una web shell implica que el atacante tiene acceso al control completo del sistema hasta donde el usuario con el que se ejecuta el archivo se lo permita. Un ejemplo de código PHP malicioso que ayuda a filtrar información interna es el siguiente: <?php echo file_get_contents('/path/to/target/file'); ?> Una vez mandado el código, retornará el archivo del objetivo en la respuesta. Un ejemplo más versátil de un web shell podría lucir así: <?php echo system($_GET['command']); ?> El anterior script permite ejecutar de forma arbitraria comandos mediante el parámetro command como se muestra a continuación: GET /example/exploit.php?command=id HTTP/1.1 Lo que retornaría en la respuesta la salida del comando, que identifica el id del usuario que ejecuta los scripts de la página. Existe una extensa variedad de web shells para cada escenario, un atacante debe de conocer multiples formas para cada caso y en la actualidad existen herramientas que facilitan el armado de web shells, reverse shells como podría ser el caso de la página revshellsarrow-up-right que pertenece a Ryan Montgomery (aka. 0dayCTF)arrow-up-right

References

https://portswigger.net/web-security/learning-paths/server-side-vulnerabilities-apprentice/file-upload-apprentice/file-upload/what-are-file-upload-vulnerabilities arrow-up-right

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master arrow-up-right

https://github.com/swisskyrepo arrow-up-right

https://www.revshells.com/ arrow-up-right

https://github.com/0dayCTF arrow-up-right

https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_typesarrow-up-right

Last updated