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

143 lines
10 KiB
Markdown
Raw Normal View History

2022-04-28 23:27:22 +00:00
# HTTP Response Smuggling / Desync
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 01:46:25 +00:00
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2023-12-31 01:25:17 +00:00
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
2024-02-11 01:46:25 +00:00
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
2022-04-28 16:01:33 +00:00
</details>
**Technika tej publikacji została zaczerpnięta z wideo:** [**https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s**](https://www.youtube.com/watch?v=suxDcYViwao\&t=1343s)
2024-02-06 03:10:38 +00:00
## Desynchronizacja Kolejki Żądań HTTP
2024-02-06 03:10:38 +00:00
Po pierwsze, ta technika **wykorzystuje podatność na Desynchronizację Żądań HTTP**, więc musisz wiedzieć, co to jest:
2021-11-05 20:59:42 +00:00
**Główną różnicą** między tą techniką a zwykłym Desynchronizacją Żądań HTTP jest to, że **zamiast atakować żądanie ofiary, dodając do niego prefiks**, będziemy **ujawniać lub modyfikować odpowiedź, którą otrzymuje ofiara**. Robimy to, wysyłając **2 kompletnie różne żądania, aby desynchronizować kolejkę odpowiedzi proxy**.
2021-11-05 20:59:42 +00:00
Ponieważ będziemy w stanie **desynchronizować kolejkę odpowiedzi**, odpowiedź z **legitymalnego żądania ofiary zostanie wysłana do atakującego**, lub przez **wstrzyknięcie kontrolowanej treści atakującego w odpowiedź do ofiary**.
2021-11-05 20:59:42 +00:00
### Desynchronizacja Potoku HTTP
2021-11-05 20:59:42 +00:00
HTTP/1.1 pozwala na **żądanie różnych zasobów bez konieczności oczekiwania na poprzednie**. Dlatego, jeśli jest **proxy** pośrodku, to zadaniem proxy jest **utrzymywanie zsynchronizowanego dopasowania wysłanych żądań do backendu i odpowiedzi z niego**.
2021-11-05 20:59:42 +00:00
Jednakże, istnieje problem desynchronizacji kolejki odpowiedzi. Jeśli atakujący wysyła atak Desynchronizacji Odpowiedzi HTTP i odpowiedzi na **początkowe żądanie i to podszyte są odpowiedziane natychmiast**, odpowiedź podszyta nie zostanie wstawiona do kolejki odpowiedzi ofiary, ale **po prostu zostanie odrzucona jako błąd**.
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (630).png>)
2021-11-05 20:59:42 +00:00
Dlatego konieczne jest, aby **podszyte żądanie zajęło więcej czasu na przetworzenie** w serwerze backendowym. Dlatego, gdy podszyte żądanie zostanie przetworzone, komunikacja z atakującym będzie zakończona.
2021-11-05 20:59:42 +00:00
Jeśli w tej konkretnej sytuacji **ofiara wysłała żądanie** i **podszyte żądanie zostanie odpowiedziane przed** prawidłowym żądaniem, **podszyta odpowiedź zostanie wysłana do ofiary**. W rezultacie atakujący będzie **kontrolować żądanie "wykonane" przez ofiarę**.
2021-11-05 20:59:42 +00:00
Co więcej, jeśli **atakujący wykonuje żądanie** i **legitymacyjna odpowiedź** na **żądanie ofiary jest odpowiedziana** **przed** żądaniem atakującego. **Odpowiedź do ofiary zostanie wysłana do atakującego**, **kradnąc** odpowiedź dla ofiary (która może zawierać na przykład nagłówek **Set-Cookie**).
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (1017).png>)
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (716).png>)
2021-11-05 20:59:42 +00:00
### Wielokrotne Zagnieżdżone Wstrzyknięcia
2021-11-05 20:59:42 +00:00
Inną **ciekawą różnicą** w porównaniu z zwykłym **Desynchronizacją Żądań HTTP** jest to, że w zwykłym ataku desynchronizacji żądań HTTP, **celem** jest **modyfikacja początku żądania ofiary**, aby wykonała ona nieoczekiwane działanie. W ataku **Desynchronizacji Odpowiedzi HTTP**, wysyłając pełne żądania, można **wstrzyknąć w jednym ładunku dziesiątki odpowiedzi**, które będą **desynchronizować dziesiątki użytkowników**, którzy będą **odbierać** **wstrzyknięte odpowiedzi**.
2021-11-05 20:59:42 +00:00
Oprócz możliwości **łatwiejszego rozprowadzania dziesiątek exploitów** wśród prawidłowych użytkowników, można to również wykorzystać do spowodowania **DoS** na serwerze.
2021-11-05 20:59:42 +00:00
### Organizacja Exploitu
2021-11-05 20:59:42 +00:00
Jak wyjaśniono wcześniej, aby wykorzystać tę technikę, konieczne jest, aby **pierwsza podszyta wiadomość** do serwera **zajmowała dużo czasu na przetworzenie**.
2021-11-05 20:59:42 +00:00
Ten **czasochłonny żądanie jest wystarczający**, jeśli chcemy **spróbować ukraść odpowiedź ofiary**. Ale jeśli chcesz przeprowadzić bardziej złożony exploit, to będzie to powszechna struktura dla exploitu.
2021-11-05 20:59:42 +00:00
Po pierwsze **początkowe** żądanie wykorzystujące **Desynchronizację Żądań HTTP**, następnie **czasochłonne żądanie**, a następnie **1 lub więcej żądań ładunkowych**, których odpowiedzi zostaną wysłane do ofiar.
2021-11-05 20:59:42 +00:00
## Wykorzystanie Desynchronizacji Kolejki Odpowiedzi HTTP
2021-11-05 20:59:42 +00:00
2024-02-11 01:46:25 +00:00
### Przechwytywanie żądań innych użytkowników <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
2021-11-05 20:59:42 +00:00
Podobnie jak w przypadku znanych ładunków Desynchronizacji Żądań HTTP, możesz **ukraść żądanie ofiary** z jedną ważną różnicą: W tym przypadku potrzebujesz, aby **wysłana treść została odzwierciedlona w odpowiedzi**, **nie jest wymagane trwałe przechowywanie**.
2021-11-05 20:59:42 +00:00
Najpierw atakujący wysyła ładunek zawierający **ostateczne żądanie POST z odzwierciedlonym parametrem** na końcu i dużym Content-Length
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (1050).png>)
2021-11-05 20:59:42 +00:00
Następnie, gdy **początkowe żądanie** (niebieskie) zostało **przetworzone** i **podczas** gdy **śpiące** jest przetwarzane (żółte), **następne żądanie, które przychodzi od ofiary**, zostanie **dodane do kolejki zaraz po odzwierciedlonym parametrze**:
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (791).png>)
2021-11-05 20:59:42 +00:00
Następnie **ofiara** otrzyma **odpowiedź na żądanie śpiące** i jeśli w międzyczasie **atakujący wysłał kolejne żądanie**, **odpowiedź z żądania odzwierciedlonej treści zostanie wysłana do niego**.
2021-11-05 20:59:42 +00:00
## Desynchronizacja Odpowiedzi
2021-11-05 20:59:42 +00:00
Do tej pory nauczyliśmy się wykorzystywać ataki Desynchronizacji Żądań HTTP do **kontroli** **żądania**, **na które** **odpowiedź** **otrzyma** **klient** i jak można wtedy **ukraść odpowiedź, która była przeznaczona dla ofiary**.
2021-11-05 20:59:42 +00:00
Ale nadal można **jeszcze bardziej desynchronizować odpowiedzi**.
2021-11-05 20:59:42 +00:00
Istnieją interesujące żądania, takie jak żądanie **HEAD**, które są określone jako nieposiadające **żadnej zawartości w ciele odpowiedzi** i które powinny (muszą) **zawierać Content-Length** żądania, jak **gdyby to było żądanie GET**.
2021-11-05 20:59:42 +00:00
Dlatego, jeśli atakujący **wstrzykuje** żądanie **HEAD**, jak na tych obrazach:
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (1104).png>)
2021-11-05 20:59:42 +00:00
Następnie, **gdy niebieskie zostanie odpowiedziane atakującemu**, następne żądanie ofiary zostanie wprowadzone do kolejki:
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (996).png>)
2021-11-05 20:59:42 +00:00
Następnie **ofiara** otrzyma **odpowiedź** z **żądania HEAD**, która **będzie zawierać Content-Length, ale w ogóle nie będzie zawierać treści**. Dlatego, proxy **nie wyśle tej odpowiedzi** do ofiary, ale będzie **czekać** na **jakąś treść**, która faktycznie będzie **odpowiedzią na żądanie żółte** (również wstrzyknięte przez atakującego):
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (732).png>)
### Zamieszanie w treści
2021-11-05 20:59:42 +00:00
W oparciu o poprzedni przykład, mając świadomość, że można **kontrolować treść** żądania, którego odpowiedź otrzyma ofiara, a **odpowiedź HEAD** zazwyczaj zawiera w nagłówkach **Content-Type i Content-Length**, można **wysłać żądanie takie jak to poniżej**, aby **wywołać XSS** u ofiary, nawet jeśli strona nie jest podatna na XSS:
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (685).png>)
2021-11-05 20:59:42 +00:00
### Zatrucie pamięci podręcznej
2021-11-05 20:59:42 +00:00
Wykorzystując wcześniej omawiany atak zamieszania treści odpowiedzi desynchronizacji, **jeśli pamięć podręczna przechowuje odpowiedź na żądanie wykonane przez ofiarę, a ta odpowiedź jest wstrzyknięta i powoduje XSS, to pamięć podręczna jest zatruta**.
2021-11-05 20:59:42 +00:00
Złośliwe żądanie zawierające ładunek XSS:
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (611).png>)
2021-11-05 20:59:42 +00:00
Złośliwa odpowiedź dla ofiary zawierająca nagłówek wskazujący pamięci podręcznej, aby przechowywała odpowiedź:
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (563).png>)
2021-11-05 20:59:42 +00:00
{% hint style="warning" %}
Zauważ, że w tym przypadku jeśli **"ofiara" jest atakującym**, może teraz przeprowadzić **zatrucie pamięci podręcznej w dowolnych adresach URL**, ponieważ może **kontrolować adres URL, który zostanie zapisany w pamięci podręcznej** za pomocą złośliwej odpowiedzi.
{% endhint %}
2021-11-05 20:59:42 +00:00
### Oszustwo pamięci podręcznej sieci Web
2021-11-05 20:59:42 +00:00
Ten atak jest podobny do poprzedniego, ale **zamiast wstrzykiwać ładunek do pamięci podręcznej, atakujący będzie przechowywał informacje ofiary w pamięci podręcznej:**
2021-11-05 20:59:42 +00:00
![](<../.gitbook/assets/image (988).png>)
2021-11-05 20:59:42 +00:00
### Podział odpowiedzi
2021-11-05 20:59:42 +00:00
Celem tego ataku jest ponowne wykorzystanie **desynchronizacji odpowiedzi** w celu **przekazania przez proxy odpowiedzi w 100% wygenerowanej przez atakującego**.
2022-04-28 16:01:33 +00:00
Aby osiągnąć ten cel, atakujący musi znaleźć punkt końcowy aplikacji internetowej, który **odzwierciedla pewne wartości w odpowiedzi** i **znać długość treści odpowiedzi HEAD**.
2022-04-28 16:01:33 +00:00
Wyśle **exploit** tak jak:
2022-04-28 16:01:33 +00:00
![](<../.gitbook/assets/image (908).png>)
2023-12-31 01:25:17 +00:00
Po rozwiązaniu i odesłaniu pierwszego żądania do atakującego, **żądanie ofiary zostaje dodane do kolejki**:
2022-04-28 16:01:33 +00:00
![](<../.gitbook/assets/image (734).png>)
Ofiara otrzyma jako odpowiedź **odpowiedź HEAD + treść odpowiedzi drugiego żądania (zawierająca część odzwierciedlonych danych):**
![](<../.gitbook/assets/image (353).png>)
Zauważ jednak, że **odzwierciedlone dane miały rozmiar zgodny z Content-Length** odpowiedzi **HEAD**, co **wygenerowało poprawną odpowiedź HTTP w kolejce odpowiedzi**.
Dlatego **następne żądanie drugiej ofiary** otrzyma jako **odpowiedź coś całkowicie spreparowanego przez atakującego**. Ponieważ odpowiedź jest całkowicie spreparowana przez atakującego, może on również **spowodować, że proxy przechowa odpowiedź**.