hacktricks/pentesting-web/http-response-smuggling-desync.md

12 KiB

HTTP Response Smuggling / Desync

{% hint style="success" %} Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

La technique de ce post a été tirée de la vidéo : https://www.youtube.com/watch?v=suxDcYViwao&t=1343s

DĂ©synchronisation de la file d'attente des requĂȘtes HTTP

Tout d'abord, cette technique abuse d'une vulnérabilité de HTTP Request Smuggling, donc vous devez savoir ce que c'est :

La principale diffĂ©rence entre cette technique et un smuggling HTTP Request commun est que au lieu de cibler la requĂȘte de la victime en ajoutant un prĂ©fixe, nous allons fuiter ou modifier la rĂ©ponse que la victime reçoit. Cela se fait en, au lieu d'envoyer 1 requĂȘte et demie pour abuser du HTTP Request smuggling, envoyer 2 requĂȘtes complĂštes pour dĂ©synchroniser la file d'attente des rĂ©ponses des proxies.

C'est parce que nous allons pouvoir dĂ©synchroniser la file d'attente des rĂ©ponses afin que la rĂ©ponse de la requĂȘte lĂ©gitime de la victime soit envoyĂ©e Ă  l'attaquant, ou en injectant du contenu contrĂŽlĂ© par l'attaquant dans la rĂ©ponse Ă  la victime.

DĂ©synchronisation du pipeline HTTP

HTTP/1.1 permet de demander des ressources diffĂ©rentes sans avoir besoin d'attendre les prĂ©cĂ©dentes. Par consĂ©quent, s'il y a un proxy au milieu, c'est la tĂąche des proxies de maintenir une correspondance synchronisĂ©e des requĂȘtes envoyĂ©es au backend et des rĂ©ponses provenant de celui-ci.

Cependant, il y a un problĂšme de dĂ©synchronisation de la file d'attente des rĂ©ponses. Si un attaquant envoie une attaque de HTTP Response smuggling et que les rĂ©ponses Ă  la requĂȘte initiale et Ă  celle smuggled sont rĂ©pondues immĂ©diatement, la rĂ©ponse smuggled ne sera pas insĂ©rĂ©e dans la file d'attente de la rĂ©ponse de la victime mais sera juste rejetĂ©e comme une erreur.

Par consĂ©quent, il est nĂ©cessaire que la requĂȘte smuggled prenne plus de temps Ă  ĂȘtre traitĂ©e Ă  l'intĂ©rieur du serveur backend. Ainsi, au moment oĂč la requĂȘte smuggled est traitĂ©e, la communication avec l'attaquant sera terminĂ©e.

Si dans cette situation spĂ©cifique une victime a envoyĂ© une requĂȘte et que la requĂȘte smuggled est rĂ©pondue avant la requĂȘte lĂ©gitime, la rĂ©ponse smuggled sera envoyĂ©e Ă  la victime. Par consĂ©quent, l'attaquant va contrĂŽler la requĂȘte "effectuĂ©e" par la victime.

De plus, si l'attaquant effectue ensuite une requĂȘte et que la rĂ©ponse lĂ©gitime Ă  la requĂȘte de la victime est rĂ©pondue avant la requĂȘte de l'attaquant. La rĂ©ponse Ă  la victime va ĂȘtre envoyĂ©e Ă  l'attaquant, volant la rĂ©ponse Ă  la victime (qui peut contenir par exemple l'en-tĂȘte Set-Cookie).

Injections imbriquées multiples

Une autre diffĂ©rence intĂ©ressante avec le HTTP Request Smuggling commun est que, dans une attaque de smuggling commune, le but est de modifier le dĂ©but de la requĂȘte de la victime afin qu'elle effectue une action inattendue. Dans une attaque de HTTP Response smuggling, comme vous envoyez des requĂȘtes complĂštes, vous pouvez injecter dans une charge utile des dizaines de rĂ©ponses qui vont dĂ©synchroniser des dizaines d'utilisateurs qui vont recevoir les rĂ©ponses injectĂ©es.

En plus de pouvoir distribuer plus facilement des dizaines d'exploits parmi des utilisateurs lĂ©gitimes, cela pourrait Ă©galement ĂȘtre utilisĂ© pour provoquer un DoS sur le serveur.

Organisation de l'exploit

Comme expliquĂ© prĂ©cĂ©demment, pour abuser de cette technique, il est nĂ©cessaire que le premier message smuggled dans le serveur prenne beaucoup de temps Ă  ĂȘtre traitĂ©.

Cette requĂȘte consommatrice de temps est suffisante si nous voulons juste essayer de voler la rĂ©ponse de la victime. Mais si vous voulez effectuer un exploit plus complexe, cela sera une structure commune pour l'exploit.

Tout d'abord la requĂȘte initiale abusant du HTTP Request smuggling, puis la requĂȘte consommatrice de temps et ensuite 1 ou plusieurs requĂȘtes de charge utile dont les rĂ©ponses seront envoyĂ©es aux victimes.

Abus de la désynchronisation de la file d'attente des réponses HTTP

Capturer les requĂȘtes d'autres utilisateurs

Comme avec les charges utiles connues de HTTP Request Smuggling, vous pouvez voler la requĂȘte de la victime avec une diffĂ©rence importante : Dans ce cas, vous avez juste besoin que le contenu envoyĂ© soit reflĂ©tĂ© dans la rĂ©ponse, aucun stockage persistant n'est nĂ©cessaire.

Tout d'abord, l'attaquant envoie une charge utile contenant une requĂȘte POST finale avec le paramĂštre rĂ©flĂ©chi Ă  la fin et une grande Content-Length.

Ensuite, une fois que la requĂȘte initiale (bleue) a Ă©tĂ© traitĂ©e et pendant que la requĂȘte lente est en cours de traitement (jaune), la prochaine requĂȘte qui arrive d'une victime va ĂȘtre ajoutĂ©e dans la file d'attente juste aprĂšs le paramĂštre rĂ©flĂ©chi :

Ensuite, la victime va recevoir la rĂ©ponse Ă  la requĂȘte lente et si entre-temps l'attaquant envoie une autre requĂȘte, la rĂ©ponse de la requĂȘte de contenu rĂ©flĂ©chi sera envoyĂ©e Ă  lui.

Désynchronisation de la réponse

Jusqu'Ă  prĂ©sent, nous avons appris comment abuser des attaques de HTTP Request Smuggling pour contrĂŽler la requĂȘte dont la rĂ©ponse un client va recevoir et comment vous pouvez ensuite voler la rĂ©ponse qui Ă©tait destinĂ©e Ă  la victime.

Mais il est encore possible de désynchroniser encore plus les réponses.

Il existe des requĂȘtes intĂ©ressantes comme la requĂȘte HEAD qui sont spĂ©cifiĂ©es pour ne pas avoir de contenu Ă  l'intĂ©rieur du corps des rĂ©ponses et qui devraient (doivent) contenir la Content-Length de la requĂȘte comme si c'Ă©tait une requĂȘte GET.

Par consĂ©quent, si un attaquant injecte une requĂȘte HEAD, comme dans ces images :

Alors, une fois que la bleue est rĂ©pondue Ă  l'attaquant, la prochaine requĂȘte de la victime va ĂȘtre introduite dans la file d'attente :

Ensuite, la victime va recevoir la rĂ©ponse de la requĂȘte HEAD, qui va contenir une Content-Length mais aucun contenu du tout. Par consĂ©quent, le proxy ne va pas envoyer cette rĂ©ponse Ă  la victime, mais va attendre un contenu, qui en rĂ©alitĂ© va ĂȘtre la rĂ©ponse Ă  la requĂȘte jaune (Ă©galement injectĂ©e par l'attaquant) :

Confusion de contenu

En suivant l'exemple prĂ©cĂ©dent, sachant que vous pouvez contrĂŽler le corps de la requĂȘte dont la rĂ©ponse va ĂȘtre reçue par la victime et qu'une rĂ©ponse HEAD **contient gĂ©nĂ©ralement dans ses en-tĂȘtes le Content-Type et le Content-Length, vous pouvez envoyer une requĂȘte comme la suivante pour provoquer un XSS chez la victime sans que la page soit vulnĂ©rable au XSS :

Poisoning de cache

En abusant de l'attaque de dĂ©synchronisation de rĂ©ponse commentĂ©e prĂ©cĂ©demment, si le cache stocke la rĂ©ponse Ă  la requĂȘte effectuĂ©e par la victime et que cette rĂ©ponse est une rĂ©ponse injectĂ©e provoquant un XSS, alors le cache est empoisonnĂ©.

RequĂȘte malveillante contenant la charge utile XSS :

RĂ©ponse malveillante Ă  la victime qui contient l'en-tĂȘte indiquant au cache de stocker la rĂ©ponse :

{% hint style="warning" %} Notez que dans ce cas, si la "victime" est l'attaquant, il peut maintenant effectuer un empoisonnement de cache sur des URL arbitraires car il peut contrĂŽler l'URL qui va ĂȘtre mise en cache avec la rĂ©ponse malveillante. {% endhint %}

Tromperie de cache web

Cette attaque est similaire à la précédente, mais au lieu d'injecter une charge utile dans le cache, l'attaquant va mettre en cache des informations de la victime à l'intérieur du cache :

Division de réponse

Le but de cette attaque est d'abuser à nouveau de la désynchronisation de la réponse afin de faire en sorte que le proxy envoie une réponse générée à 100 % par l'attaquant.

Pour y parvenir, l'attaquant doit trouver un point de terminaison de l'application web qui reflÚte certaines valeurs à l'intérieur de la réponse et connaßtre la longueur de contenu de la réponse HEAD.

Il enverra un exploit comme :

AprĂšs que la premiĂšre requĂȘte soit rĂ©solue et renvoyĂ©e Ă  l'attaquant, la requĂȘte de la victime est ajoutĂ©e dans la file d'attente :

La victime recevra comme rĂ©ponse la rĂ©ponse HEAD + le contenu de la rĂ©ponse de la deuxiĂšme requĂȘte (contenant une partie des donnĂ©es rĂ©flĂ©chies) :

Cependant, notez comment les données réfléchies avaient une taille selon la Content-Length de la réponse HEAD qui a généré une réponse HTTP valide dans la file d'attente des réponses.

Par consĂ©quent, la prochaine requĂȘte de la deuxiĂšme victime va recevoir comme rĂ©ponse quelque chose complĂštement fabriquĂ© par l'attaquant. Comme la rĂ©ponse est complĂštement fabriquĂ©e par l'attaquant, il peut Ă©galement faire en sorte que le proxy mette en cache la rĂ©ponse.

{% hint style="success" %} Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}