En artículos anteriores hemos visto las vulnerabilidades de Command Injection, como hacer un reconocimiento a una página Web y también las técnicas LFI (Local File Inclusion) y RFI (Remote File Inclusion). Hoy es el turno de uno de los tipos de vulnerabilidades más comunes, las conocidas como XSS (Cross-Site Scripting).
Artículo elaborado por José Arroyo Viana, administrador de sistemas y experto en ciberseguridad de Extra Software
CONTENIDOS
EJEMPLO DE XSS O CROSS SITE SCRIPTING REFLEJADO
EJEMPLO DE XSS O CROSS-SITE SCRIPTING PERSISTENTE
¿Qué es?
Es una vulnerabilidad que permite a un atacante inyectar código JavaScript en una página de un sitio Web. Como JavaScript es un lenguaje que se ejecuta en el navegador del cliente, cuando ejecutamos este código lo estamos haciendo en el cliente del usuario. El sitio Web solo hace de herramienta para ejecutar código hacia los usuarios que navegan por él.
Hay varios tipos de vulnerabilidades XSS diferenciadas, los más conocidos son los siguientes:
- XSS Persistente o almacenado: se almacena en la base de datos. Por lo tanto, el código que insertemos se almacenará en la base de datos o en la página, de modo que cada vez que una persona vea esa página se ejecutará el código.
- XSS Reflejado: el código solo se ejecutará cuando el usuario objetivo ejecute una URL específica creada o escrita por el atacante. El atacante manipulará una URL que le enviará a su objetivo y cuando el objetivo ejecute o abra esa URL se le ejecutará el código.
Ejemplo de XSS o Cross Site Scripting Reflejado
Tenemos la siguiente página Web donde tenemos un cuadro de texto en el que escribimos nuestro nombre y al ejecutarlo nos aparece escrito en la página la palabra “hello” y el texto que hemos introducido en el formulario.
http://10.0.2.4/dvwa/vulnerabilities/xss_r/
Si escribimos nuestro nombre y pulsamos en Submit podemos ver el resultado:
Si vemos la URL resultante podemos comprobar que es un GET, por lo tanto, también podría ser inyectable, al igual que podría serlo el cuadro de texto:
Para comprobar si la Web puede ser vulnerable a XSS vamos a intentar ejecutar código a través del formulario. Lo vamos a hacer usando la etiqueta <script>, que indica que el contenido dentro de esta etiqueta es código JavaScript. En este caso probamos a incluir la función alert que nos muestra en un mensaje por pantalla el texto que le pasemos como parámetro. El texto que le pasamos es XSS.
El código que vamos a introducir quedará de esta forma:
<script>alert(‘XSS’)</script>
Cuando pulsamos en Submit vemos que nuestro código se ejecuta. Sabemos que la página Web es vulnerable a XSS porque está interpretando el código que le estamos pasando:
Si echamos un vistazo a la URL vemos que podemos hacer lo mismo en ella a través del parámetro “name”:
Si ahora enviamos esa URL a un tercero, se ejecutará en su navegador el código JavaScript que hayamos puesto.
Con el código del ejemplo no correríamos ningún riesgo, pero existen códigos más peligrosos. Utilizados conjuntamente con herramientas específicas, nos pueden llegar a realizar un secuestro del navegador y como resultado ser víctimas de ataques más peligrosos.
Ejemplo de XSS o Cross-Site Scripting Persistente
En el XSS almacenado o persistente el código se almacenará en la base de datos o en la página Web. Por tanto, cada vez que una persona acceda a esa página se le ejecutará el código en su navegador. Como no necesitamos interactuar con los usuarios o enviarles nada, es más peligroso que el XSS Reflejado.
Vamos a ver un ejemplo:
Esta página que se muestra aquí nos permite escribir un mensaje o una reseña que acabará reflejada en la misma página, puede ser una reseña de un producto o un mensaje en un foro:
Rellenamos el formulario con un simple comentario y vemos que nos lo muestra:
Ahora cada persona que visite esta página verá el comentario. Entonces si conseguimos insertar código JavaScript se ejecutará a cada persona que se conecte. Volvemos a rellenar el formulario pero esta vez en el cuerpo del mensaje pondremos un código JavaScript con una función alert()
Lo agregamos y vemos que cada vez que se visita la página se ejecuta el código:
Solución para la vulnerabilidad XSS
La forma en que ocurren estas vulnerabilidades es porque cada vez que un usuario ingresa algo en un cuadro de texto (textbox) o en un parámetro, esa entrada se muestra en el HTML. Dado que trata como si fuera una parte de la página, si contiene JavaScript, el código será ejecutado.
Para evitar esta vulnerabilidad, lo mejor que podemos hacer es intentar minimizar el uso de entradas no confiables. Tenemos que asegurarnos que el código que nos intenten inyectar se convierta a un equivalente de string en HTML y no se ejecute.
Un ejemplo de equivalencias a string o cadena de caracteres de algunos de los caracteres usados para inyectar código es el siguiente:
Como usuario, para evitar ser víctima en un ataque de tipo XSS, hay que tener cuidado de no caer en un engaño de este tipo. Si una página nos notifica que necesitamos una actualización, hay que verificar si es cierto en la página oficial del producto.
Siempre hay que tener cuidado con las notificaciones emergentes que nos dicen que tenemos que realizar acciones. Lo prudente es no confiar en ellas.
Conclusión
En el artículo hemos visto la vulnerabilidad XSS o Cross-site Scripting, que es una de las más comunes. Como hemos explicado, esta vulnerabilidad no afecta tanto a la Web o el servidor donde está alojada, sino que sirve de vínculo para llegar a los usuarios que la visitan, que son las verdaderas víctimas.
Si nos llegan a realizar un secuestro del navegador mediante esta técnica, el atacante puede usar estrategias de ingeniería social. De este modo, nos hará creer que es necesario instalar una extensión o plugin de navegador, o bien actualizar uno que haya caducado. El objetivo es instalarnos algún programa espía o software que le permita controlar nuestro equipo.
Finalmente, hemos dejado unas pautas de seguridad mínimas que se deben seguir para evitar ser víctima de este tipo de vulnerabilidades.