Descripción

This lab involves a front-end and back-end server, and the front-end server doesn’t support chunked encoding.

The application is also vulnerable to reflected XSS via the User-Agent header.

To solve the lab, smuggle a request to the back-end server that causes the next user’s request to receive a response containing an XSS exploit that executes alert(1).

Exploiting HTTP request smuggling to deliver reflected XSS writeup

Dividiremos el laboratorio en tres fases:

Detectar la vulnerabilidad XSS

Veremos que en los posts, la aplicación web toma nuestro ‘User-Agent’ y lo incrusta en el código HTML:

Si cambiamos el valor del campo por:

"><script>alert(1)</script>

Y abrimos la petición en el navegador con Click derecho en ‘Response’ -> Show response in browser, copiamos el enlace en el navegador y accedemos, podremos ver que se ejecuta el alert(1), confirmando en XSS reflejado.

Detectar el tipo de vulnerabilidad HTTP smuggling

Tras esto, tendremos que verificar el tipo de vulnerabilidad HTTP smuggling:

Modificaremos las peticiones a la raíz en el ‘Repeater’ de la siguiente forma:

  1. En Inspector -> Request attributes, cambiamos la versión de HTTP a 1.1.
  2. Damos Click derecho -> Change request method, para cambiar el método a POST.
  3. Añadimos la propiedad ‘Transfer-encoding’ con el valor chunked.
  4. Activamos la opción de ver los caracteres especiales con ‘\n’.
  5. En opciones, a la derecha de ‘Save’, desactivaremos la opción de ‘Update content length’, al menos hasta que sepamos el tipo de vulnerabilidad.
  6. De manera opcional también se pueden borrar todos los atributos no necesarios para este laboratorio, como se puede ver en la siguiente captura:

Comprobamos así que consiste en una vulnerabilidad CL.TE, por lo que volvemos a activar la opción ‘Update content length’.

CL.TE significa lo siguiente:

Preparar la petición para hacer el ataque CL.TE

Uniremos las dos peticiones de la siguiente forma:

  1. Pondremos el cierre del chunk (\r\n0\r\n\r\n) para que el backend interprete ambas peticiones como distintas.
  2. Cambiaremos el método HTTP del post a 1.1
  3. Eliminaremos todas las etiquetas no necesarias (opcional)
  4. Añadiremos ‘Content-Type’ y ‘Content-Length’, el ‘Content-Length’ deberá ser mayor a 3.

Enviaremos la petición, al refrescar cualquier página del laboratorio en el navegador debería de saltar el alert(). La volveremos a enviar y esperaremos un minuto antes de refrescar, completando así el laboratorio:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *