Hoy nos toca tratar una de las vulnerabilidades mas habituales en el desarrollo web actualmente, el XSS. Esta falla de seguridad se debe a un incorrecto filtrado de los valores que un usuario puede introducir en una web dando así pie a la ejecución de código de scripting en la web atacada.
A través de este método un atacante puede robar los credenciales de un usuario o administrador, modificar contenido en la web, eliminar restricciones impuestas desde el lado del cliente y muchas otras cosas.
Existen dos tipos de XSS:
- Indirecto o reflejado: Funciona modificando valores que una web pasa entre página. Ocurre cuando se envía un mensaje o ruta en una URL, una cookie o en la cabecera HTTP.
- Directo o persistente: Consiste en almacenar código en la web para que se ejecute una vez que la web se carga, por ejemplo inyectando en un libro de visitas de una web en un blog o en una sección de comentarios.
Este fallo está muy extendido debido a que muchos dessarrolladores no son conscientes de que los filtros -si los hay- se pueden evadir fácilmente con algunas técnicas.
Vamos a ver 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 a otra página para procesarla.
Una vez que el usuario escribe una cadena y envía el formulario se genera la siguiente url:
www.shellshocklabs.com/server.php?cadena=test
Donde "test" es el valor enviado a través del formulario y que será mostrado en la otra página.
Si revisamos el código fuente podemos observar como se inserta "test" en la página:
<body> <h1>Cadena enviada:</h1> <p>test</p> </body>
En este ejemplo no hay ningún filtro implementado para simplificar las cosas a la hora de entender como funcionan este tipo de ataques. Nuestro objetivo es conseguir 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 pasarlo a traves de la URL simplemente debemos sustituir "test" por esta cadena y actualizar la página:
www.shellshocklabs.com/server.php?cadena=<script>alert('XSS')</script>
Una vez actualizada la página 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 echamos un ojo al código podemos ver como nuestra cadena se ha integrado en el código fuente de la página:
<body> <h1>Cadena enviada:</h1> <p><script>alert('XSS')</script></p> </body>
En este punto se ha completado la inyección y hemos comprobado que la web es vulnerable a este tipo de ataques, por lo que solo deberemos aplicar el payload que queramos utilizar para el ataque y llevarlo a cabo.
Por supuesto, este ejemplo contempla un caso básico y es difícil encontrarnos ante este escenario en el mundo real, ya que lo habitual es encontrarnos entradas filtradas bien sea desde el lado del cliente o del lado del servidor.
Tras ver como funciona el ataque básico vamos a seguir implementando filtros simples para que vayáis entendiendo la idea de los bypasses. Para este ejemplo vamos a filtrar el string "script" con la función str_replace() de PHP.
<?php echo "<p>".str_replace('script', null, $unsafe_string)."</p>";?>
En este caso, si pasamos el mismo string que antes:
La palabra "script" será eliminada y el código no será ejecutado, quedando el código fuente de la siguiente manera:
<p><>alert('XSS')</></p>
Este tipo de filtros es muy sencillo de vulnerar, por ejemplo alternando mayúsculas y minúsculas en la palabra filtrada (p.e. "ScRiPt"). Por lo que pasando la cadena modificada ya habremos logrado nuestro objetivo:
www.shellshocklabs.com/server.php?cadena=<ScRiPt>alert('XSS')</ScRiPt>
Como veis la idea principal a la hora de realizar un ataque XSS es engañar al filtro y ejecutar el 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 saltárselo.
Aquí os dejo un cheatsheet con varias formas de evasión de filtros que es recomendable entender:
Aquí lo dejamos por hoy, espero que se haya entendido, aunque cualquier duda será bienvenida en los comentarios.
1 comentarios:
%3C%73%63%72%69%70%74%20%6C%61%6E%67%75%61%67%65%3D%22%6A%61%76%61%73%63%72%69%70%74%22%3E%0A%0A%09%09%09AleRt(XsS);%3C%2F%73%63%72%69%70%74%3E%0A%0A%09%09%09
Publicar un comentario