I01 – Uso de secuencias de comandos en sitios cruzados (XSS)
Generalmente denominada por su nomenclatura inglesa, Cross-Site Scripting, este tipo de vulnerabilidad en las aplicaciones son muchas veces infravaloradas por los equipos de desarrollo de las empresas, porque tradicionalmente se han asociado a ataques puramente del navegador que afectan al cliente, sin ir más allá de algún enlace como intento de phishing, etc. Pero la realidad es que este tipo de ataques, especialmente combinados con la explotación de otras vulnerabilidades existentes, puede ocasionar un perjuicio importante. Consisten principalmente en la inyección de código malicioso (generalmente JavaScript, aunque también vbscript en casos concretos), en el contenido de aplicaciones o páginas web que otros usuarios pueden ver. Mediante este código, se pueden llegar a robar datos sensibles, como cookies o credenciales, redirigir al usuario a sitios maliciosos, o suplantar la identidad del usuario afectado, para realizar acciones en su nombre sin su consentimiento. Hay varios tipos de XSS, destacando fundamentalmente tres grandes clasificaciones, que se detallarán a continuación. Para ello, y antes de empezar, se empleará una aplicación con determinadas vulnerabilidades activadas (en este caso las relativas a XSS), para aprendizaje. La aplicación consiste en un formulario de login básico, donde se accede, bien con rol de usuario o de administración a un panel, desde donde se gestionan unos artículos con su precio y en caso de ser el administrador, la gestión de usuarios de la aplicación, así como otros aspectos.TiposXSS reflejadoOcurre básicamente cuando la entrada del usuario es procesada y reflejada directamente en la página web, sin ser validada o codificada adecuadamente. Esto permitiría la inyección de código de tal forma que cuando se ejecute esa petición, se refleje el resultado de dicha inyección. De esta manera, se podría enviar la URL (quizás oculta bajo un acortador de direcciones web, que se le enviase al usuario, destinatario del ataque). De esta manera el usuario, al ejecutar dicho enlace, ejecutaría también el código JavaScript contenido en la URL, que podría ser una redirección al sitio web del atacante donde, por ejemplo, se procedería al robo de la cookie de sesión del usuario en la web actual. Otro ejemplo, sería la ejecución de un "hook" malicioso contra el navegador web de la víctima, controlada a partir de ese momento por el atacante (mediante la aplicación Beef, un framework bastante conocido para la explotación web, por ejemplo).Así, volviendo a la aplicación vulnerable mencionada, si se comprueba en el apartado de la lista de artículos, el campo de búsqueda que permite al usuario buscar por determinados artículos:Conectándose a la aplicación como user1, se pueden acceder a los artículos de dicho usuario, en la lista de artículos, a través del menú "Manage Your Items".Si se busca por un artículo (nombre o descripción) que exista, por ejemplo "item 1":Como se puede observar, el resultado se refleja en la respuesta.Ahora se probará a buscar por una secuencia de comandos para ver si el navegador interpreta como código o no la respuesta: - Inyectando código HTML (por ejemplo, la típica cabecera entre tags ...):Indicativo de que, al menos, está interpretando el código HTML sin ningún filtro, dejando inyectar código HTML, que es interpretado por el navegador. - Inyectando código JavaScript. No se logrará con los típicos mensajes alert(1);, pero existen muchísimos payloads, teniendo un buen referente en la página de PortSwigger Academy. O si no, probando con URL encodings diferentes. Uno de los posibles payloads, por ejemplo, sería inyectar un objeto HTML de tipo imagen cuyo error en la carga motive la ejecución de un script (y ahí sí, para probar, el típico alert): AB - Interceptando la petición con BurpSuite, se analiza la respuesta que recibe realmente la búsqueda que cargará vía Ajax el resultado a través del parámetro search en items_search.php:Al reenviar la respuesta al navegador, se puede comprobar la vulnerabilidad:El siguiente paso sería, por ejemplo, levantar un pequeño servicio web en la máquina atacante de tal manera que se modifique ligeramente el payload (por ejemplo, por document.write(""); para conseguir robar la cookie del usuario que realizará el reenvío de esa consulta. Por ejemplo, si se le envía la URL con el payload en el parámetro de búsqueda codificado e introducido en un acortador de direcciones web al administrador del sitio.XSS almacenadoEsta es una de las vulnerabilidades más críticas dentro de los diferentes tipos de XSS, debido a que es el único caso donde la inyección puede ser persistente, ya que el código malicioso queda almacenado permanentemente en el servidor, y afecta a todos los usuarios que visualizan el contenido, no solo a los que hacen clic en el enlace malicioso. Es decir, hay una interacción con el servidor, con lo que se podría combinar con otras vulnerabilidades para llegar incluso a controlar el acceso al mismo.
Generalmente denominada por su nomenclatura inglesa, Cross-Site Scripting, este tipo de vulnerabilidad en las aplicaciones son muchas veces infravaloradas por los equipos de desarrollo de las empresas, porque tradicionalmente se han asociado a ataques puramente del navegador que afectan al cliente, sin ir más allá de algún enlace como intento de phishing, etc. Pero la realidad es que este tipo de ataques, especialmente combinados con la explotación de otras vulnerabilidades existentes, puede ocasionar un perjuicio importante.
Consisten principalmente en la inyección de código malicioso (generalmente JavaScript, aunque también vbscript en casos concretos), en el contenido de aplicaciones o páginas web que otros usuarios pueden ver. Mediante este código, se pueden llegar a robar datos sensibles, como cookies o credenciales, redirigir al usuario a sitios maliciosos, o suplantar la identidad del usuario afectado, para realizar acciones en su nombre sin su consentimiento.
Hay varios tipos de XSS, destacando fundamentalmente tres grandes clasificaciones, que se detallarán a continuación.
Para ello, y antes de empezar, se empleará una aplicación con determinadas vulnerabilidades activadas (en este caso las relativas a XSS), para aprendizaje. La aplicación consiste en un formulario de login básico, donde se accede, bien con rol de usuario o de administración a un panel, desde donde se gestionan unos artículos con su precio y en caso de ser el administrador, la gestión de usuarios de la aplicación, así como otros aspectos.
Tipos
XSS reflejado
Ocurre básicamente cuando la entrada del usuario es procesada y reflejada directamente en la página web, sin ser validada o codificada adecuadamente. Esto permitiría la inyección de código de tal forma que cuando se ejecute esa petición, se refleje el resultado de dicha inyección. De esta manera, se podría enviar la URL (quizás oculta bajo un acortador de direcciones web, que se le enviase al usuario, destinatario del ataque). De esta manera el usuario, al ejecutar dicho enlace, ejecutaría también el código JavaScript contenido en la URL, que podría ser una redirección al sitio web del atacante donde, por ejemplo, se procedería al robo de la cookie de sesión del usuario en la web actual. Otro ejemplo, sería la ejecución de un "hook" malicioso contra el navegador web de la víctima, controlada a partir de ese momento por el atacante (mediante la aplicación Beef, un framework bastante conocido para la explotación web, por ejemplo).
Así, volviendo a la aplicación vulnerable mencionada, si se comprueba en el apartado de la lista de artículos, el campo de búsqueda que permite al usuario buscar por determinados artículos:
- Conectándose a la aplicación como user1, se pueden acceder a los artículos de dicho usuario, en la lista de artículos, a través del menú "Manage Your Items".
- Si se busca por un artículo (nombre o descripción) que exista, por ejemplo "item 1":
- Ahora se probará a buscar por una secuencia de comandos para ver si el navegador interpreta como código o no la respuesta:
-
Inyectando código HTML (por ejemplo, la típica cabecera entre tags ...
):
- El siguiente paso sería, por ejemplo, levantar un pequeño servicio web en la máquina atacante de tal manera que se modifique ligeramente el payload (por ejemplo, por en el campo descripción (que es lo suficientemente largo para poder insertar los caracteres necesarios). Al salvar el artículo:
- Una vez comprobado que es vulnerable, se elimina el artículo (o se edita, y se reemplaza la descripción) y se crea otro que no muestre directamente el resultado por pantalla, sino que envíe, por ejemplo, la cookie del usuario a un servidor web corriendo en la máquina atacante, con el siguiente payload:
- Cuando el usuario administrador, que tiene acceso a todos los artículos, abra esa página:
- Igualmente, este script podría ser reemplazado por un hook.js de Beef para controlar el navegador de los usuarios que se conectasen a esta página, o ejecutar scripts más sofisticados que pudieran poner en peligro otra información del servidor web.