Skip to content

20260115104503.png

En este caso de explotación, se tiene que el frontend interpreta el Transfer-Encoding y el backend Content-Length. Por lo que probaremos a descincronizar cada una de ellas.

  • Frontend: En este caso, al interpretar el Transfer-Encoding, este se fijara en donde termina la solicitud.

20260123121218.png

Como se observa en la imagen, al final se encuentra un 0 el cual indica que hasta ahi es donde termina la solicitud, para luego pasársela al backend. En caso de que este 0 no exista el frontend dará un error por respuesta.

20260123121448.png

En la imagen anterior vemos que da un error debido a que no se le indica en donde debe terminar la solicitud.

  • Backend: Para este caso el backend interpreta el Content-Length, por lo que para llegar a desincronizar, debemos pasarle unos bits mas en el Content-Length.

Como vemos, el Content-Length tiene una asignación de 19 bits, por lo que la solicitud se logra enviar correctamente.

20260123122258.png

c
POST / HTTP/1.1
Host: 0aa5003f03e77cfe82ce01af00d20081.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
Content-Length: 20

9
test=test
0

Pero al agregar un bit mas 20 al Content-Length, este genera un error del lado del backend.

20260123122625.png

c
POST / HTTP/1.1
Host: 0aa5003f03e77cfe82ce01af00d20081.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
Content-Length: 20

9
test=test
0

El error es generado debido a que al ser solo 19 bits, el backend interpreta que falta una debido a que se define en el Content-Length: 20.

LAB

Teniendo en cuenta lo anterior, podemos construir nuestra solicitud maliciosa.

  • Para el primer size del Content-Length debemos considerar el contenido antes del segundo POST.

20260123125001.png

  • Para el segundo que es el size antes del segundo post, este debe considerar toda la data del segundo POST pero en hexadecimal.

20260123125134.png

  • Para el el tamaño del segundo Content-Length este se debe considerar toda la data que se encuentra en el body.

20260123125417.png

Según lo explicado, ahora podremos asignar los valores adecuados.

  • Para el primer content-length se tiene que son 19 bits.

20260123125543.png

  • Par el siguiente size que debe estar en hexadecimal.

20260123125718.png

  • Para el el ultimo es solo la data antes del segundo POST.

20260123125815.png

Ahora intentaremos generar el 404 pero observamos que estas solicitudes no llegan a generar un 404.

20260123125920.png

Esto es debido a que es necesario un bit mas en el segundo Content-Length, pasando de 19 a 20.

c
POST / HTTP/1.1
Host: 0aa5003f03e77cfe82ce01af00d20081.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
Content-Length: 4

36
POST /404 HTTP/1.1
Content-Length: 20

testing=test

0

Al cambiar el Content-Length y enviamos dos veces la solicitud podemos generar un 404 error. El hecho de que tengamos que enviar nos veces la solicitud es debido a que la solicitud queda en un tipo de keep-alive o a la espera de otro solicitud, es por esto que en la siguiente solicitud muestra recien el 404.

20260123130009.png