Seguridad PHP explicada · defensivo
Inclusión de archivos en PHP (LFI/RFI): qué es y cómo corregirla
include y require ejecutan cualquier archivo que reciban. Si parte de la ruta viene de la petición, el visitante decide qué se ejecuta.
Última actualización
Qué es
La inclusión local (LFI) hace que include o require apunten a archivos ya presentes en el servidor, como configuraciones o registros; combinada con una subida o una línea de registro puede convertirse en ejecución de código. La inclusión remota (RFI) carga código desde otro servidor y solo funciona con allow_url_include activado, que según php.net está desactivado por defecto. MITRE la clasifica como CWE-98.
Cómo detectarlo
- Busque
include,require,include_onceyrequire_oncecuyo argumento contenga una variable y rastree esa variable hasta los datos de la petición. - Ejecute
php -iy confirme queallow_url_includeestá en Off y siopen_basedirestá definido. - Revise los registros del servidor web en busca de parámetros con
../,php://odata:; indican sondeo, no prueba de compromiso.
Cómo corregirlo
- Nunca construya una ruta de inclusión con entradas. Asigne una clave permitida a un nombre de archivo fijo, como en el ejemplo de abajo.
- Mantenga
allow_url_include = Off; considereallow_url_fopen = Offsi la aplicación no necesita lecturas remotas. - Configure
open_basedircon el directorio del sitio para que PHP no pueda abrir archivos en otro lugar. - Guarde las subidas fuera de la raíz web y nunca las incluya.
Comprobaciones de solo lectura y patrones seguros
# Find include/require with a variable path (read-only)
grep -rnE "(include|require)(_once)?\s*\(?\s*\$" --include=*.php . | grep -v /vendor/
php -i | grep -E "allow_url_include|allow_url_fopen|open_basedir"
; php.ini hardening
allow_url_include = Off
open_basedir = /var/www/example:/tmp
// Map user choices to fixed files instead of building paths
$pages = ['home' => 'home.php', 'about' => 'about.php'];
require __DIR__ . '/pages/' . ($pages[$_GET['p'] ?? 'home'] ?? 'home.php');¿basename() hace seguro un include?
Elimina los directorios, pero deja elegir cualquier archivo de ese directorio. Una lista explícita de permitidos es más segura.
¿La RFI sigue siendo un riesgo en PHP moderno?
Solo si se activó allow_url_include. La LFI sigue siendo común porque no necesita ningún ajuste especial.
Otras clases de vulnerabilidades PHP
- Inyección de objetos PHP: qué es y cómo corregirlaLa inyección de objetos PHP ocurre cuando una entrada controlada por el usuario llega a unserialize(), que puede instanciar objetos cuyos métodos mágicos ejecutan la lógica que elige el atacante.
- SSRF en PHP: qué es y cómo corregirlaLa falsificación de peticiones del lado del servidor (SSRF) ocurre cuando una app PHP descarga una URL controlada por el usuario, lo que permite alcanzar servicios internos o endpoints de metadatos de la nube a través de su servidor.
- XSS en PHP: qué es y cómo prevenirloEl cross-site scripting (XSS) ocurre cuando una página PHP imprime en HTML datos controlados por el usuario sin escapar, de modo que el script de un atacante se ejecuta en el navegador de otros visitantes.
- Exposición de phpinfo(): por qué importa y cómo corregirlaUna página phpinfo() pública revela la versión exacta de PHP, los módulos cargados, las rutas y a menudo variables de entorno o secretos, lo que ayuda a los atacantes a apuntar a fallos como PHP2Shell.
Fuentes
Los enlaces externos salen de este sitio. No alojamos código de explotación.
- CWE-98: PHP Remote File Inclusion — MITRE CWE
- Testing for Local File Inclusion — OWASP Web Security Testing Guide
- Filesystem runtime configuration (allow_url_fopen, allow_url_include) — PHP Manual
- Core php.ini directives (open_basedir, expose_php) — PHP Manual