Informe sobre Cross-Site Scripting (XSS)
Publicado el 13 de junio de 2025
Introducción
Cross-Site Scripting (XSS) es una vulnerabilidad muy conocida de ciberseguridad web que permite a los atacantes inyectar scripts maliciosos en páginas webs.
¿Qué es el Cross-Site Scripting?
XSS es una vulnerabilidad web que permite inyectar código JavaScript Malicioso en un sitio web verídico en un sitio confiable y que cuando un usuario visita la página comprometida, el código malicioso se ejecuta en su navegador y permite a los atacantes robar información, realizar acciones en nombre de usuario, etc.
Principales tipos de XSS
XSS Reflejado
Los datos que se inyectan por el atacante se reflejan en la respuesta HTTPS sin hacer nada en el servidor y generalmente se explota mediante enlaces maliciosos.
XSS Almacenado
El código malicioso se almacena en el servidor como por ejemplo una base de datos o un archivo y se ejecuta cuando el usuario accede a la página comprometida
XSS basado en DOM
Se explota manipulando el DOM del navegador sin que el servidor intervenga en la inyección del código
Explotación de vulnerabilidades XSS
Los que se puede conseguir explotando esta vulnerabilidad es:
- Redirigir a usuarios a lugares maliciosos
- Robar cookies de sesión y credenciales
- Ejecutar keyloggers y ejecutar ataques de phising a los usuarios
- Modificar la página web y engañar a los usuarios
Medidas de Prevención
Para evitar sufrir un ataque de inyección de código XSS, podemos implementar las siguiente medidas:
- Validación: Filtrar y codificar los datos de entrada
- Cabeceras HTTPS: Implementar cabeceras seguras en las conexiones .
- Evitar inserción en DOM: Usar textContent en lugar de innerHTML
- Política de seguridad de Contenido: Restringir los orígenes permitidos para la ejecución de scripts
Realización de Laboratorio
Reflected XSS into HTML context with nothing encoded
Para la resolución de este laboratorio, simplemente hay que introducir en la entrada de texto para la brusquedad, un simple script
<script>alert('fede')</script>
Y si lo ejecutamos, vemos que nos dice el mensaje
Stored XSS into HTML context with nothing encoded
Para resolver este laboratorio, basta con introducir un comentario, y en la casilla del comentario, introducimos un Script, y en la casilla de Website, tenemos que poner la página donde se va a ejecutar el script
Nada más postear el comentario, nos da las gracias
Y si volvemos, ahora solo nos saldrá la alerta guardada
DOM XSS in document.write
sink using source location.search
Para resolver este ejercicio, debemos de hacer click derecho encima del buscador, y darle a inspeccionar.
Y vemos que tenemos una imagen, que no vemos en la página
Entonces si introducimos lo siguiente en el buscador, se ejecutará una alerta con el script:
"><script>alert('federico0')</script>
Esto lo que hará es comentar el cierre real de la imagen e introducir un supuesto svg con la alerta
Y nos saldrá la alerta con las felicitaciones de haberlo completado
DOM XSS in innerHTML
sink using source location.search
Para completar el laboratorio, debemos insertar una imagen y si da error el src que lo vamos a poner erroneo, ejecutará la alerta
<img src=1 onerror=alert('federico')>
Y vemos que se nos ejecuta el script
DOM XSS in jQuery anchor href
attribute sink using location.search
source
Para completar el laboratorio, necesitamos ir a un post y pulsar en Submit Feedback
Al entrar, vemos en la URL un path un poco extraño
Si probamos cambiar el returnPath por el siguiente, podemos ver como se ejecuta el script
returnPath=javascript:alert('federico')
Y si ahora le damos a back podemos ver como se nos ejecuta el script correctamente
DOM XSS in jQuery selector sink using a hashchange event
Para completar el laboratorio tenemos que ir pulsar en el boton para ir al exploit server
Esto parece un servidor para hacer una respuesta para una API. Así que pegamos lo siguiente en el cuerpo
<iframe src="https://0a300078038a5bd781d970880003007d.web-security-academy.net/#" onload="this.src+='<img src=x onerror=print()>'"></iframe>
Y le damos a View Exploit
Y ahora vemos como se nos ejecuta en bucle para poder imprimir el blog en PDF
Y si ahora le damos a Deliver Exploit to Victim , nos dará las felicitaciones
Reflected XSS into attribute with angle brackets HTML-encoded
Para resolver el problema, podemos buscar en el buscador, y acceder en el código fuente de la página
Y en el código fuente, podemos ver como lo que introducimos se queda en el value y es la ultima variable y no modifica nada al ejecutar un script
Así que podemos introducir un script, que al pasar el cursor por encima, saque una alerta
"onmouseover="alert('federico')
Y al ejecutarlo, vemos las felicitaciones
Stored XSS into anchor href
attribute with double quotes HTML-encoded
Para completar esto, tenemos que ir a una publicación y escribir un comentario, y en la zona de Website, introducimos el siguiente script para ejecutar un script
javascript:alert('federico')
Y cuando veamos que se ha subido el comentario, tenemos que hacer click en el enlace del nombre
Al hacer click, se nos ejecutará el script que hemos hecho antes
Reflected XSS into a JavaScript string with angle brackets HTML encoded
Para resolver el ejercicio, debemos de hacer una búsqueda y abrir el código fuente
Si abrimos el código fuente, podemos ver como lo que introduzcamos en la búsquedad, se introduce en una variable de javascript, y se introduce en una imagen
Así que si ejecutamos lo siguiente en el buscador podemos ejecutar el script
'-alert('federico')-'
Extra - Stored XSS into onclick
event with angle brackets and double quotes HTML-encoded and single quotes and backslash escaped
Para resolver este ejercicio, lo primero que tenemos que hacer es ir a un post y añadir un mensaje
Si entramos en el código fuente nada más ingresar el comentario, podemos ver como , al crearlo, en el enlace que tenemos donde website, podermos ver como tenemos una ejecución en javascript
Entonces si introducimos lo siguiente en website, podemos parsear este script para poder poder ejecutar lo que queramos
Lo que hacemos es añadir como si fuese una variable la alerta, pero tenemos que poner en ASCII las comillas que es '
https://0a84008e03caf7d5827801cb00b500d8.web-security-academy.net?'-alert(1)-'
Ahora pulsamos en el enlace del nombre
Y se ejecuta el script