Como mitigar un ataque XSS
Introducción
El ataque XSS (Cross-Site Scripting) es una vulnerabilidad que permite a un atacante inyectar código JavaScript a un sitio web. Este código se le hace llegar al usuario final, y se ejecuta en el navegador de este, lo que permite al atacante robar información, secuestrar sesiones, realizar acciones en la sesión del usuario sin su consentimiento o redirigir a sitios maliciosos.
Explotación
El ataque XSS se puede llevar a cabo de varias maneras, mientras se tenga como input un campo que se muestre en el sitio web. Algunos ejemplos de esto son:
- Formularios (como campos de texto, selectores, etc.)
- Headers (como
Referer
,User-Agent
oCookie
) - JSON (en APIs)
Código vulnerable
A continuación se muestra un ejemplo de código vulnerable a XSS:
El comportamiento esperado de este código es mostrar un saludo al usuario con el nombre que este haya ingresado como se muestra en la siguiente imagen:
Sin embargo, si un atacante ingresa el siguiente texto en el campo name
: <script>alert("XSS")</script>
, el código vulnerable mostrará un mensaje emergente en el navegador del usuario, como se muestra en la siguiente imagen:
Mitigación
Para mitigar un ataque XSS, se pueden seguir las siguientes recomendaciones:
- Validación de inputs: Validar que los inputs no contengan caracteres especiales que puedan ser interpretados como código. Teniendo una lista blanca de caracteres permitidos.
- Escapado de caracteres: Escapar los caracteres especiales antes de mostrarlos en el sitio web. Esto evita que el navegador los interprete como código. Es recomendado usar las herramientas del framework que se esté utilizando.
- Sanitización de inputs: Limpiar los inputs de caracteres especiales antes de mostrarlos en el sitio web.
- Headers de seguridad: Configurar los headers de seguridad en el servidor para prevenir ataques XSS.
- Frameworks seguros: Utilizar frameworks seguros que mitiguen automáticamente ataques XSS.
La mitigación depende del contexto del desarrollo de la pieza de software en donde se debe elegir las mejores opciones para abarcar la mayor seguridad posible a la hora de realizar codigo seguro.
Codigo seguro
A continuación se muestra un ejemplo de código seguro a XSS:
El comportamiento esperado de este código es mostrar un saludo al usuario con el nombre que este haya ingresado, sin importar si este contiene caracteres especiales, como se muestra en la siguiente imagen:
Otros ejemplos
- Validación de inputs:
- Escapado de caracteres:
- Sanitización de inputs:
- Headers de seguridad: Establecer Políticas de Seguridad de Contenido (CSP). Puedes hacerlo agregando una cabecera HTTP Content-Security-Policy. Flask puede configurar esto para todas las respuestas usando el decorador after_request.
- Frameworks seguros: Uso de Jinja2 para renderizar plantillas (recomendado)
index.html:
Conclusión
Si bien el Cross-Site Scripting es una vulnerabilidad antigua, su explotación es común en el ciberespacio. Es importante tener en cuenta las recomiendaciones para mitigarla, ya que puede ser explotada de manera sencilla y causar daños significativos a los usuarios y a la empresa.
Referencias
-Cross-Site Scripting (XSS) - xss payloads collect
-Cross Site Scripting (XSS) - OWASP
-What is cross-site scripting (XSS)?