Programadores contra la seguridad: comparte y aprende - Cross-Site Scripting (XSS)

El cross-site scripting (XSS) ha sido un quebradero de cabeza para los profesionales de la seguridad desde principios de la década de 2000 y, lamentablemente, décadas después, sigue siendo una de las amenazas a nivel de código más comunes. Esta clase de vulnerabilidad de software nos ha afectado durante demasiado tiempo, y una alerta reciente de CISA —como parte de su movimiento Secure-by-Design— busca erradicarla de una vez por todas. Tienen la misión global de eliminar clases de vulnerabilidades a gran escala, y este enfoque en la seguridad impulsada por el desarrollador es algo que realmente puede marcar la diferencia, pero requerirá el compromiso de empresas inteligentes que preparen a sus desarrolladores para el éxito en seguridad.
Entonces, ¿qué es exactamente el XSS?
Los navegadores web pueden ser nuestra puerta de entrada a todo lo bueno que hay en línea, pero lamentablemente no todo son buenas noticias. El comportamiento inherente de los navegadores web puede ser un catalizador de vulnerabilidades de seguridad. Los navegadores comenzaron confiando característicamente en el marcado que veían y ejecutándolo sin cuestionar. Todo eso está muy bien hasta que esa funcionalidad se explota con fines poco éticos... y, naturalmente, los atacantes terminaron encontrando formas de explotar esta tendencia para sus fines malintencionados.
El cross-site scripting aprovecha la confianza de los navegadores y el desconocimiento de los usuarios para robar datos, tomar el control de cuentas y desfigurar sitios web; es una vulnerabilidad que puede volverse muy grave muy rápidamente.
Echemos un vistazo a cómo funciona el XSS, qué daños puede causar y cómo prevenirlo:
¿Cómo funciona el XSS?
El XSS ocurre cuando una entrada no confiable (a menudo datos) se procesa como salida en una página pero se interpreta erróneamente como código ejecutable. Un atacante puede colocar código ejecutable malicioso (etiquetas HTML, JavaScript, etc.) dentro de un parámetro de entrada, el cual, al devolverse al navegador, se ejecuta en lugar de mostrarse como datos.
Como se mencionó anteriormente, la vulnerabilidad apareció debido al comportamiento de funcionamiento central de los navegadores, donde es difícil distinguir los datos del código ejecutable. El modelo operativo de la web es el siguiente:
- El usuario visita una página web
- La página le indica al navegador qué archivos cargar y qué ejecutar
- El navegador ejecuta lo que hay en la página, sin hacer preguntas
Esta funcionalidad ha dado lugar a algunas de las experiencias interactivas más increíbles que disfrutamos en la web. La otra cara de la moneda es que también ha provocado costosas vulnerabilidades y ataques.
Cuando los atacantes añaden su script malicioso a un sitio vulnerable, este se ejecuta sin cuestionamientos. No hay una investigación más profunda ni medidas de detección implementadas.

Existen tres tipos de XSS:
- XSS almacenado
- XSS reflejado
- XSS basado en DOM
El XSS almacenado ocurre cuando un atacante puede almacenar de forma persistente el script malicioso en un campo de datos de la aplicación (por ejemplo, en un campo que guarda el número de teléfono móvil del usuario). Este script sospechoso se envía al navegador del usuario cada vez que ese campo de datos se muestra en la aplicación.
Este tipo de ataque se observa a menudo en foros o motores de comentarios. Un atacante introduce el script malicioso en un comentario y, ¡pum!, cada usuario que ve ese comentario ejecuta el script sin saberlo.
El XSS reflejado ocurre cuando la entrada del usuario se refleja en el navegador del usuario tal cual. Un ejemplo es un cuadro de búsqueda que muestra "Has buscado..." al usuario mientras obtiene los resultados de la búsqueda.
Ahora, imagina que la búsqueda funciona colocando el término de búsqueda en la URL como parámetros de consulta. Un atacante malintencionado podría enviar a la víctima un enlace con el script malicioso incrustado en esos mismos parámetros y, sinceramente, la mayoría de los usuarios web apenas lo notarían.
La víctima hace clic en el enlace y es redirigida a un sitio de phishing donde introduce sin querer su contraseña para el sitio. Poco se imaginan que un atacante acaba de robar la llave de su cuenta.
El XSS basado en DOM es una variedad relativamente nueva de esta vulnerabilidad. Aprovecha las complejas estructuras de plantillas que se encuentran en muchos marcos de interfaz de usuario como Angular y React.
Estas plantillas permiten contenido dinámico y aplicaciones de interfaz enriquecidas. Si se usan incorrectamente, pueden utilizarse para ejecutar ataques XSS.
Así que ahí lo tienes. Ya tienes el alcance del XSS en pocas palabras. Profundicemos en cómo puede utilizarse de forma destructiva.
¿Por qué es tan peligroso el XSS?
El XSS puede utilizarse para redirigir a los usuarios a sitios maliciosos, robar cookies y buscar datos de sesión. Básicamente, todo lo que JavaScript puede hacer, los ataques XSS también son capaces de hacerlo.
Aquí hay tres ejemplos de ataques XSS:
- Los usuarios de correo electrónico de Yahoo sufrieron el robo de sus cookies de sesión mediante XSS en 2015.
- El gusano Samy se distribuyó a través de una vulnerabilidad XSS en MySpace. Sigue siendo el malware de propagación más rápida de todos los tiempos, afectando a un millón de usuarios en solo 20 horas.
- eBay permitió que se incluyeran scripts maliciosos en las descripciones de los productos. Esto dio lugar a ataques XSS contra los usuarios de eBay.
Los ataques XSS son engañosamente simples y muy graves. Pueden provocar el robo de sesiones, credenciales de usuario o datos confidenciales. El daño a la reputación y la disminución de los ingresos son los principales peligros de estos ataques. Incluso el simple hecho de desfigurar un sitio web puede tener consecuencias indeseables para una empresa.
Sin embargo, el XSS puede ser derrotado por un experto en seguridad como tú. La solución no es complicada y la industria ha avanzado muchísimo desde que el XSS se convirtió en un exploit de uso común.
Puedes derrotar al XSS.
La clave para derrotar al XSS es entender el contexto. Específicamente, el contexto en el que la entrada del usuario se devolverá al cliente y dónde se devolverá. Dentro del código HTML o dentro de un fragmento de JavaScript.
Si la entrada del usuario no tiene que enviarse de vuelta al navegador, mucho mejor. Pero si es así, a menudo debería estar codificada en HTML. La codificación HTML de la salida le dirá al navegador que procese el contenido tal cual y que no lo ejecute.
La validación de entrada también es importante. Sin embargo, la validación y las listas blancas no son soluciones infalibles. La codificación va un paso más allá y evita que los navegadores ejecuten scripts maliciosos. Todo lo que no se detecte con estrategias de validación y listas blancas, lo captará la codificación.
Muchos marcos de trabajo ahora codifican la salida HTML automáticamente.
Angular, ASP.NET MVC y React.js son marcos donde se utiliza la codificación HTML predeterminada. Tienes que indicar específicamente a estos marcos que no codifiquen llamando a un método especial.
La mayoría de los otros marcos (es decir, Django y Spring) tienen bibliotecas estándar para la prevención de XSS que puedes incorporar fácilmente a tu código.
El mayor desafío es aprender a analizar todas las formas en que la entrada del usuario puede ingresar a un sistema para que puedas estar atento. Los parámetros de consulta pueden transportar ataques, al igual que los parámetros POST. Sigue el flujo de datos a través de tu aplicación y no confíes en ningún dato que provenga del exterior.
Piensa como un guardia fronterizo. Detén cada dato, inspecciónalo y no permitas que entre si parece malicioso. Luego, codifica al procesar para asegurarte de que cualquier cosa mala que se haya pasado por alto no cause problemas.
Ejecuta estas estrategias y tus usuarios estarán a salvo de ataques mediante XSS. Echa un vistazo a la hoja de trucos de OWASP para obtener aún más consejos para mantener tus datos bajo control.
Detén el XSS y mejora tus habilidades de seguridad.
El XSS ocupa el séptimo lugar en la lista OWASP Top 10 2017 de riesgos de seguridad web. Ha existido durante un tiempo, pero aún puede aparecer y causar problemas en tu aplicación si no tienes cuidado.
La formación es muy importante para que los desarrolladores construyan una mentalidad de seguridad desde el principio mientras crean código. Y esa formación siempre es más efectiva cuando simula aplicaciones reales, en los lenguajes que los desarrolladores están utilizando activamente. Con esto en mente, ¿por qué no echas un vistazo a nuestros recursos de aprendizaje para obtener más información sobre el XSS? Después de eso, puedes comenzar la formación y la práctica que te llevarán a dominarlo.
¿Crees que estás listo para encontrar y corregir vulnerabilidades XSS ahora mismo? Ponte a prueba en la plataforma Secure Code Warrior.
Controle el desarrollo impulsado por IA antes de su lanzamiento
Mida el riesgo asistido por IA, aplique políticas de codificación segura en el momento de la confirmación y acelere la entrega segura en todo su ciclo de vida de desarrollo de software (SDLC).
Explorar más blogs
Acceda a contenido especializado sobre programación segura, gobernanza de IA y gestión de riesgos de software.

Una cultura de seguridad: cómo Sage creó su programa de defensores
Descubre cómo Sage reforzó su seguridad con un enfoque flexible y centrado en las relaciones, logrando formar a más de 200 expertos en seguridad y alcanzar una reducción de riesgos cuantificable.

Kamer van Koophandel: Seguridad a escala impulsada por los desarrolladores
La Cámara de Comercio (Kamer van Koophandel) comparte cómo integró la programación segura en el desarrollo diario mediante certificaciones basadas en roles, evaluaciones comparativas de puntuación de confianza y una cultura de responsabilidad compartida en seguridad.

Cómo un «Juego de Códigos» guía a IAG Group hacia un futuro de programación más seguro
IAG Group es la entidad detrás de muchas de las principales compañías de seguros en la región de Asia-Pacífico, que suscribe pólizas para millones de clientes por un valor aproximado de 11.400 millones de dólares australianos en primas anuales.

Mes de la Concienciación sobre Ciberseguridad 2026: Comprender la seguridad de la IA es fundamental para la defensa empresarial
Hemos llegado a un punto en el que la mayoría de las principales empresas de IA han pedido públicamente una ralentización global en el desarrollo de la IA para que las medidas de seguridad puedan ponerse al día, pero la verdad es que ya se han materializado graves problemas de seguridad. Esto deja a innumerables líderes de seguridad y equipos ejecutivos en una situación urgente, a medida que los costes monetarios y de riesgo de la implementación de la IA siguen acumulándose.

Habilitador 8: Branding de su programa
Un programa de codificación segura necesita algo más que un buen contenido para tener éxito. El Habilitador 8 muestra cómo el branding transforma la participación en una experiencia codiciada basada en el estatus.
.avif)
Cada empleado está ahora en la primera línea de la ciberseguridad de la IA
El panorama tecnológico empresarial está cambiando a una velocidad que pocos previeron hasta que fue demasiado tarde. Hemos cruzado oficialmente el umbral del código escrito por humanos y la asistencia básica de copilotos hacia la era del Ciclo de Vida de Desarrollo Agéntico (ADLC). Si bien los agentes de IA autónomos prometen una eficiencia sin precedentes en múltiples funciones, también traen consigo una clase completamente nueva de riesgos regulatorios y de seguridad.
Proteja el desarrollo basado en IA antes de su lanzamiento
Identifique riesgos de desarrollo, aplique políticas y prevenga vulnerabilidades en todo el ciclo de vida de su software.