Un ataque de scripting entre sitios engaña a un navegador web para que ejecute un código malicioso.
Después de leer este artículo podrás:
Contenido relacionado
¿Seguridad de aplicaciones web?
Falsificación de solicitud entre sitios
Ataque por fuerza bruta
Ataque de desbordamiento de búfer
¿Qué es la inyección de código SQL?
Suscríbase a theNET, el resumen mensual de Cloudflare sobre las ideas más populares de Internet.
Copiar enlace del artículo
El scripting entre sitios (XSS) es un ataque en el que el atacante adjunta código en un sitio web legítimo que se ejecutará cuando la víctima cargue el sitio web. Ese código malicioso puede insertarse de varias maneras. Lo más popular es añadirlo al final de una url o colocarlo directamente en una página que muestre contenido generado por el usuario. En términos más técnicos, el scripting entre sitios es un ataque de inyección de código del lado del cliente.
El código del lado del cliente es el código JavaScript que se ejecuta en la máquina del usuario. En términos de sitios web, el código del lado del cliente suele ser el código que ejecuta el navegador web después de que este cargue una página web. Esto se diferencia del código del lado del servidor, que se ejecuta en el servidor web del anfitrión. El código del lado del cliente es muy útil con las páginas web interactivas; el contenido interactivo se ejecuta más rápido y de forma más fiable, ya que el ordenador del usuario no tiene que comunicarse con el servidor web cada vez que se produce una interacción. Los juegos basados en navegador son una plataforma popular para el código del lado del cliente, ya que el código del lado del cliente puede garantizar que el juego se ejecute sin problemas independientemente de los problemas de conectividad.
El código que se ejecuta del lado del cliente es muy popular en el desarrollo web moderno y se utiliza en la mayoría de los sitios web modernos. Ya que el código entre sitios es un elemento básico de la web moderna, el scripting entre sitios se ha convertido en una de las vulnerabilidades de ciberseguridad más frecuentes, y los ataques de scripting entre sitios han afectado a sitios importantes como YouTube, Facebook y Twitter.
Un ejemplo útil de ataques de scripting entre sitios es el que suele verse en los sitios web que tienen foros de comentarios sin validar. En este caso, un atacante publica un comentario que consiste en un código ejecutable envuelto en etiquetas '<script>< /script>'. Estas etiquetas indican al navegador web que interprete todo lo que hay entre ellas como código JavaScript. Una vez que ese comentario esté en la página, cuando cualquier otro usuario cargue ese sitio web, el código malicioso entre las etiquetas script será ejecutado por su navegador web, y se convertirá en víctima del ataque.
Los ataques de scripting entre sitios de JavaScript son populares porque JavaScript tiene acceso a algunos datos confidenciales que pueden utilizarse para el robo de identidad y otros fines maliciosos. Por ejemplo, JavaScript tiene acceso a las cookies*, y un atacante podría utilizar un ataque XSS para robar las cookies de un usuario y hacerse pasar por él en línea. JavaScript también puede crear solicitudes HTTP, que pueden utilizarse para enviar datos (las cookies robadas, por ejemplo) al atacante. Además, el JavaScript del lado del cliente también puede ayudar a un atacante a obtener acceso a las API que contienen coordenadas de geolocalización, datos de la cámara web y otra información confidencial.
Un flujo de ataque de scripting entre sitios típico sería el siguiente:
*Las cookies son credenciales de acceso temporales que se guardan en el ordenador del usuario. Por ejemplo, cuando un usuario se conecta a un sitio como Facebook, el sitio genera una cookie para que si cierra la ventana del navegador y se conecta a Facebook ese día más tarde, se autentique automáticamente con la cookie y no tenga que volver a iniciar sesión.
Los dos tipos más populares de ataques de scripting entre sitios son el scripting entre sitios reflejado y el scripting entre sitios persistente.
Este es el ataque de scripting entre sitios más común. Con un ataque reflejado, se añade un código malicioso al final de la url de un sitio web; con frecuencia, se trata de un sitio web legítimo y de confianza. Cuando la víctima carga este enlace en su navegador web, el navegador ejecutará el código inyectado en la url. El atacante suele utilizar alguna forma de ingeniería social para engañar a la víctima y que haga clic en el enlace.
Por ejemplo, un usuario puede recibir un correo electrónico con aspecto legítimo que afirma proceder de su banco. El correo electrónico le pedirá que realicen alguna acción en el sitio web del banco y le proporcionará un enlace. El enlace puede tener un aspecto similar al siguiente:
http://legitamite-bank.com/index.php?user=<script>¡Aquí hay un código malicioso!</script>
Aunque la primera parte de la url parece segura y contiene el dominio de un sitio web de confianza, el código inyectado al final de la url puede ser malicioso.
Esto ocurre en sitios que permiten que los usuarios publiquen contenido que verán otros usuarios, como un foro de comentarios o un sitio de redes sociales, por ejemplo. Si el sitio no valida correctamente las entradas del contenido generado por el usuario, un atacante puede insertar código que los navegadores de otros usuarios ejecutarán cuando se cargue la página. Por ejemplo, un atacante podría ir a un sitio de citas online y poner algo así en su perfil:
" ¡Hola! Me llamo Dave, me gustan dar largos paseos por la playa y <script>código malicioso aquí</script>"
Cualquier usuario que intente acceder al perfil de Dave se convertirá en una víctima del ataque de scripting entre sitios persistente de Dave.
No existe una estrategia única para mitigar el Cross-site scripting, y distintos tipos de aplicaciones web requieren distintos niveles de protección. Pueden tomarse varias medidas protectoras. A continuación señalaremos algunas.
Si es posible, evita el HTML en las entradas - Una forma muy eficaz de evitar los ataques de scripting entre sitios persistentes es impedir que los usuarios introduzcan HTML en las entradas de los formularios. Hay otras opciones que permiten que los usuarios puedan crear un contenido rico sin usar HTML, como el markdown y los editores WYSIWYG.
Validación de las entradas - Validar significa implementar reglas que impidan al usuario introducir datos en un formulario que no cumplan con ciertos criterios. Por ejemplo, una entrada que pida el "Apellido" del usuario debe tener reglas de validación que solo permitan al usuario enviar datos formados por caracteres alfanuméricos. Las reglas de validación también pueden establecerse para rechazar cualquier etiqueta o carácter que se utilice habitualmente en el scripting entre sitios, como las etiquetas "<script>".
Sanear los datos - Sanear los datos es similar a la validación, pero ocurre después de que los datos se hayan publicado en el servidor web, pero antes de que se muestren a otro usuario. Hay varias herramientas en línea que pueden sanear el HTML y filtrar cualquier inyección de código malicioso.
Tomar medidas de seguridad para las cookies - Las aplicaciones web también pueden establecer reglas especiales para su gestión de las cookies, que pueden mitigar el robo de las mismas mediante ataques de scripting entre sitios. Las cookies pueden estar vinculadas a determinadas direcciones IP para que los atacantes de scripting entre sitios no puedan acceder a las mismas. Además, se pueden crear reglas para bloquear el acceso de JavaScript a las cookies.
Configuración de reglas WAF - También se puede configurar un WAF para aplicar reglas que impidan el scripting entre sitios reflejado. Estas reglas WAF emplean estrategias que bloquearán las solicitudes extrañas al servidor, incluyendo los ataques de scripting entre sitios. El Cloudflare WAF ofrece una instalación llave en mano y protege las aplicaciones web ante scripting entre sitios, ataques DDoS, inyección de código SQL y otras amenazas habituales.