Atacando servidor - Vulnerabilidad PHP Upload unijimpe (Ataque y Prevención)

Vagando por la red, pude observar un upload realizado en PHP totalmente vulnerable a WebShell, la verdad no es sorpresa para mi por que yo implemente este Upload en PHP hace mucho tiempo por cierto en el año 2009 en un sitio web sobre desarrollo web y programación el cual yo administraba, y la cual fue atacado por dr.militan-53! de Zone-H.org.

El mirror que indexo zone-h es este: simpleforo.com hacked by dr.militan-53!.

Como todo newbie, subí el upload y no analice del todo el código del archivo y no pude fijarme pues me realizaron un deface un WebShell supongo.

Empecemos

Pero hoy no estoy para recordar viejos tiempos, hoy expongo aquí una forma de atacar y de prevenir este tipo de hackeo, Bien voy a utilizar un servidor maligno utilizado para robo y almacenamiento de datos de imágenes y cuentas de un juego online que actualmente tiene 48.73 GB de espacio utilizado, en realidad pura shit es lo que hay allí pero no soy quién para juzgar, bueno solo le quedan 3.97 GB un (8.15%) de espacio libre, entonces pronto lo dejaremos limpiecito.

El servidor es este: http://190.93.130.109
El upload se ubica en: http://190.93.130.109/Fotos/upload.php

Ahora voy a introducir una WebShell muy popular que pueden descargar desde aquí llamada: C99Shell v. 1.0, por cierto esta codificada en base64 para que no la detecte ningún antivirus, muy bien, voy a subir la WebShell y nos muestra lo siguiente:


Ahora voy a dirigirme a editar el archivo index.php y defacear el servidor, al realizar esta acción voy a dejar mi huella marcada en el servidor, pueden verla accediendo desde aca http://190.93.130.109, muy bien ahora que tengo control total voy a eliminar todos los archivos malignos y no malignos que este servidor contenga, como dije antes voy a limpiar todo, solamente dejaré el index defaceado y la carpeta dónde se ubica el upload para que puedan verlo, editare el upload para que no se afanen ustedes jaja.

Ahora selecciono los archivos a eliminar, como pueden ver contenia archivos ejecutables probablemente malignos de algún servidor de un juego online:


Elimine todos los archivos seleccionados y solamente nos quedo nuestro index.php y la carpeta Fotos que contenía el Upload PHP vulnerable, ya hemos concluido con el hackeo de este servidor.

Un vídeo



Prevención

El upload php unijimpe Vulnerable

Este upload acepta archivos PHP y permite ejecutarlos facilmente, aca pueden ver un Exploit PHP upload - (unijimpe) Remote File Upload Vulnerability, claramente se puede ver que también acepta WebShell transformadas en imágenes ejemplo: shell.php.pjpeg.

Por suerte existe una solución y una forma de añadir seguridad desde este artículo que preparo Unijimpe en su blog: Seguridad en Upload de Archivos.

Pasos preventivos

Los pasos que se pueden seguir son:
  • El archivo subido nunca debe ser accesible inmediatamente por el cliente.
  • Generar nombres aleatorios a los archivos subidos.
  • Filtrar los archivos para no permitir archivos PHP.
  • Subir los archivos a carpetas fuera del directorio de publicación.
  • Utilizar is_uploaded_file para verificar que el archivo se ha subido.
  • Utilizar move_uploaded_file para copiar el archivo al directorio final.

En el caso de imágenes

  • Verificar el Content-Type del archivo para asegurarse que el archivo es una imagen.
  • Verificar si el archivo es imagen con la función getimagesize.
  • Limitar el archivo a un máximo de tamaño.

Implementado Clase PHP para Upload

Siguiendo las reglas que hemos mencionado hemos creado una pequeña clase que facilita el subir archivos, Entonces se crea un archivo llamado upload.php donde se incluya el siguiente código: Esta clase contiene:
  • setFile: nombre del campo del formulario que deseamos subir.
  • setPath: carpeta donde se guardará el archivo.
  • setMaxSize: permite definir el tamaño máximo del archivo (opcional).
  • isImage: permite definir si se hará verificación de imágenes.
  • save: guarda el archivo en la carpeta de destino.
Dos propiedades útiles:
  • isupload: devuelve verdadero o falso indicando si el archivo se ha subido.
  • message: devuelve un mensaje indicando que ocurrió en el proceso.

¿Como utilizar?

Creamos un formulario con un campo llamado "archivo" y adicionalmente un campo oculto que lo utilizaremos para verificar que el formulario se ha enviado. El siguiente paso es incluir el archivo al inicio de nuestro script, luego creamos una instancia de la clase, definimos la carpeta donde se guardarán los archivos, el nombre del campo y procedemos al upload del archivo. Esta clase implementa algunos puntos para asegurar nuestros scripts, pero efectivamente no es completamente seguro ya que hay varias técnicas de como penetrar como se explica en Secure file upload in PHP web applications.

Puede descargar el upload desde aquí.

Recomendaciones Adicionales

Lo que unijimpe recomienda es lo siguiente:
  • Cambiar el titulo de la página "PHP upload - unijimpe", los atacantes hacen una busqueda de esta palabra y pueden ubicar las páginas que utilizan este script el cual puede ser atacado. Entonces si vas a utilizar el script de upload por lo menos hay que cambiar el título al ejemplo descargado.
  • Otra sugerencia es no mostrar el archivo recién subido, el administrador debe revisarlo antes que sea publicado.
  • Agregar la validación por content-type, por la extensión del archivo como hemos mencionado en este post.
  • Filtrar los archivos y solo permitir los archivos necesarios.

Más información
Puedes obtener más información complementaria desde estos enlaces:

Comenta con Facebook

8 comentarios

  1. Hola, interesante entrada pero tengo una pregunta ya que no me quedo claro el exploit:
    "shell.php.pbmp" o "shell.php.pjpeg" se supone q la shell solo se ejecuta en formato .php entonces como llega ejecutarse con la extension .pbmp o .pjpeg ¿¿??

    ResponderEliminar
    Respuestas
    1. Amigo Mark, básicamente es una imagen con un codigo php adjunto.

      Es algo similar a esto:

      GIF89a [CARACTERES DEL GIF]
      <?php
      //Acá la shell..
      ?>

      En algunos servidores estas shells simplemente muestran una imagen, pero en otras de alguna manera se ejecuta el codigo php que ocultan.

      Me explico de mejor manera, Estas shell se ejcutan al momento en que el servidor quiere corroborar la extensión analizando dentro del .jpg tratando de confirmarlo busca ÿØÿà JFIF y en gif GIF89a
      por lo que al hacer eso se ejecuta la shell.

      El servidor puede protegerse implementando imagecopyresized() de PHP.

      Bien, existen diversos métodos de realizar esto, puedes hacerlo simplemente colocandole el formato, yo personalmente lo hago con Flashfxp el programa FTP, es muy bueno para cambiar formatos sin cambiar el archivo.

      muy bien, aca te dejo un Tutorial dónde explican una forma de como realizar esta operación.

      y aca unos vídeos:

      upload shell.php.jpg (tamper data).flv
      Upload Shell C99 [GIF]

      Espero que ahora entiendas, saludos.

      Eliminar
  2. Hola y gracis por tu pronta respuesta, viendo el video me doy cuenta que era el truco de renombramiento del archivo por tamper data o live http header jeje yo pense que se trataba de algun metodo que el servidor solo ejecutaba de alguna manera .pbmp y pjpeg xD

    la clase esta bien pero creo que aunque sea un poco no se deberia confiar de los tipos mime porque estos addons los manipulan, personalmente hago esta comprobacion en mis uploads para obtener el formato real de un archvo

    $formato = explode('.', 'shell.jpg.php');
    $formato = $format[count($format)-1];
    /*
    $formato obtendra 'php' y podemos recorrerlo en un bucle condicionandolo si es igual a los valores de un vector que contenga la lista de archivos permitidos :D
    */

    de esa forma aunque manipulen los tipos mime o renombren el archivo no podran bypasear esas 2 lineas de codigo :)

    saludos

    ResponderEliminar
  3. Mark me alegra que hayas entendido, existen diversos métodos para protegernos de esta amenaza, pero como dije efectivamente no es completamente seguro ya que hay varias técnicas de como penetrar como se explica en Secure file upload in PHP web applications.

    Las opciones son pocas, pero de todas maneras estaré publicando artículos para implementar seguridad en Upload PHP.

    Saludos.

    ResponderEliminar
  4. hola, tratando de mejorar la seguridad de mi servidor de un juego online, llegue a esto. Me gustaria saber que tipos de ataques puedo recibir, como compruebo la seguridad de mi server, hay porgramas que hacen todo esto? perdon mi ignoracia...pero la ignorancia es la base del aprendizaje...

    ResponderEliminar
    Respuestas
    1. Evita subir archivos PHP que serán vulnerables, en especial un Upload, también asegúrate de que tus bases de datos MySQL estén bien construidas y no hayan fallos de seguridad.

      También recomiendo instalar en tu servidor apache la herramienta XAMPP para añadir seguridad a tu localhost ya que yo me tope con este servidor por medio de su dirección IP.

      Si lo tienes alojado en un servidor dedicado entonces habla con tu proveedor de hosting.

      Saludos.

      Eliminar

                   

¿Quieres mantenerte informado sobre este artículo? Descarga nuestro Software en tu PC▼