Exploiting HTTP request smuggling to bypass front-end security controls, TE.CL vulnerability
Laboratorio de Portswigger sobre HTTP Request Smuggling
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio involucra un servidor front-end y un servidor back-end. El servidor back-end no admite chunked encoding y existe un panel de administración en /admin, pero el servidor front-end bloquea el acceso a él
Para resolver el laboratorio, debemos enviar una petición smuggleada al servidor back-end que elimine al usuario carlos
Aunque el laboratorio admite HTTP/2, la solución prevista requiere técnicas que solo son posibles en HTTP/1. Es posible cambiar manualmente de protocolo en el Repeater desde la sección Request attributes del Inspector
Resolución
Al acceder a la web vemos esto
Capturamos la petición con Burpsuite, la enviamos al Repeater, eliminamos las cabeceras innecesarias, pulsamos sobre Show non-printable chars y en el apartado Request atributes del Inspector cambiamos el protocolo de HTTP/2 a HTTP/1. Una vez tengamos todo esto hecho, vamos a realizar la petición, si todo funciona bien significa que la petición se puede realizar con las cabeceras que estamos usando
Lo siguiente que debemos de hacer es pulsar sobre el engranaje y descheckear la opción Update Content-Length para que no se actualice el Content-Length
Ahora vamos a cambiar el método a POST, para ello hacemos click derecho > Change request method
Ahora vamos a proceder a testear si nos encontramos ante un TE.CL o ante un CL.TE. He añadido la cabecera Transfer-Encoding con el valor chunked, esto quiere decir que vamos a enviar los datos que se proporcionan en el body en este formato. También he añadido la cabecera Content-Length porque también es necesaria
Vamos a explicar la petición. El Content-Length debe indicar un tamaño superior al del body que realmente enviamos, por eso le ponemos 6, porque es un byte mayor que el tamaño del body, el cual es 5
Si estuviéramos ante un TE.CL, el frontend procesaría el Transfer-Encoding y cortaría el body chunked después del 0\r\n\r\n (antes de la x). El backend, usando Content-Length: 6, esperaría 6 bytes pero recibiría 5 solamente, lo que provocaría un timeout
Respecto a la letra x, se pone ahí para detectar si el front-end ha interpretado Transfer-Encoding y ha cortado el body antes de esa x. Si el frontend no interpreta Transfer-Encoding, la x se reenviará al backend junto con el resto del body
En este caso al enviar la petición, vemos que hay un timeout. Por lo tanto, podemos estar seguros de que hemos detectado un TE.CL
Una vez detectada la vulnerabilidad vamos a confirmarla con esta petición
Vamos a explicar la petición. El Content-Length debe indicar un tamaño superior al del body que realmente enviamos. Como el body ocupa 10 bytes, utilizamos un Content-Length de 11. Esto hace que el back-end no dé por finalizada la petición tras leer esos 10 bytes, sino que espere un byte adicional, el cual pertenecerá a la siguiente petición HTTP. Este comportamiento es el que permite que la siguiente petición quede parcialmente absorbida por la petición smuggleada y se produzca la desincronización
Luego, el valor 9e es 158 en hexadecimal e indica el tamaño del chunk que va a recibir el frontend y el 0 indica la que ahí es donde termina el body chunked
Y por último, el Content-Length es 4 porque es el número de bytes que ocupa la primera línea del body chunked. Esto se hace para que el backend lea solo hasta ahí
El siguiente paso es realizar la primera petición desde Burpsuite. Como vemos, la respuesta es normal
Al enviar la segunda petición vemos un 404 Not Found, por lo tanto, podemos confirmar el TE.CL
Una vez ya confirmad

















