mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 05:03:35 +00:00
159 lines
12 KiB
Markdown
159 lines
12 KiB
Markdown
# HTTP Response Smuggling / Desync
|
|
|
|
{% hint style="success" %}
|
|
Apprenez et pratiquez le hacking AWS :<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Apprenez et pratiquez le hacking GCP : <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop) !
|
|
* **Rejoignez le** đŹ [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-nous sur** **Twitter** đŠ [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Partagez des astuces de hacking en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépÎts github.
|
|
|
|
</details>
|
|
{% endhint %}
|
|
|
|
**La technique de ce post a été tirée de la vidéo :** [**https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s**](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**.
|
|
|
|
![](<../.gitbook/assets/image (633).png>)
|
|
|
|
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**).
|
|
|
|
![](<../.gitbook/assets/image (1020).png>)
|
|
|
|
![](<../.gitbook/assets/image (719).png>)
|
|
|
|
### 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 <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
|
|
|
|
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.
|
|
|
|
![](<../.gitbook/assets/image (1053).png>)
|
|
|
|
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** :
|
|
|
|
![](<../.gitbook/assets/image (794).png>)
|
|
|
|
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 :
|
|
|
|
![](<../.gitbook/assets/image (1107).png>)
|
|
|
|
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 :
|
|
|
|
![](<../.gitbook/assets/image (999).png>)
|
|
|
|
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) :
|
|
|
|
![](<../.gitbook/assets/image (735).png>)
|
|
|
|
### 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 :
|
|
|
|
![](<../.gitbook/assets/image (688).png>)
|
|
|
|
### 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 :
|
|
|
|
![](<../.gitbook/assets/image (614).png>)
|
|
|
|
RĂ©ponse malveillante Ă la victime qui contient l'en-tĂȘte indiquant au cache de stocker la rĂ©ponse :
|
|
|
|
![](<../.gitbook/assets/image (566).png>)
|
|
|
|
{% 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 :**
|
|
|
|
![](<../.gitbook/assets/image (991).png>)
|
|
|
|
### 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 :
|
|
|
|
![](<../.gitbook/assets/image (911).png>)
|
|
|
|
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** :
|
|
|
|
![](<../.gitbook/assets/image (737).png>)
|
|
|
|
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) :**
|
|
|
|
![](<../.gitbook/assets/image (356).png>)
|
|
|
|
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 :<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Apprenez et pratiquez le hacking GCP : <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop) !
|
|
* **Rejoignez le** đŹ [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-nous sur** **Twitter** đŠ [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Partagez des astuces de hacking en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépÎts github.
|
|
|
|
</details>
|
|
{% endhint %}
|