
Descripción
This lab is vulnerable to CL.0 request smuggling attacks. The back-end server ignores the Content-Length
header on requests to some endpoints.
To solve the lab, identify a vulnerable endpoint, smuggle a request to the back-end to access to the admin panel at /admin
, then delete the user carlos
.
This lab is based on real-world vulnerabilities discovered by PortSwigger Research. For more details, check out Browser-Powered Desync Attacks: A New Frontier in HTTP Request Smuggling.
CL.0 request smuggling writeup
Este laboratorio se llama CL.0 debido a que el frontend hace caso del CL, pero el backend lo ignora (0). Para encontrar esta vulnerabilidad, hay tres opciones:
- POST request to a static file.
- POST request to a server level redirect.
- POST request that triggers a server side error.
Luego, hay que realizar la perición maliciosa y la petición normal en la misma conexión TCP, para ello:
- Header Connection: Keep-Alive
- Enable HTTP/1 Connection Re-use
- Send Group – Single Connection
Accederemos al laboratorio y con el ‘Logger’, tomaremos un archivo y lo enviaremos al ‘Repeater’ con Ctrl + R o Click derecho -> Send to Repeater.
Allí, le cambiaremos el método HTTP a POST y deberá de devolver un código 200, si no, habrá que cambiar el tipo de archivo.
Cambiaremos la versión de HTTP a 1.1 y modificaremos el ‘Content-Length’ (habiéndolo desactivado antes). Nos debe devolver un error de frontend:

Esto nos indica que el frontend está utilizando el ‘Content-Length’. Desactivaremos la opción de poder editar en ‘Content-Length’ y realizaremos los siguientes cambios:
- Añadimos la propiedad ‘Connection: Keep-alive’.
- Activamos la opción de ‘Enable HTTP/1 connection reuse’.
- Añadimos otra petición a la raíz y hacemos un grupo para enviarlas en la misma conexión (deberemos de cambiarle el tipo de HTTP a 1.1).
El resultado será el siguiente:
Petición maliciosa:

Petición correcta:

Ahora, si cambiamos en el ‘GET’ de la primera petición la ruta a ‘/admin’, podremos verla en la segunda petición:

Cambiaremos la URL del GET a ‘/admin/delete?username=carlos’ y enviaremos ambas, completando así el laboratorio:
