Specjalne nagłówki HTTP

Reading time: 10 minutes

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Listy słów i narzędzia

Nagłówki do zmiany lokalizacji

Przepisz IP źródłowe:

  • 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

hop-by-hop headers

Smuggling żądań HTTP

  • Content-Length: 30
  • Transfer-Encoding: chunked

HTTP Request Smuggling / HTTP Desync Attack

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 zbuforowane, oraz wartość hit, gdy jest zbuforowane
  • 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 Poisoning and Cache Deception

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: 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"

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 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 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-unit>
  • 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ą.

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 ujawnić 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)

Content Security Policy (CSP) Bypass

Zaufane typy

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.

javascript
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
// Name and create a policy
const policy = trustedTypes.createPolicy('escapePolicy', {
createHTML: str => str.replace(/\</g, '&lt;').replace(/>/g, '&gt;');
});
}
javascript
// Assignment of raw strings is blocked, ensuring safety.
el.innerHTML = "some string" // Throws an exception.
const escaped = policy.createHTML("<img src=x onerror=alert(1)>")
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 <frame>, <iframe>, <embed> lub <object>, zalecając, aby wszystkie dokumenty wyraźnie określały swoje uprawnienia do osadzania.

X-Frame-Options: DENY

Cross-Origin Resource Policy (CORP) i Cross-Origin Resource Sharing (CORS)

CORP jest kluczowy dla określenia, które zasoby mogą być ładowane przez strony internetowe, łagodząc wycieki między witrynami. CORS z kolei pozwala na bardziej elastyczny mechanizm udostępniania zasobów między różnymi źródłami, łagodząc politykę tego samego pochodzenia w określonych warunkach.

Cross-Origin-Resource-Policy: same-origin
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true

Polityka Osadzania Międzydomenowego (COEP) i Polityka Otwierania Międzydomenowego (COOP)

COEP i COOP są niezbędne do umożliwienia izolacji międzydomenowej, znacznie zmniejszając ryzyko ataków podobnych do Spectre. Kontrolują one ładowanie zasobów międzydomenowych oraz interakcję z oknami międzydomenowymi, odpowiednio.

Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin-allow-popups

HTTP Strict Transport Security (HSTS)

Ostatnio, HSTS to funkcja zabezpieczeń, która zmusza przeglądarki do komunikacji z serwerami tylko za pośrednictwem bezpiecznych połączeń HTTPS, co zwiększa prywatność i bezpieczeństwo.

Strict-Transport-Security: max-age=3153600

Header Name Casing Bypass

HTTP/1.1 definiuje nazwy pól nagłówków jako niezależne od wielkości liter (RFC 9110 §5.1). Niemniej jednak, bardzo często można spotkać niestandardowe oprogramowanie pośredniczące, filtry bezpieczeństwa lub logikę biznesową, które porównują dosłowną nazwę nagłówka bez wcześniejszego normalizowania wielkości liter (np. header.equals("CamelExecCommandExecutable")). Jeśli te kontrole są przeprowadzane z uwzględnieniem wielkości liter, atakujący może je obejść, po prostu wysyłając ten sam nagłówek z inną kapitalizacją.

Typowe sytuacje, w których pojawia się ten błąd:

  • Niestandardowe listy dozwolonych/zakazanych, które próbują zablokować „niebezpieczne” wewnętrzne nagłówki, zanim żądanie dotrze do wrażliwego komponentu.
  • Wewnętrzne implementacje pseudo-nagłówków reverse-proxy (np. sanitizacja X-Forwarded-For).
  • Frameworki, które udostępniają punkty końcowe zarządzania / debugowania i polegają na nazwach nagłówków do uwierzytelniania lub wyboru poleceń.

Abusing the bypass

  1. Zidentyfikuj nagłówek, który jest filtrowany lub walidowany po stronie serwera (na przykład, poprzez przeglądanie kodu źródłowego, dokumentacji lub komunikatów o błędach).
  2. Wyślij ten sam nagłówek z inną wielkością liter (mieszana wielkość liter lub wielkie litery). Ponieważ stosy HTTP zazwyczaj kanonizują nagłówki tylko po wykonaniu kodu użytkownika, wrażliwa kontrola może zostać pominięta.
  3. Jeśli komponent downstream traktuje nagłówki w sposób niezależny od wielkości liter (większość tak robi), zaakceptuje wartość kontrolowaną przez atakującego.

Example: Apache Camel exec RCE (CVE-2025-27636)

W wrażliwych wersjach Apache Camel trasy Command Center próbują zablokować nieufne żądania, usuwając nagłówki CamelExecCommandExecutable i CamelExecCommandArgs. Porównanie było wykonywane za pomocą equals(), więc usunięto tylko dokładne nazwy małymi literami.

bash
# Bypass the filter by using mixed-case header names and execute `ls /` on the host
curl "http://<IP>/command-center" \
-H "CAmelExecCommandExecutable: ls" \
-H "CAmelExecCommandArgs: /"

Nagłówki docierają do komponentu exec bez filtracji, co skutkuje zdalnym wykonaniem poleceń z uprawnieniami procesu Camel.

Wykrywanie i łagodzenie

  • Normalizuj wszystkie nazwy nagłówków do jednej formy (zwykle małymi literami) przed przeprowadzeniem porównań zezwalających/odrzucających.
  • Odrzuć podejrzane duplikaty: jeśli obecne są zarówno Header:, jak i HeAdEr:, traktuj to jako anomalię.
  • Użyj pozytywnej listy dozwolonych elementów egzekwowanej po kanonizacji.
  • Chroń punkty końcowe zarządzania za pomocą uwierzytelniania i segmentacji sieci.

Odniesienia

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks