diff --git a/src/network-services-pentesting/pentesting-web/special-http-headers.md b/src/network-services-pentesting/pentesting-web/special-http-headers.md index 61f7b2d78..0dbd56b9c 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -1,15 +1,15 @@ -# Specjalne nagłówki HTTP +# Special HTTP headers {{#include ../../banners/hacktricks-training.md}} -## Listy słów i narzędzia +## Wordlists & Tools - [https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers](https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers) - [https://github.com/rfc-st/humble](https://github.com/rfc-st/humble) -## Nagłówki do zmiany lokalizacji +## Headers to Change Location -Przepisz **IP źródłowe**: +Zamiana źródła IP: - `X-Originating-IP: 127.0.0.1` - `X-Forwarded-For: 127.0.0.1` @@ -26,111 +26,132 @@ Przepisz **IP źródłowe**: - `True-Client-IP: 127.0.0.1` - `Cluster-Client-IP: 127.0.0.1` - `Via: 1.0 fred, 1.1 127.0.0.1` -- `Connection: close, X-Forwarded-For` (Sprawdź nagłówki hop-by-hop) +- `Connection: close, X-Forwarded-For` (Sprawdź hop-by-hop headers) -Przepisz **lokację**: +Zamiana lokalizacji: - `X-Original-URL: /admin/console` - `X-Rewrite-URL: /admin/console` -## Nagłówki hop-by-hop +## Hop-by-Hop headers -Nagłówek hop-by-hop to nagłówek, który jest zaprojektowany do przetwarzania i konsumowania przez proxy obsługujące żądanie, w przeciwieństwie do nagłówka end-to-end. +Hop-by-hop header to nagłówek, który ma być przetwarzany i konsumowany przez proxy aktualnie obsługujące żądanie, w przeciwieństwie do nagłówka end-to-end. - `Connection: close, X-Forwarded-For` + {{#ref}} ../../pentesting-web/abusing-hop-by-hop-headers.md {{#endref}} -## Smuggling żądań HTTP +## HTTP Request Smuggling - `Content-Length: 30` - `Transfer-Encoding: chunked` + {{#ref}} ../../pentesting-web/http-request-smuggling/ {{#endref}} -## Nagłówki pamięci podręcznej +## The Expect header -**Nagłówki pamięci podręcznej serwera**: +Możliwe jest, że klient wyśle nagłówek `Expect: 100-continue`, a serwer odpowie `HTTP/1.1 100 Continue`, co zezwala klientowi na kontynuowanie wysyłania body żądania. Jednak niektóre proxy nie lubią tego nagłówka. -- **`X-Cache`** w odpowiedzi może mieć wartość **`miss`**, gdy żądanie nie zostało zbuforowane, oraz wartość **`hit`**, gdy jest zbuforowane +Ciekawe skutki użycia `Expect: 100-continue`: +- Wysłanie żądania HEAD z body — serwer nie wziął pod uwagę, że żądania HEAD nie mają body i utrzymuje połączenie otwarte aż do timeoutu. +- Inne serwery wysyłały dziwne dane: losowe dane przeczytane z gniazda w odpowiedzi, secret keys albo nawet pozwalało to zapobiec usuwaniu wartości nagłówków przez front-end. +- Powodowało to także desync `0.CL`, gdy backend odpowiedział 400 zamiast 100, ale proxy front-end był przygotowany do wysłania body oryginalnego żądania, więc je wysłał i backend uznał to za nowe żądanie. +- Wariant `Expect: y 100-continue` także spowodował desync `0.CL`. +- Podobny błąd, gdzie backend odpowiedział 404, wygenerował desync `CL.0`, ponieważ złośliwe żądanie wskazywało `Content-Length`, więc backend wysłał złośliwe żądanie + `Content-Length` bajtów następnego żądania (ofiary). To rozregulowało kolejkę, bo backend wysyła odpowiedź 404 dla złośliwego żądania + odpowiedź dla żądań ofiary, ale front-end sądził, że wysłano tylko 1 żądanie, więc druga odpowiedź powędrowała do drugiego żądania ofiary, a odpowiedź tamtej do kolejnego... + +Więcej informacji o HTTP Request Smuggling znajdziesz: + +{{#ref}} +../../pentesting-web/http-request-smuggling/ +{{#endref}} + + +## Cache Headers + +**Server Cache Headers**: + +- **`X-Cache`** w odpowiedzi może mieć wartość **`miss`** gdy żądanie nie było cache'owane i wartość **`hit`** gdy zostało zcache'owane - Podobne zachowanie w nagłówku **`Cf-Cache-Status`** -- **`Cache-Control`** wskazuje, czy zasób jest buforowany i kiedy będzie następny raz buforowany: `Cache-Control: public, max-age=1800` -- **`Vary`** jest często używane w odpowiedzi do **wskazania dodatkowych nagłówków**, które są traktowane jako **część klucza pamięci podręcznej**, nawet jeśli normalnie nie są kluczowane. -- **`Age`** definiuje czas w sekundach, przez jaki obiekt był w pamięci podręcznej proxy. -- **`Server-Timing: cdn-cache; desc=HIT`** również wskazuje, że zasób był buforowany +- **`Cache-Control`** wskazuje, czy zasób jest cache'owany i kiedy nastąpi kolejna ważność: `Cache-Control: public, max-age=1800` +- **`Vary`** często używany jest w odpowiedzi do **wskazania dodatkowych nagłówków**, które są traktowane jako **część klucza cache** nawet jeśli normalnie nie są uwzględniane. +- **`Age`** definiuje czas w sekundach, przez jaki obiekt przebywał w cache proxy. +- **`Server-Timing: cdn-cache; desc=HIT`** także wskazuje, że zasób był zcache'owany + {{#ref}} ../../pentesting-web/cache-deception/ {{#endref}} -**Nagłówki pamięci podręcznej lokalnej**: +**Local Cache headers**: -- `Clear-Site-Data`: Nagłówek wskazujący, które dane w pamięci podręcznej powinny zostać usunięte: `Clear-Site-Data: "cache", "cookies"` -- `Expires`: Zawiera datę/godzinę, kiedy odpowiedź powinna wygasnąć: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` +- `Clear-Site-Data`: Nagłówek wskazujący, które cache'y powinny zostać usunięte: `Clear-Site-Data: "cache", "cookies"` +- `Expires`: Zawiera datę/czas wygaśnięcia odpowiedzi: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` - `Pragma: no-cache` to samo co `Cache-Control: no-cache` -- `Warning`: Nagłówek ogólny HTTP **`Warning`** zawiera informacje o możliwych problemach ze statusem wiadomości. W odpowiedzi może pojawić się więcej niż jeden nagłówek `Warning`. `Warning: 110 anderson/1.3.37 "Response is stale"` +- `Warning`: Ogólny nagłówek HTTP zawierający informacje o możliwych problemach ze statusem wiadomości. Może wystąpić więcej niż jeden nagłówek `Warning` w odpowiedzi. `Warning: 110 anderson/1.3.37 "Response is stale"` -## Warunki +## Conditionals -- Żądania używające tych nagłówków: **`If-Modified-Since`** i **`If-Unmodified-Since`** będą odpowiadać danymi tylko wtedy, gdy nagłówek odpowiedzi **`Last-Modified`** zawiera inną datę. -- Warunkowe żądania używające **`If-Match`** i **`If-None-Match`** wykorzystują wartość Etag, aby serwer WWW wysłał zawartość odpowiedzi, jeśli dane (Etag) się zmieniły. `Etag` jest pobierany z odpowiedzi HTTP. -- Wartość **Etag** jest zazwyczaj **obliczana na podstawie** **zawartości** odpowiedzi. Na przykład, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` wskazuje, że `Etag` to **Sha1** **37 bajtów**. +- Żądania używające nagłówków: **`If-Modified-Since`** i **`If-Unmodified-Since`** zostaną zwrócone z danymi tylko jeśli nagłówek odpowiedzi **`Last-Modified`** zawiera inną datę. +- Warunkowe żądania używające **`If-Match`** i **`If-None-Match`** używają wartości Etag, więc serwer wyśle treść odpowiedzi jeśli dane (Etag) uległy zmianie. `Etag` jest pobierany z odpowiedzi HTTP. +- Wartość **Etag** jest zazwyczaj **obliczana** na podstawie **zawartości** odpowiedzi. Na przykład, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` wskazuje, że `Etag` jest **Sha1** z **37 bajtów**. -## Żądania zakresu +## Range requests -- **`Accept-Ranges`**: Wskazuje, czy serwer obsługuje żądania zakresu, a jeśli tak, w jakiej jednostce zakres może być wyrażony. `Accept-Ranges: ` -- **`Range`**: Wskazuje część dokumentu, którą serwer powinien zwrócić. Na przykład, `Range:80-100` zwróci bajty od 80 do 100 oryginalnej odpowiedzi z kodem statusu 206 Partial Content. Pamiętaj również, aby usunąć nagłówek `Accept-Encoding` z żądania. -- Może to być przydatne do uzyskania odpowiedzi z dowolnym odzwierciedlonym kodem JavaScript, który w przeciwnym razie mógłby być zescapowany. Aby to wykorzystać, musisz wstrzyknąć te nagłówki w żądaniu. -- **`If-Range`**: Tworzy warunkowe żądanie zakresu, które jest spełnione tylko wtedy, gdy podany etag lub data pasuje do zdalnego zasobu. Używane do zapobiegania pobieraniu dwóch zakresów z niekompatybilnych wersji zasobu. -- **`Content-Range`**: Wskazuje, gdzie w pełnej wiadomości ciała należy umieścić wiadomość częściową. +- **`Accept-Ranges`**: Wskazuje czy serwer obsługuje range requests, i jeśli tak, w jakiej jednostce zakres może być wyrażony. `Accept-Ranges: ` +- **`Range`**: Wskazuje część dokumentu, którą serwer powinien zwrócić. Na przykład, `Range:80-100` zwróci bajty 80 do 100 oryginalnej odpowiedzi ze statusem 206 Partial Content. Pamiętaj też, aby usunąć nagłówek `Accept-Encoding` z żądania. +- To może być użyteczne, by otrzymać odpowiedź z arbitralnym reflektowanym kodem javascript, który normalnie byłby escapowany. Aby to nadużyć musiałbyś wstrzyknąć te nagłówki w żądaniu. +- **`If-Range`**: Tworzy warunkowe żądanie zakresu, które zostanie zrealizowane tylko jeśli podany etag lub data pasuje do zdalnego zasobu. Używane, by zapobiec pobieraniu dwóch zakresów z niekompatybilnych wersji zasobu. +- **`Content-Range`**: Wskazuje, gdzie w pełnym ciele wiadomości mieści się fragmentowa wiadomość. -## Informacje o ciele wiadomości +## Message body information - **`Content-Length`:** Rozmiar zasobu, w dziesiętnych bajtach. - **`Content-Type`**: Wskazuje typ mediów zasobu -- **`Content-Encoding`**: Używane do określenia algorytmu kompresji. -- **`Content-Language`**: Opisuje język(languages) przeznaczony dla odbiorców, aby umożliwić użytkownikowi różnicowanie według własnych preferencji językowych. -- **`Content-Location`**: Wskazuje alternatywną lokalizację dla zwróconych danych. +- **`Content-Encoding`**: Używany do określenia algorytmu kompresji. +- **`Content-Language`**: Opisuje język(i) przeznaczenia dla odbiorców, pozwalając użytkownikowi rozróżnić zgodnie z preferencjami językowymi. +- **`Content-Location`**: Wskazuje alternatywną lokalizację dla zwracanych danych. -Z punktu widzenia pentestów te informacje są zazwyczaj "bezużyteczne", ale jeśli zasób jest **chroniony** przez 401 lub 403 i możesz znaleźć jakiś **sposób** na **uzyskanie** tych **informacji**, może to być **interesujące.**\ -Na przykład kombinacja **`Range`** i **`Etag`** w żądaniu HEAD może ujawnić zawartość strony za pomocą żądań HEAD: +Z punktu widzenia pentest ten zestaw informacji zwykle jest "bezużyteczny", ale jeśli zasób jest **chroniony** przez 401 lub 403 i potrafisz znaleźć jakiś **sposób** aby **uzyskać** te **info**, to może być to **interesujące.**\ +Na przykład kombinacja **`Range`** i **`Etag`** w żądaniu HEAD może is leaking zawartość strony przez żądania HEAD: -- Żądanie z nagłówkiem `Range: bytes=20-20` i odpowiedzią zawierającą `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` ujawnia, że SHA1 bajtu 20 to `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` +- Żądanie z nagłówkiem `Range: bytes=20-20` i z odpowiedzią zawierającą `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` is leaking, że SHA1 bajtu 20 to `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` -## Informacje o serwerze +## Server Info - `Server: Apache/2.4.1 (Unix)` - `X-Powered-By: PHP/5.3.3` -## Kontrole +## Controls -- **`Allow`**: Ten nagłówek jest używany do komunikowania metod HTTP, które zasób może obsługiwać. Na przykład może być określony jako `Allow: GET, POST, HEAD`, co wskazuje, że zasób obsługuje te metody. -- **`Expect`**: Wykorzystywany przez klienta do przekazywania oczekiwań, które serwer musi spełnić, aby żądanie mogło zostać pomyślnie przetworzone. Typowym przypadkiem użycia jest nagłówek `Expect: 100-continue`, który sygnalizuje, że klient zamierza wysłać dużą ilość danych. Klient oczekuje na odpowiedź `100 (Continue)` przed kontynuowaniem transmisji. Mechanizm ten pomaga w optymalizacji wykorzystania sieci poprzez oczekiwanie na potwierdzenie serwera. +- **`Allow`**: Ten nagłówek służy do komunikowania metod HTTP, które zasób może obsłużyć. Na przykład może być określony jako `Allow: GET, POST, HEAD`, wskazując, że zasób obsługuje te metody. +- **`Expect`**: Używany przez klienta do przekazania oczekiwań, które serwer musi spełnić, aby żądanie zostało poprawnie przetworzone. Powszechnym zastosowaniem jest nagłówek `Expect: 100-continue`, który sygnalizuje, że klient zamierza wysłać dużą ilość danych. Klient oczekuje odpowiedzi `100 (Continue)` przed kontynuacją transmisji. Mechanizm ten pomaga optymalizować wykorzystanie sieci przez oczekiwanie na potwierdzenie serwera. -## Pobierania +## Downloads -- Nagłówek **`Content-Disposition`** w odpowiedziach HTTP wskazuje, czy plik powinien być wyświetlany **inline** (w obrębie strony) czy traktowany jako **załącznik** (pobierany). Na przykład: +- Nagłówek **`Content-Disposition`** w odpowiedziach HTTP określa, czy plik powinien być wyświetlony **inline** (w obrębie strony) czy traktowany jako **attachment** (do pobrania). Na przykład: ``` Content-Disposition: attachment; filename="filename.jpg" ``` -To oznacza, że plik o nazwie "filename.jpg" ma być pobrany i zapisany. +To oznacza, że plik o nazwie "filename.jpg" ma zostać pobrany i zapisany. -## Nagłówki zabezpieczeń +## Nagłówki bezpieczeństwa -### Polityka bezpieczeństwa treści (CSP) +### Content Security Policy (CSP) {{#ref}} ../../pentesting-web/content-security-policy-csp-bypass/ {{#endref}} -### **Zaufane typy** +### **Trusted Types** -Wymuszając Zaufane Typy za pomocą CSP, aplikacje mogą być chronione przed atakami DOM XSS. Zaufane Typy zapewniają, że tylko specjalnie przygotowane obiekty, zgodne z ustalonymi politykami bezpieczeństwa, mogą być używane w niebezpiecznych wywołaniach API webowych, co zabezpiecza kod JavaScript domyślnie. +Wymuszając Trusted Types za pomocą CSP, aplikacje mogą być chronione przed atakami DOM XSS. Trusted Types zapewniają, że tylko specjalnie przygotowane obiekty, zgodne z ustalonymi zasadami bezpieczeństwa, mogą być używane w niebezpiecznych web API calls, co w efekcie domyślnie zabezpiecza kod JavaScript. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { @@ -149,74 +170,75 @@ el.innerHTML = escaped // Results in safe assignment. ``` ### **X-Content-Type-Options** -Ten nagłówek zapobiega sniffingowi typu MIME, praktyce, która może prowadzić do podatności XSS. Zapewnia, że przeglądarki respektują typy MIME określone przez serwer. +Ten nagłówek zapobiega MIME type sniffing, praktyce, która może prowadzić do podatności XSS. Zapewnia, że przeglądarki respektują typy MIME określone przez serwer. ``` X-Content-Type-Options: nosniff ``` ### **X-Frame-Options** -Aby zwalczyć clickjacking, ten nagłówek ogranicza sposób, w jaki dokumenty mogą być osadzane w tagach ``, `