# Specjalne nagłówki HTTP {{#include ../../banners/hacktricks-training.md}} ## Listy słów i narzędzia - [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 Przepisz **adres IP**: - `X-Originating-IP: 127.0.0.1` - `X-Forwarded-For: 127.0.0.1` - `X-Forwarded: 127.0.0.1` - `Forwarded-For: 127.0.0.1` - `X-Forwarded-Host: 127.0.0.1` - `X-Remote-IP: 127.0.0.1` - `X-Remote-Addr: 127.0.0.1` - `X-ProxyUser-Ip: 127.0.0.1` - `X-Original-URL: 127.0.0.1` - `Client-IP: 127.0.0.1` - `X-Client-IP: 127.0.0.1` - `X-Host: 127.0.0.1` - `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) Przepisz **lokację**: - `X-Original-URL: /admin/console` - `X-Rewrite-URL: /admin/console` ## Nagłówki hop-by-hop 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. - `Connection: close, X-Forwarded-For` {{#ref}} ../../pentesting-web/abusing-hop-by-hop-headers.md {{#endref}} ## Przemycanie żądań HTTP - `Content-Length: 30` - `Transfer-Encoding: chunked` {{#ref}} ../../pentesting-web/http-request-smuggling/ {{#endref}} ## Nagłówki pamięci podręcznej **Nagłówki pamięci podręcznej serwera**: - **`X-Cache`** w odpowiedzi może mieć wartość **`miss`** gdy żądanie nie zostało zapisane w pamięci podręcznej i wartość **`hit`** gdy jest zapisane - Podobne zachowanie w nagłówku **`Cf-Cache-Status`** - **`Cache-Control`** wskazuje, czy zasób jest zapisywany w pamięci podręcznej i kiedy będzie następny raz zapisywany: `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ł zapisany w pamięci podręcznej {{#ref}} ../../pentesting-web/cache-deception/ {{#endref}} **Nagłówki pamięci podręcznej lokalnej**: - `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` - `Pragma: no-cache` to samo co `Cache-Control: no-cache` - `Warning`: Ogólny nagłówek 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"` ## Warunki - Żą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 inny czas. - 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 zakresu - **`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ć zablokowany. 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ą. ## Informacje o ciele wiadomości - **`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. 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 ujawniać zawartość strony za pomocą żądań 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` ## Informacje o serwerze - `Server: Apache/2.4.1 (Unix)` - `X-Powered-By: PHP/5.3.3` ## Kontrole - **`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. ## Pobierania - 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: ``` Content-Disposition: attachment; filename="filename.jpg" ``` To oznacza, że plik o nazwie "filename.jpg" ma być pobrany i zapisany. ## Nagłówki zabezpieczeń ### Polityka bezpieczeństwa treści (CSP) {{#ref}} ../../pentesting-web/content-security-policy-csp-bypass/ {{#endref}} ### **Zaufane typy** Wymuszając Zaufane Typy za pomocą CSP, aplikacje mogą być chronione przed atakami XSS w DOM. 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. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { // Name and create a policy const policy = trustedTypes.createPolicy('escapePolicy', { createHTML: str => str.replace(/\/g, '>'); }); } ``` ```javascript // Assignment of raw strings is blocked, ensuring safety. el.innerHTML = "some string" // Throws an exception. const escaped = policy.createHTML("") 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. ``` 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 ``, `