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.
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 |
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: shellshocklabs, calebbucker, elhacker.net
No hay comentarios:
Publicar un comentario