[ASP.NET] Ataques por URL

Posted on Actualizado enn


En el pasado post vimos una pequeña introducción a la esencia de un ataque XSS (mira el post acá), así que siguiendo con algunos temas de seguridad quiero mostrarles un gran error que se comente cuando trabajamos aplicaciones Web, lo cual claramente se puede convertir en un problema grande de seguridad. Creo que todos conocemos que por medio de la URL de una página podemos enviar valores a otra página, y esto claramente es muy sencillo, por ejemplo, si quisiéramos ver el detalle de un producto con un determinado código podemos tener una URL parecida a la siguiente:

   1:  http://misitio.com/producto.aspx?idProducto=50

Con lo cual le estaríamos diciendo al sistema que el producto del cual deseamos ver el detalle es aquel cuyo id es el 50, lo cual no esta mal, sin embargo acá ya podemos mencionar algunos posible problemas:

  • La manipulación de la URL queda 100% del lado del usuario
  • El usuario visualiza datos sensibles de la aplicación

Ahora, si comentamos más en detalle los dos puntos anteriores, podemos decir que en el segundo caso debemos ser demasiado cuidadosos con los datos que enviamos por URL, NUNCA debemos enviar datos sensibles como claves, números de tarjetas o demás información privada, y en el primer punto el rollo radica en que el usuario puede colocar lo que desee en la URL.. bueno y esto que problema tiene??

Como ejemplo, digamos que en la página tenemos un método llamado CargarInformacionProducto, el cual realiza una consulta a nuestra base de datos en busca de los datos del producto teniendo como filtro el id del producto, si ese es que vemos en la URL, entonces suponga que (y debería ser) el id del producto es de tipo int, con lo cual convertimos el valor de la variable idProducto a int, una forma podría ser:

   1:  int idProducto = Convert.ToInt32(Request.QueryString["idProducto"]);

Sencillo no? claro que si, pero bueno, ahora suponga que nuestro querido usuario que no tiene nada que hacer va a la URL y la deja algo así:

   1:  http://misitio.com/producto.aspx?idProducto=FelizNavidad

Que!!! Si así como lo ves, ahora vamos a buscar el id del producto cuyo valor es FelizNavidad, entonces al ejecutar la misma instrucción de convertir a int (creo que ya sabrán que va a botar error) vamos a tener el siguiente error:

Imagen1

El cual se da simplemente porque no es posible convertir FelizNavidad a un dato numérico… y bueno si nuestro querido usuario sigue cambiando la URL y ahora elimina todos los parámetros que tiene?? es decir deja solo la parte de producto.aspx entonces volvemos a tener problemas, ya que cuando intentamos acceder a una variable no es posible, claro ya que no esta en la URL, y puede que no se genere error pero nuestra aplicación tampoco va a funcionar de la mejor manera.

Bueno ustedes podrán decir que hasta el momento los ataques no han tenido un problema serio, y es verdad, pero que pasaría si tenemos una URL como:

   1:  http://misitio.com/eliminarproducto.aspx?idProducto=50

En ese caso estaríamos eliminado el producto con id igual a 50, y en ese caso modificando el valor de idProducto nos podrían estar borrando TODOS nuestros productos, lo cual les aseguro si seria un problema…o no?? Y eso no es todo, también nos podrían incluir código JavaScript en la URL!!

En resumen, debemos tener mucho cuidado al manejar variables por QueryString (si no sabes que es QueryString mira este post), y algunas puntos que podemos tener presente son:

  • No mostrar información sensible.
  • Validar que la variable existe.
  • Validar el tipo de dato de la variable.
  • No realizar operaciones directamente, aplica para el ejemplo de la página eliminarProducto.
  • Encriptar los valores que pasamos (me gusta hacerlo siempre).

Y hasta acá llegamos, ha sido un post corto, de un tema que ya todos conocemos, pero que algunas veces pasamos de largo.

Hasta la próxima!

About these ads

11 comentarios en “[ASP.NET] Ataques por URL

    nathan escribió:
    05/22/2012 en 23:23

    Reblogged this on Nathan.

    Andres escribió:
    05/22/2012 en 23:24

    como encriptar la url?

      Julio Avellaneda respondido:
      05/22/2012 en 23:26

      lo q puedes hacer es encriptar el valor del parametro,no toda la URL, en ese caso lo que deberias es manejar URL amigables, esot tambien es bueno desde el punto de vista de SEO

        Andres escribió:
        05/22/2012 en 23:32

        Gracias Julio hay alguna función o forma de encriptar el parámetro toca encriptarlo y hacer el proceso inverso para validar el parámetro verdad

        Julio Avellaneda respondido:
        05/22/2012 en 23:34

        Debes hacerlo manualmente, es decir encriptar y luego desencriptar, claro la idea es q o dejes lo más general posible para luego poder reutilizarlo en otras páginas

        Andres escribió:
        05/22/2012 en 23:35

        Gracias Julio

        Julio Avellaneda respondido:
        05/22/2012 en 23:38

        Un gusto bro!

    Juan Pelaez escribió:
    05/23/2012 en 20:02

    Julio, los ataques por ese medio son muy peligrosos pero creo que expone las razones equivocadas y el ejemplo usado no podria ser peor. De acuerdo al protocolo HTTP en especial lo que tiene que ver con REST debe usarse para su ejemplo el VERB DELETE, si usted tiene una opcion de borrado por GET en su pagina pues no solo se merece un ataque sino que el propio indexador de los buscadores le borrara su base de datos al seguir el enlace. Usar patrones como MVC y ser muy cuidadoso a la hora de seleccionar el VERB de cada metodo ayudara a un poco.

    No quiero ser un troll y se lo dificil que es escribir un articulo, pero en este caso creo que el enfoque ha sido incorrecto y que invita a la equivocacion, algo muy grave en temas de seguridad.

      Jorge Ramirez escribió:
      05/23/2012 en 21:05

      Hola Julio y Juan. Juan, Tienes razon en tus argumentos para justificar el porque seria bueno pensar en los verbos correctos a traves de HTTP, mas en lo que no creo que estes bien, es en el alcance del post, claramente el post trata sobre seguridad en parametros a traves de QueryString no de REST/ful :( Aunque realizar operaciones basadas en un paremetro de QueryString no es lo mejor, creo que aun sucede mucho y pensando en ese alcance creo que el post esta a lugar. Yo personalmente procuro no usar QueryString o Cookies para “pasar” datos sensibles, los errores que comenta Julio son comunes y me habran sucedido par de veces. Gracias a los dos por los aportes :D Happy Coding

        Julio Avellaneda respondido:
        05/23/2012 en 22:43

        Gracias Juan, como siempre esos comentarios me motivan jeje, rte cuento claro q tienes razon, un borrado de ese tipo debe ser una pena mortal, sin embargo y concuerdo con Jorge, la idea del post es mostrar el peligro y las vulnerabilidades existentes, ya uno con experiencia sabe que realizar un borrado sinpedir ocnfirmacion directa del usuario es un error, sin embargo (y te lodigo porque lo he visto) aun se vean aplicaciones de ese tipo, a mi me encanta MVC, adcionalmente y complementando lo comentado por Jorge, las cookies umm si no son muy seguras, pero bn es cierto q tenemos gracias a HTML5 un nuevo storage.

        De nuevo, la idea del post es mostrar lo peligroso q puede ser, por eso al final deje algunas recomendaciones, claro pueden ser muchas más!

        gracias a ambos!

    Resumen Post 2012 « Todo en ASP.NET escribió:
    12/19/2012 en 22:04

    [...] [ASP.NET] Ataques por URL [...]

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s