Hacking uploaders
Upcoming SlideShare
Loading in...5
×
 

Hacking uploaders

on

  • 652 views

Se propone montar algunos entornos donde se demuestre que funcionan bien o mal este tipo de filtros.

Se propone montar algunos entornos donde se demuestre que funcionan bien o mal este tipo de filtros.

Statistics

Views

Total Views
652
Views on SlideShare
585
Embed Views
67

Actions

Likes
0
Downloads
4
Comments
0

1 Embed 67

http://www.linenoise.info 67

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • * En SVN BugScout solo debe descargar los ficheros fuente.
  • * En SVN BugScout solo debe descargar los ficheros fuente.
  • * En SVN BugScout solo debe descargar los ficheros fuente.
  • * En SVN BugScout solo debe descargar los ficheros fuente.
  • * En SVN BugScout solo debe descargar los ficheros fuente.
  • * En SVN BugScout solo debe descargar los ficheros fuente.
  • * En SVN BugScout solo debe descargar los ficheros fuente.
  • * En SVN BugScout solo debe descargar los ficheros fuente.

Hacking uploaders Hacking uploaders Presentation Transcript

  • Hacking Uploaders Securizar Uploaders en Aplicaciones Web Linenoise
  • Índice
    • Uploaders State-of-the-art
    • Content-type
    • Verificación de contenido del archivo de imagen
    • Verificación de extensiones
    • Acceso indirecto a ficheros
    • Inclusión local de ficheros
    • Otras consideraciones
  • Uploaders State-of-the-art
  • Uploaders State-of-the-art
    • Las aplicaciones Web permiten a los usuarios subir ficheros.
    • Los foros permiten a los usuarios subir avatares.
    • Las galerías de imágenes permiten subir fotos.
    • Las redes sociales pueden permitir la carga de imágenes, videos, etc.
    • Los blogs permiten subir avatares o fotos.
    • Muchas intranets permiten la subida indiscriminada de ficheros.
  • ¿En qué consiste implementar un Uploader?
    • Basicamente un Uploader consiste en 2 funciones independientes:
    • Aceptar ficheros de usuarios.
    • Mostrar esos ficheros a usuarios.
    Implementar funciones de upload puede ser una fuente problemas sino se toman las medidas de seguridad necesarias.
    • Consideremos este sencillo código:
    <?php $uploaddir = 'uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo &quot;File is valid, and was successfully uploaded.n&quot;; } else { echo &quot;File uploading failed.n&quot;; } ?> Los usuarios recuperaran archivos a traves de la URL: http://www.server.com/uploads/filename.txt
    • El código anterior ofrece uno de los mayores agujeros de seguridad: Envío de ficheros arbitrarios al servidor Web .
    • Cualquier usuario puede subir un fichero, por ejemplo, un shell script que permita ejecutar comandos arbitrarios en el servidor:
    <?php system($_GET[‘command’]); ?> Acto seguido podrá ejecutar comandos a través de la URL: http://www.server.com/shell.php?command=id
  • Content-Type
  • ¿Qué es y para que sirve?
    • La cabecera Content-type pertenece al protocolo HTTP.
    • Específica la forma en la que quien envía los datos (normalmente el servidor) le pueda decir a quien los recibe (el navegador, por lo general) que tipo de datos se están envíando.
    • Utiliza identificadores de tipo y subtipo, facilitando información auxiliar en caso de ser necesario.
    • Los tipos de contenido están 'normalizados' para que sirvan como deben, por ejemplo, los formatos basados en texto comienzan con text/, los de imágenes con image/, etc.
    • Se puede utilizar para comprobar el tipo de fichero que vamos a envíar al servidor.
    • Observemos el siguiente código:
    <?php if($_FILES['userfile']['type'] != &quot;image/gif&quot;) { echo &quot;Sorry, we only allow uploading GIF images&quot;; exit; } $uploaddir = 'uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo &quot;File is valid, and was successfully uploaded.n&quot;; } else { echo &quot;File uploading failed.n&quot;; } ?>
  • Verificación de contenido del archivo de imagen
  • ¿Por qué validar imagenes?
    • Confiar en la cabecera Content-type no es del todo efectivo cuando se trata de ficheros con imagen.
    • Muchos formatos de imagen permiten incluir comentarios en sus metadatos (Vease GIF o JPEG).
    • Es posible crear un archivo de imagen valido que contenga código arbitrario en los comentarios.
  • Verificación de extensiones
  • ¿Qué tienen de interesante las extensiones?
    • Pueden alterarse escribiendo la extensión del archivo alternando mayúsculas/minúsculas: .pHp, PHp, .pHP
    • Uso de extensiones menos conocidas: Php5
    • Técnica de la doble extension: .jpeg.php
    • Añadir al final del nombre del archivo espacios y/o puntos (shell.php ... ......)
    • Usar Null Bytes.
    • Incluir caracteres extraños (&quot;;&quot;, &quot;&&quot;, &quot;[&quot;): shell.php;jpeg.
    • En determinadas ocasiones dependen de la configuración del servidor.
    • El uso de listas negras no soluciona el problema.
    • Veamos el siguiente código:
    <?php $blacklist = array(&quot;.gif&quot;, &quot;.jpeg&quot;, &quot;.jpg&quot;); foreach ($blacklist as $item) { if(preg_match(&quot;/$item$/i&quot;, $_FILES['userfile']['name'])) { echo &quot;We do not allow uploading IMAGE filesn&quot;; exit; } } $uploaddir = 'uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo &quot;File is valid, and was successfully uploaded.n&quot;; } else { echo &quot;File uploading failed.n&quot;; } ?>
  • Acceso indirecto a ficheros
  • ¿Qué implica almacenar archivos fuera del directorio raíz?
    • Para poder subir archivos a través de formularios web es necesario que el sistema de ficheros tenga el directorio habilitado como escritura.
    • Es importarte que el servidor web bloquee el resto de accesos al sistema de ficheros para evitar la subida arbitraria de archivos.
    • En caso de una débil configuración se permite la navegación trasversal en el servidor permitiendo al usuario leer cualquier tipo de información contenida en el mismo.
    • En este caso tenemos el siguiente codigo de Upload:
    <?php $uploaddir = '/var/spool/uploads/'; # Outside of web root $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo &quot;File is valid, and was successfully uploaded.n&quot;; } else { echo &quot;File uploading failed.n&quot;; } ?> Y necesitamos de un control visor de imágenes: <?php $uploaddir = '/var/spool/uploads/'; $name = $_GET['name']; readfile($uploaddir.$name); ?>
  • Inclusión local de ficheros
  • Posibilidades limitadas
    • La implementación anterior almacena archivos cargados fuera de la raiz web del servidor.
    • Estos ficheros no son accesibles directamente y no pueden ejecutarse.
    • A pesar de ello, permiten obtener una pequeña ventaja: la inclusión local de ficheros.
    • Un atacante puede ser capaz de cargar archivos, incluso fuera de la raíz del servidor web, si conoce el nombre y la ubicación de los mismos.
    • Las posibilidades de este ataque son limitadas.
    • Imaginemos el siguiente código:
    <?php # ... some code here if(isset($_COOKIE['lang'])) { $lang = $_COOKIE['lang']; } elseif (isset($_GET['lang'])) { $lang = $_GET['lang']; } else { $lang = 'english'; } include(&quot;language/$lang.php&quot;); # ... some more code here ?>
    • Una posible solución al problema:
    • Impedir que un atacante conozca el nombre y ubicación del archivo.
    • ¿Cómo? Realizando una generación aleatoria de nombres de archivo mediante un seguimiento de los mismos en Base de Datos.
    • Estos archivos al subirse no se pueden solicitar ni ejecutar directamente y además desconocemos el nombre que le asigna el sistema al archivo.
    • Mediante esta técnica solucionamos el problema de directorio transversal y de inclusión local de ficheros, ya que los archivos hacen referencia a un índice númerico en Base de Datos.
    • Remarcar que el uso de Base de Datos implica securizar las consultas SQL que se realizan a la misma.
  • Otras consideraciones
  • Denegación de servicio
    • La carga de gran cantidad de archivos de gran tamaño puede consumir todo el espacio disponible en disco.
    • Una buena contramedida es limitar el tamaño y número de archivos que un usuario puede cargar durante un período determinado de tiempo.
    Rendimiento
    • Los visores de archivos pueden ser un cuello de botella en el rendimiento del servidor si son vistos a menudo.
    • Una buena solución es crear un segundo servidor alternativo y copiar los archivos subidos para que sean servidos desde allí directamente.
    • Otra posible solución es utilizar un proxy frontal al servidor que pueda almacenar caché de los archivos.
  • Control de acceso
    • En los supuestos que hemos contemplado se supone que todo el mundo puede ver cualquiera de los archivos subidos.
    • Sin embargo, en determinadas ocasiones se puede requerir que sólo el usuario que ha subido el archivo pueda verlo.
    • Una posible solución a esta casuística es generar una tabla de archivos que contiene la información sobre propiedades del archivo, con el fin de verificar si el usuario que lo solicita es el propietario.
  • ¿Preguntas? ¡Muchas gracias! Mario López Jiménez