miércoles, 1 de junio de 2016

Introducción a XSS (Cross Site Scripting)

Cross-Site-Scripting o XSS , es una vulnerabilidad que se produce debido a un incorrecto filtrado de los valores que un usuario puede introducir en una web, permitiendo que cualquiera pueda inyectar código HTML y Javascript en la misma. El código al no ser filtrado, se ejecuta en la página como si formase parte de ella. Se puede ejecutar mediante consultas en cuadros de texto, o en la URL. 

Imagen 1: Introducción a XSS (Cross Site Scripting)

Con un ataque XSS, se puede llegar a robar las cookies de un administrador web, manipular a alguien para que descargue software malicioso, modificar contenido, eliminar restricciones impuestas desde el lado del cliente, etc... Prácticamente cualquier lugar que contenga un cuadro de texto, puede ser explotado con XSS. Para ver en primera persona como funciona primero tenemos que encontrar un sitio vulnerable a XSS. Tardaremos algo más de tiempo que con una vulnerabilidad SQLi para comprobar si realmente es vulnerable. Con SQLi, bastaría con añadir: ". En cambio para XSS, tenemos que presentar (a veces) varias consultas, para verificarlo.

Primero hay que tener claro que nos podemos encontrar con dos tipos de XSS:

  • Indirecto o reflejado: modifica valores que una web pasa entre página. Sucede cuando se envía un mensaje o ruta en una URL, cookie o en la cabecera HTTP.
  • Directo o persistente: almacena código en la web para que se ejecute.

En el siguiente ejemplo vemos como funciona un XSS básico con una página que pasa valores a otra a través del método GET. Tenemos la siguiente web con un campo de texto que envía una cadena de texto a otra página para procesarla. Una vez que el usuario inserte una cadena y mande el formulario se generará la siguiente url: www.rememberhackingsite.blogspot.com/server.php?cadena=test

Imagen 2: web con un campo de texto que envía una cadena 

"PRUEBA" es el valor enviado a través del formulario y que nos mostrará en la siguiente página.

Imagen 3: página mostrada tras insertar la cadena

Al revisar el código fuente podemos ver como se inserta "PRUEBA" en la web:

Imagen 4: vemos como se inserta "PRUEBA" en la web

Ahora intentaremos inyectar código dentro de la web y que este sea ejecutado, por lo que en este caso vamos a pasarle la siguiente cadena a través del formulario o de la url:

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

Para ejecutarlo a traves de la URL solo tenemos que cambiar "PRUEBA", por la cadena anterior: www.rememberhackingsite.blogspot.com/server.php?cadena=<script>alert('XSS')</script>

Una vez actualicemos la web nos debe mostrar una alerta con el texto XSS, ya que el código, al no ser filtrado, se ejecuta en la página como si formase parte de ella. Si miramos el código, podemos observar como la cadena que hemos introducido se ha integrado en el código fuente de la página:

Imagen 5: integración del código fuente en la página

Imagen 6: alerta con el texto XSS
Ya hemos completado la inyección y comprobado que la web es vulnerable, ahora solo tendríamos que aplicar el payload que corresponda para el ataque. Aunque hay que tener en cuenta que en la vida real lo más habitual sería encontrarnos las entradas filtradas, ya bien sea desde el lado del cliente o desde el servidor. Tras ver como funciona, vamos a implementar algunos filtros simples para que entendáis la idea de los bypasses. Para el siguiente ejemplo filtraremos el string "script" con la función str_replace() de PHP.

Imagen 7: filtrado del string "script" con la función str_replace()

Pasamos el mismo string que antes:
www.rememberhackingsite.blogspot.com/server.php?cadena=<script>alert('XSS')</script>

Y en este caso la palabra "script" será eliminada y el código no será ejecutado, quedando el código fuente de esta manera:

Imagen 8: en este caso el código no será ejecutado

Este tipo de filtros es muy fácil saltárselo, por ejemplo alternando entre mayúsculas y minúsculas en la palabra filtrada (ejemplo: "ScRiPt"). Por lo que solo tenemos que pasar la cadena modificada y habremos logrado nuestro objetivo. Cómo habréis imaginado la idea principal a la hora de realizar un ataque XSS es tratar de engañar al filtro para conseguir ejecutar código, para esto una buena parte del trabajo se realiza a la hora de analizar que tipo de filtrado aplica el objetivo y encontrar la manera de evadirlo. Para terminar os dejo algunos dorks para XSS y  un enlace con información sobre evasión de filtros.

Filter Evasion Cheat Sheet

Dorks:
inurl:search.php?
inurl:find.php?
inurl:search.html
inurl:find.html
inurl:search.aspx
inurl:find.aspx


Fuentes: shellshocklabscalebbuckerelhacker.net

No hay comentarios:

Publicar un comentario