martes, 26 de enero de 2016

Dom-Xss en localStorage



En este post se explicará cómo funcionan los Dom Xss y cómo podría ser persistente en un escenario donde LocalStorage sea usado.

¿Qué es Dom Xss?

Xss basado en Dom o Xss del tipo 0, es un tipo de Xss en dónde la explotación se lleva a cabo al modificar el DOM del navegador de la víctima haciendo uso del script de lado cliente, es decir, la petición (HTTP/HTTPS) no cambia en el servidor, todo ocurre en el navegador.

Ejemplo (Extraído de OWASP):

<select>

<script>

document.write("<OPTION value=1>"+document.location.href.substring
(document.location.href.indexOf("default=")+8)+"</OPTION>");

document.write("<OPTION value=2>English</OPTION>");

</script>

</select>


el código anterior lo nombramos como page.html y lo guardamos, para invocarlo sería algo como:

http://www.some.site/page.html?default=French

El ataque de Xss basado en DOM sería:

http://www.some.site/page.html?default=<script>alert(document.cookie)</script>


¿Qué es localStorage? 

localStorage (https://www.w3.org/TR/webstorage/) es una API de la W3C que fue implementada para poder guardar información local de los usuarios del sitio web y poder identificarlos. Se parecen y tiene un funcionamiento similar al de las cookies. Sin embargo, localStorage puede guardar hasta 10 Mbs de información de los usuarios a diferencia de las cookies, que soportan unos cuantos kbs. LocalStorage almacena en forma local y no es enviado al servidor cada vez que se hace una petición.


¿Cómo complementarlos?

Si guardáramos data en el localStorage, pero esta fuese ingresada por el usuario o pudiese ser modificada por el usuario caeríamos en un error de seguridad. Pongamos atención al siguiente ejemplo para verlo aplicado en un ejemplo.

Código (https://github.com/DeepSecurityExploit/DomXssLocalStorage/blob/master/dom1.html):

<html>

<script type="text/javascript">

var msg;
    var prueba = location.hash;
    window.localStorage.prueba = prueba;
    msg = window.localStorage.prueba;

document.write(msg);

</script>

</html>


El código al principio reflejará undefined, sin embargo, el usuario puede modificar el contenido del localStorage por el contenido de la línea 4. El usuario podría ejecutar un ataque cambiando la url de la siguiente manera:

 http://sitio.web/dom1.html#”><script>alert(document.cookie);</script>


Se reescribe el DOM del navegador agregando el contenido del hash (#) al códifo fuente de la página para ejecutar un script.

Se puede confirmar que este código malicioso se queda en el DOM del navegador y podría ser usado en otros archivos con el siguiente ejemplo:

Código (https://github.com/DeepSecurityExploit/DomXssLocalStorage/blob/master/dom2.html):

<html>

<script type="text/javascript">

var msg;
    msg = window.localStorage.prueba;

document.write(msg);

</script>

</html>


Debido a lo antes explicado, se puede concluir que un DOM Xss puede llegar a ser persistente si se guarda en el localStorage del navegador. También, podemos concluir que un DOM Xss puede ser ejecutado en navegadores actuales, ya que, localStorage fue implementado hace poco tiempo y está vigente en los navegadores mas modernos.

No hay comentarios.:

Publicar un comentario