domingo, 1 de marzo de 2009

Vulnerabilidades en FCKeditor

Luego de una buena introducción, empezamos con los posts más técnicos.
Iniciamos con algunas vulnerabilidades bastante sencillas y de criticidad elevada. Estas vulnerabilidades son aún encontradas en muchos servidores Web, tanto de instituciones públicas como privadas en todo el mundo.

Basados en una reciente evaluación, empecemos analizando un editor muy usado por diversas aplicaciones y por desarrolladores. Nos referimos a FCKeditor.

FCKeditor es un editor de texto Open Source del tipo WYSIWYG (What you see is what you get), muy parecido a editores ya conocidos como MS Word o el propio Google Docs. Lo interesante de este editor es que no necesita instalación alguna en el cliente: se basa en el servicio HTTP, es decir, a través de un browser, el usuario puede crear y modificar documentos de texto que luego pueden ser exportados y descargados. Este editor es compatible con la gran mayoría de navegadores conocidos incluyendo a Internet Explorer,
Firefox, Safari, Opera y Netscape.


Algunas de sus características son:
• Generación de código XHTML 1.0
• Soporte CSS
• Incorporar formularios
• Formateo de Fuente
• Cortar, copiar, pegar
• Inserción de imágenes
• Creación de tablas
• Menús contextuales con botón derecho
• Entre otras características

FCKeditor se basa en un núcleo escrito en JavaScript, pero, tambíén es implementado con tecnologías de lado servidor como Asp, Asp.net, Java, PHP, entre otros. Es así que este editor se convierte en una opción para aquel administrador de red que necesite implementar este tipo se soluciones en sus organizaciones.

Ahora viene lo bueno :P, dentro de sus cualidades y al igual que otros muchos sistemas, FCKeditor permite la carga de archivos. En las siguientes líneas veremos cómo es posible vulnerar la carga de archivos de una manera muy simple, para poder ejecutar scripts php. La versión de FCKEditor que hemos utilizado para las pruebas es la 2.4.3 (debido a que es la más desplegada, aunque la 2.6.4 es la más reciente).

Hemos usado una configuración por defecto (como hace el 99.9% de los instaladores), con el connector de carga de archivos habilitado. No está demás aclarar que la información expuesta en este documento es para fines exclusivamente educativos y deberia ser usada por los administradores y desarrolladores de sitios web a fin de solucionar y prevenir posibles intrusiones.

Bien, primero el mensaje "About" que nos muestra la versión utilizada en las pruebas.

El path en donde se encuentra el script que permite la carga de archivos es normalmente el siguiente:

/fckeditor/editor/filemanager/upload/php/upload.php


Como se muestra en la imagen, intentamos subir un archivo php al servidor. El motor de FCKEditor reconoce a esta extensión como no válida y lanza el error "Invalid File". Uy! no podemos hacer nada... o si??. Pues bien, vamos a algo más profundo analizando el código.

Revisemos config.php

 $Config['AllowedExtensions']['File'] = array() ;  
 $Config['DeniedExtensions']['File'] =  
 array('html','htm','php','php2','php3','php4','php5','phtml','pwml','inc','asp','aspx','ascx','jsp',  
 'cfm','cfc','pl','bat','exe','com','dll','vbs','js','reg','cgi','htaccess','asis','sh','shtml','shtm','phtm') ;  
 $Config['AllowedExtensions']['Image'] = array('jpg','gif','jpeg','png') ;  
 $Config['DeniedExtensions']['Image'] = array() ;  
 $Config['AllowedExtensions']['Flash'] = array('swf','fla') ;  
 $Config['DeniedExtensions']['Flash'] = array() ;  

Primera observación, si bien es cierto que no es vulnerabilidad, pero sí una mala práctica : permitir todo y tener excepciones de negación. Tomemos como analogía el caso típico de la configuración correcta de un firewall : "denegar todo y luego hacer excepciones de permitir". Como vemos, en este caso, se hace lo contrario, debido a que permite cualquier archivo que no tenga como extensión alguna que este prohibida explícitamente, es decir, se usa una política de aceptar todo y denegar excepciones. Imagínese que desea que sus
usuarios carguen sólo documentos, ¿por qué habría de permitirles que carguen un archivo con extensión "1" o "abc"?.

Analizamos uplodad.php

 // Get the extension.  
 $sExtension = substr( $sFileName, ( strrpos($sFileName, '.') + 1 ) ) ;  
 $sExtension = strtolower( $sExtension ) ;  

He aquí el problema. Para determinar la extensión, lo que se hace es tomar los caracteres luego del punto "." en el archivo. Luego de esto, la extensión en la variable $sExtension es buscada en los arreglos de denegados o permitidos para determinar sí el archivo sera cargado o no.

Aquí podemos indicar un punto importante, no debemos fiarnos del tipo de archivo sólo por la extensión, debemos tener en cuenta el tipo de archivo (mime-type), en php podemos usar la sigueinte sentencia para obtener el tipo de archivo: $_FILES['attachement']['type']

Por ejemplo si deseamos que nuestros usuarios carguen imágenes, entonces primero debemos permitir sólo las extensiones de imágenes que según nuestras políticas de seguridad deban ser permitidas. Luego, debemos verificar el mime-type y por último podemos verificar que sea una imágen válida intentando obtener (mediante código, en tiempo de ejecución) las dimensiones de la misma.

Es asi que si creamos un archivo con una distinta extensión con un pequeño script en php. Notemos que la extensión usada fue "php.1":


La carga de archivos se realizada exitosamente!. Ahora tan sólo tenemos que llamar al archivo desde el browser. Cómo saber cual es la ruta de subida? Afortunadamente FCKEditor nos evita la tarea de determinar dónde y lo muestra en "Uploaded File URL".

Como vemos, el script php fue ejecutado. Por lo tanto vemos otra mala práctica : no debemos permitir la ejecución de archivos cargados por los usuarios. Es decir, debemos aplicar el principio del mínimo privilegio (least privilege). Tenga en cuenta que no siempre es necesario cargar los archivos en un sítio público o que pueda ser accedido públicamente, en ocasiones puede cargar el archivo y sólo ser visto en la red local, o ser visto sólo por las personas que lo requieran.


En este caso hemos cargado un simple hello world, para los que están metidos en esto, se les debe hacer conocido la famosa c99.php que ya permite acciones para la elevación de privilegios.

Las posibilidades con la carga de archivos son muchísimas, desde un simple defacement (aunque bastante publicitados), usar el servidor como un nodo de ataque o tomar control de la red entera.

Recuerden que un atacante que busca algo específico (pueden ser espías, modificar data por dinero, delincuentes, etc) evitará en todo momento ser detectado, por ello, es una buena práctica tener un hash de cada archivo de su aplicación Web.

Tal vez el administrador nunca llegue a enterarse de este tipo de ataques sigilosos, pero pueden causar muchísimo daño, asi que no sólo debemos preocuparnos por los defacers. El advisor que explica el problema puede ser encontrado en

http://secunia.com/advisories/27123/

A modo de conclusión, consideramos necesario resaltar que existen muchas soluciones/sistemas que usan FCKeditor y debemos tener en cuenta que no siempre nos preocupamos por actualizarlos. Por ejemplo en su organización tienen una intranet hecha a la medida, para esta intranet no hay actualizaciones, pero se ha usado FCKeditor, entonces deberían actualizar y configurar apropiadamente este editor, pues representa un vector de ataque de
muy fácil explotación.


La información mostrada en este post contiene vulnerabilidades que son comunes en la mayoría de aplicaciones de carga de archivos (por ejemplo: los muy conocidos avatares en foros y comunidades), por lo tanto, deben ser bastante cuidadosos al momento de usar estafuncionalidad y en el caso de los desarrolladores, siempre tengan en cuenta la seguridad.

2 comentarios:

  1. (y) muy interesante este texto, me parecio genian sigan con su blog, esta magnifico, saludos chelano

    ResponderEliminar
  2. Excelente, para insertar archivos en fckeditor, cree mi propio manejador de archivos, intente traspasar el nombre de archivos mencionado en el articulo, y todo bien, gracias por la información.

    ResponderEliminar