
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:
- En Inspector -> Request attributes, cambiamos la versión de HTTP a 1.1.
- Damos Click derecho -> Change request method, para cambiar el método a POST.
- Añadimos la propiedad ‘Transfer-encoding’ con el valor chunked.
- Activamos la opción de ver los caracteres especiales con ‘\n’.
- En opciones, a la derecha de ‘Save’, desactivaremos la opción de ‘Update content length’, al menos hasta que sepamos el tipo de vulnerabilidad.
- 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:
- El servidor front-end utiliza la propiedad del encabezado HTTP ‘Content-Length’.
- El servidor back-end utiliza la propiedad del encabezado HTTP ‘Transfer-Encoding’.
Preparar la petición para hacer el ataque CL.TE
Uniremos las dos peticiones de la siguiente forma:

- Pondremos el cierre del chunk (\r\n0\r\n\r\n) para que el backend interprete ambas peticiones como distintas.
- Cambiaremos el método HTTP del post a 1.1
- Eliminaremos todas las etiquetas no necesarias (opcional)
- 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:
