martes, 20 de septiembre de 2011

HTML5 [VI]: Drag'n'Drop attacks



¡Saludos!

El otro día publiqué las slides de Rosario Valotta sobre el "CookieJacking". En la presentación utilizaba la técnica de Drag'n'Drop para que la víctima enviase la cookie al atacante, asi que hoy voy a hacer un post explicando cómo funciona este vector.


¿Qué es Drag'n'Drop? Cuando nos referimos a este vocablo hacemos referencia a aquellos mecanismos de arrastrar un objeto y dejarlo en otro punto (p.e. cuando arrastramos un icono del escritorio y lo colocamos en otro punto). Actualmente con HTML5 se ha incluido esta función, siendo fácil su implementación:


<div draggable="true" ondragstart="event.dataTransfer.setData('text/plain','Test Drag and Drop');">
<h1>Test Drag and Drop</h1>
</div>
<br><input type="text" />


Si lo testeais, podreis comprobar que el texto "Test Drag and Drop" se puede coger con el ratón y ser arrastrado hasta el input, que al ser soltado el ratón, quedará rellenado con ese texto. Pero no siempre lo que creemos arrastrar es lo que realmente arrastramos };D


<div draggable="true" ondragstart="event.dataTransfer.setData('text/plain','¡Odio Twitter');">
<h1>¡Me gusta Twitter!</h1>
</div>
<br><input type="text" />


Como podeis ver pese a que creemos que estamos arrastrando el texto "¡Me gusta Twitter!", en realidad lo que arrastramos es "¡Odio Twitter!". De esta forma un usuario común pasaría por alto el engaño, sin percatarse de lo que ocurre. Esto es útil en el momento de ocultar el ataque, puesto que puede usarse otros pretextos más atractivos (como juegos atractivos, o puzzles con ¡TETAS!, nunca fallan) para que el usuario haga Drag'n'Drop (no debemos perder de vista de que es necesaria la interacción directa por parte del usuario).


Pero lo interesante de este vector no es esto, lo interesante es la posibilidad de bypassear SOP (Same Policy Origin). En síntesis SOP implica que los scripts ejecutados desde el lado del navegador (como JavaScript, por ejemplo) se apliquen únicamente al dominio de origen y no a otros, por lo que es bastante importante desde el punto de vista de la seguridad. La solución para evitar las restricciones SOP es utilizar un iframe, y hacer que el usuario haga "drop" sobre éste:


<div draggable="true" ondragstart="event.dataTransfer.setData('text/plain','0verl0ad.blogspot.com');">
<h1>Proof of Concept</h1>
</div>
<iframe src="http://google.com">
</iframe>


El texto "0verl0ad.blogspot.com" es mandado al iframe que apunta a Google, y se ejecuta la búsqueda.

En definitiva este puede ser un vector interesante para explotar determinadas vulnerabilidades, como ya lo demostró Rosario Valotta y 0-day de IE. El problema que tiene esta técnica es la necesidad de interacción por parte del usuario (como cualquier otro ataque de clickjacking) y ello conlleva a tratar de camuflar los exploits en forma de aplicaciones atractivas, como juegos o puzzles, para que el usuario haga Drag'n'Drop
5 0verl0ad Labs: HTML5 [VI]: Drag'n'Drop attacks ¡Saludos! El otro día publiqué las slides de Rosario Valotta sobre el "CookieJacking". En la presentación utilizaba la técni...
< >