stringtranslate.com

Vulnerabilidad de inclusión de archivos

Una vulnerabilidad de inclusión de archivos es un tipo de vulnerabilidad web que afecta con mayor frecuencia a las aplicaciones web que dependen de un tiempo de ejecución de scripts . Este problema se produce cuando una aplicación crea una ruta a un código ejecutable utilizando una variable controlada por el atacante de forma que le permite controlar qué archivo se ejecuta en el tiempo de ejecución. Una vulnerabilidad de inclusión de archivos es distinta de un ataque genérico de recorrido de directorio , ya que el recorrido de directorio es una forma de obtener acceso no autorizado al sistema de archivos , y 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 dará como resultado la ejecución remota de código en el servidor web que ejecuta la aplicación web afectada. Un atacante puede utilizar la ejecución remota de código para crear un shell web en el servidor web, que puede utilizarse para la desfiguración de sitios web .

Tipos de inclusión

Inclusión remota de archivos

La inclusión remota de archivos ( RFI ) se produce cuando la aplicación web descarga y ejecuta un archivo remoto. Estos archivos remotos suelen obtenerse en forma de una URL 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, excepto 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 provocar la ejecución remota de código al incluir un archivo que contiene datos controlados por el atacante, como los registros de acceso del servidor web.

Lenguajes de programación

PHP

En PHP, la causa principal se debe al uso de una entrada de usuario no validada con una función del sistema de archivos que incluye un archivo para su ejecución. Las más notables son las declaraciones includeand require. La mayoría de las vulnerabilidades se pueden atribuir 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 de forma predeterminada, en versiones anteriores estaba habilitada de forma predeterminada. [2] Para explotar la vulnerabilidad, un atacante alterará una variable que se pasa a una de estas funciones para hacer que incluya código malicioso de un recurso remoto. Para mitigar esta vulnerabilidad, todas las entradas del usuario deben validarse antes de ser utilizadas. [3] [4]

Ejemplo

Considere este script PHP que incluye un archivo especificado por solicitud:

<?php if  ( isset ( $_GET [ 'idioma' ]))  {  include ( $_GET [ 'idioma' ]  .  '.php' ); } ?>
< método de formulario  = "obtener" > < nombre de selección = "idioma" > < valor de opción = "inglés" > Inglés </ opción > < valor de opción = "francés" > Francés </ opción >       ... </ select >  < tipo de entrada  = "enviar" > </ formulario >

El desarrollador pretendía leer en english.phpo french.php, lo que modificará el comportamiento de la aplicación para mostrar el idioma que elija el usuario. Pero es posible inyectar otra ruta utilizando el languageparámetro.

La mejor solución en este caso es utilizar una lista blanca de parámetros de idioma aceptados. Si no se puede utilizar un método sólido de validación de entrada, como una lista blanca, entonces confíe en el filtrado de entrada o la validación de la ruta ingresada para asegurarse de que no contenga caracteres y patrones de caracteres no deseados. Sin embargo, esto puede requerir anticipar todas las posibles combinaciones de caracteres problemáticas. Una solución más segura es utilizar una declaración Switch/Case predefinida para determinar qué archivo incluir en lugar de utilizar una URL o un parámetro de formulario para generar dinámicamente la ruta.

Páginas JavaServer (JSP)

JavaServer Pages (JSP) es un lenguaje de script 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 archivo = "<%=" incluye / " + p +" . jsp " %> "      %>

Incluye el lado del servidor (SSI)

Un Server Side Include es muy poco común y no suele estar habilitado en un servidor web predeterminado. Un Server Side Include se puede utilizar 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

Referencias

  1. ^ "Uso de archivos remotos". PHP . Consultado el 3 de marzo de 2013 .
  2. ^ "Lista de directivas php.ini". PHP . Consultado el 21 de octubre de 2016 .
  3. ^ "Inclusión remota de archivos". The Web Application Security Consortium . Consultado el 3 de marzo de 2013 .
  4. ^ "CWE-98: Control inadecuado del nombre de archivo para la declaración Include/Require en un programa PHP ('Inclusión de archivo remoto PHP')". Common Weakness Enumeration (CWE) . Mitre . Consultado el 3 de marzo de 2013 .
  5. ^ "PHP :: Solicitud n.° 39863 :: file_exists() se trunca silenciosamente después de un byte nulo". bugs.php.net . Consultado el 21 de octubre de 2016 .
  6. ^ "Tutorial de Apache httpd: Introducción a Server Side Includes - Servidor HTTP Apache versión 2.4". httpd.apache.org . Consultado el 21 de octubre de 2016 .

Enlaces externos