[ASP.NET] Cuidado con los archivos que subes a tu servidor web.

Hace tiempo que me ronda este post en la cabeza y nunca me he decidido a escribirlo. Hoy he sacado un poco de tiempo y he montado un ejemplo sobre lo peligroso que puede ser el no tratar con mucho cuidado la subida de archivos al servidor desde una aplicación web, en este caso ASP.NET WebForms, pero esto aplica también a MVC.

Código fuente:

https://github.com/lurumad/upload-files-vulnerability

La aplicación que he montado es supersencilla. Un página Default.aspx con un formulario que sube un archivo a un directorio que se llama Public. Imaginad que esta página es la página del perfil de usuario, donde cada usuario puede seleccionar su foto. Lo correcto sería restringir la extensión de los archivos a subir de tipo imagen (jpeg, jpg, png…), pero imaginad que el programador ha pasado por alto esta tarea no pensando lo que puede ocurrir porque no conoce que lo que está en el root del sitio web se ejecuta :p.

Ahora, un usuario un poco espabilado, le da por copiar la url de la foto de su pefil y se da cuenta que estamos subiendo dicha foto a una carpeta pública que se llama también Public, entonces dicho usuario se decide a probar si en dicho formulario de subida se está controlando el tipo de archivo que se sube. Se crea una página llamada HackPage.aspx junto con su archivo de Code Behind HackPage.aspx.cs y lo sube al servidor (Estos archivos los tenéis en el proyecto para que hagáis pruebas):

image

HackPage.aspx.cs lee el contenido del fichero Web.Config y lo muestra como fichero xml.

public partial class HackPage : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        var serverPath = Server.MapPath("/");

 

        Response.Clear();

        Response.ClearHeaders();

        Response.ClearContent();

        Response.Buffer = true;

        Response.ContentType = "text/xml";

        Response.BinaryWrite(File.ReadAllBytes(Path.Combine(serverPath, "Web.Config")));

        Response.End();

    }

}

Teclea la url:

http://localhost:56023/public/hackpage

y… ¿Que creéis que ocurrirá?

image

Ojo! Esto es una prueba en local, pero estoy seguro que haciendo una búsqueda por Google no tardaría mucho en encontrar webs con este fallo de seguridad y por supuesto, esto no es una vulnerabilidad de ASP.NET, Tú has introducido una vulnerabilidad en tu aplicación web por no validar la subida de archivos a tu servidor.

Recomendaciones

  1. Restringir el tipo de archivos que el usuario puede subir en nuestra aplicación.
  2. Mover la carpeta de subida de ficheros fuera del root de la aplicación web. Siempre pudes usar un storage alternativo como SkyDrive, Dropbox, Azure Storage, Amazon S3…

Un saludo y Happy Coding!

Un comentario en “[ASP.NET] Cuidado con los archivos que subes a tu servidor web.”

  1. Hola,

    Muy buen post Luis, pero….

    Te pongo puntos suspensivos puesto que aún siendo una muy buena iniciativa por aquello de prevenir a los despistados.

    Me gustaría dejar claro que esto es tan viejo como la web y a la postre no hace más que confirmar mi teoría de las

    “CASTAÑAS CON GUSAÑOS”
    http://geeks.ms/blogs/phurtado/archive/2013/12/12/la-casta-241-a-con-gusanos.aspx

    Simplemente con quitar está linea

    //routes.EnableFriendlyUrls(settings);

    del archivo RouteConfig obtienes cuando solicitas el recurso http://localhost:56023/public/hackpage un hermoso 404.

    Pero claro tampoco hay que ser muy espabilado para entonces solicitar esto http://localhost:56023/public/hackpage.aspx y obtener los mismos resultados:)

    Con lo cual yo no me preocupo de las cosas que indicas

    1. Validar la subida de archivos.
    2. Mover la carpeta de subida de ficheros fuera del root de la aplicación web(aunque si lo recomiendo y por tanto lo hago).
    3. Por supuesto ni que decir tiene que sino tengo necesidad de utilizar un storage externo no lo voy a hacer.

    Yo creo que simplemente creando un config en la carpeta public con estas 4 lineas lo tienes solucionao, vamos digo yo.

    < ?xml version="1.0" encoding="UTF-8"?>







    Referencia.

    http://webmasters.stackexchange.com/questions/28733/prevent-iis-from-executing-scripts-in-a-specific-directory

    Ves como al final haces que me reafirme en mi teoría de las “CASTAÑAS CON GUSANOS” y no solo en versión 1 sino en 2 y quizá hasta en Owin, no quiero más guardianes sin saber lo que esconde una linea de código y eso es muy propenso en el mundo asp 🙂

    https://twitter.com/luisruizpavon/status/411159433079570433

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *