12 KiB
Posebni HTTP zaglavlja
{{#include ../../banners/hacktricks-training.md}}
Liste reči i alati
- https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers
- https://github.com/rfc-st/humble
Zaglavlja za promenu lokacije
Prepiši IP izvor:
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
(Proveri hop-by-hop zaglavlja)
Prepiši lokaciju:
X-Original-URL: /admin/console
X-Rewrite-URL: /admin/console
Hop-by-Hop zaglavlja
Hop-by-hop zaglavlje je zaglavlje koje je dizajnirano da bude obrađeno i konzumirano od strane proksija koji trenutno obrađuje zahtev, za razliku od zaglavlja end-to-end.
Connection: close, X-Forwarded-For
{{#ref}} ../../pentesting-web/abusing-hop-by-hop-headers.md {{#endref}}
HTTP Request Smuggling
Content-Length: 30
Transfer-Encoding: chunked
{{#ref}} ../../pentesting-web/http-request-smuggling/ {{#endref}}
Cache zaglavlja
Zaglavlja servera za keširanje:
X-Cache
u odgovoru može imati vrednostmiss
kada zahtev nije keširan i vrednosthit
kada je keširan- Slično ponašanje u zaglavlju
Cf-Cache-Status
Cache-Control
označava da li se resurs kešira i kada će biti sledeći put keširan:Cache-Control: public, max-age=1800
Vary
se često koristi u odgovoru da označi dodatna zaglavlja koja se tretiraju kao deo keš ključa čak i ako su obično neključevi.Age
definiše vreme u sekundama koliko je objekat bio u proksi kešu.Server-Timing: cdn-cache; desc=HIT
takođe označava da je resurs keširan
{{#ref}} ../../pentesting-web/cache-deception/ {{#endref}}
Lokalna keš zaglavlja:
Clear-Site-Data
: Zaglavlje koje označava keš koji treba ukloniti:Clear-Site-Data: "cache", "cookies"
Expires
: Sadrži datum/vreme kada odgovor treba da istekne:Expires: Wed, 21 Oct 2015 07:28:00 GMT
Pragma: no-cache
isto kaoCache-Control: no-cache
Warning
: Opšte HTTP zaglavljeWarning
sadrži informacije o mogućim problemima sa statusom poruke. Više od jednogWarning
zaglavlja može se pojaviti u odgovoru.Warning: 110 anderson/1.3.37 "Response is stale"
Uslovi
- Zahtevi koji koriste ova zaglavlja:
If-Modified-Since
iIf-Unmodified-Since
biće odgovoreni sa podacima samo ako zaglavlje odgovoraLast-Modified
sadrži drugačije vreme. - Uslovni zahtevi koristeći
If-Match
iIf-None-Match
koriste Etag vrednost tako da web server pošalje sadržaj odgovora ako su podaci (Etag) promenjeni.Etag
se uzima iz HTTP odgovora. - Vrednost Etag se obično izračunava na osnovu sadržaja odgovora. Na primer,
ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"
označava da jeEtag
Sha1 od 37 bajtova.
Zahtevi opsega
Accept-Ranges
: Označava da li server podržava zahteve opsega, i ako da, u kojoj jedinici se opseg može izraziti.Accept-Ranges: <range-unit>
Range
: Označava deo dokumenta koji server treba da vrati. Na primer,Range:80-100
će vratiti bajtove 80 do 100 originalnog odgovora sa status kodom 206 Partial Content. Takođe zapamti da ukloniš zaglavljeAccept-Encoding
iz zahteva.- Ovo bi moglo biti korisno za dobijanje odgovora sa proizvoljnim reflektovanim javascript kodom koji bi inače mogao biti eskapiran. Ali da bi se ovo zloupotrebilo, potrebno je injektovati ova zaglavlja u zahtev.
If-Range
: Kreira uslovni zahtev opsega koji se ispunjava samo ako dati etag ili datum odgovara udaljenom resursu. Koristi se da se spreči preuzimanje dva opsega iz nekompatibilnih verzija resursa.Content-Range
: Označava gde u punom telu poruke pripada delimična poruka.
Informacije o telu poruke
Content-Length
: Veličina resursa, u decimalnom broju bajtova.Content-Type
: Označava medijski tip resursaContent-Encoding
: Koristi se za specifikaciju algoritma kompresije.Content-Language
: Opisuje ljudski jezik(e) namenjene publici, tako da omogućava korisniku da razlikuje prema vlastitom preferiranom jeziku.Content-Location
: Označava alternativnu lokaciju za vraćene podatke.
Iz perspektive pentesta, ove informacije su obično "beskorisne", ali ako je resurs zaštićen sa 401 ili 403 i možeš pronaći neki način da dobiješ ove informacije, to bi moglo biti zanimljivo.
Na primer, kombinacija Range
i Etag
u HEAD zahtevu može otkriti sadržaj stranice putem HEAD zahteva:
- Zahtev sa zaglavljem
Range: bytes=20-20
i sa odgovorom koji sadržiETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"
otkriva da je SHA1 bajta 20ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y
Informacije o serveru
Server: Apache/2.4.1 (Unix)
X-Powered-By: PHP/5.3.3
Kontrole
Allow
: Ovo zaglavlje se koristi za komunikaciju HTTP metoda koje resurs može obraditi. Na primer, može biti specificirano kaoAllow: GET, POST, HEAD
, što označava da resurs podržava ove metode.Expect
: Koristi se od strane klijenta da prenese očekivanja koja server treba da ispuni kako bi zahtev bio uspešno obrađen. Uobičajena upotreba uključuje zaglavljeExpect: 100-continue
, koje signalizira da klijent namerava da pošalje veliki paket podataka. Klijent traži100 (Continue)
odgovor pre nego što nastavi sa prenosom. Ovaj mehanizam pomaže u optimizaciji korišćenja mreže čekajući potvrdu servera.
Preuzimanja
- Zaglavlje
Content-Disposition
u HTTP odgovorima usmerava da li bi datoteka trebala biti prikazana inline (unutar veb stranice) ili tretirana kao prilog (preuzeta). Na primer:
Content-Disposition: attachment; filename="filename.jpg"
Ovo znači da je datoteka pod nazivom "filename.jpg" namenjena preuzimanju i čuvanju.
Bezbednosni zaglavlja
Politika bezbednosti sadržaja (CSP)
{{#ref}} ../../pentesting-web/content-security-policy-csp-bypass/ {{#endref}}
Poverljivi tipovi
Sprovodeći Poverljive tipove putem CSP-a, aplikacije se mogu zaštititi od DOM XSS napada. Poverljivi tipovi osiguravaju da se samo posebno izrađeni objekti, u skladu sa uspostavljenim bezbednosnim politikama, mogu koristiti u opasnim pozivima web API-ja, čime se podrazumevano osigurava JavaScript kod.
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
// Name and create a policy
const policy = trustedTypes.createPolicy('escapePolicy', {
createHTML: str => str.replace(/\</g, '<').replace(/>/g, '>');
});
}
// 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
Ova zaglavlja sprečavaju MIME tip sniffing, praksu koja može dovesti do XSS ranjivosti. Osigurava da pregledači poštuju MIME tipove koje je odredio server.
X-Content-Type-Options: nosniff
X-Frame-Options
Da bi se borili protiv clickjacking-a, ovaj header ograničava kako se dokumenti mogu ugraditi u <frame>
, <iframe>
, <embed>
, ili <object>
tagove, preporučujući svim dokumentima da eksplicitno navedu svoja dopuštenja za ugradnju.
X-Frame-Options: DENY
Cross-Origin Resource Policy (CORP) and Cross-Origin Resource Sharing (CORS)
CORP je ključan za određivanje koje resurse mogu učitati veb sajtovi, smanjujući cross-site leak-ove. CORS, s druge strane, omogućava fleksibilniji mehanizam deljenja resursa između različitih izvora, opuštajući politiku istog izvora pod određenim uslovima.
Cross-Origin-Resource-Policy: same-origin
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
Cross-Origin Embedder Policy (COEP) and Cross-Origin Opener Policy (COOP)
COEP i COOP su ključni za omogućavanje izolacije između različitih izvora, značajno smanjujući rizik od napada sličnih Spectre-u. Oni kontrolišu učitavanje resursa iz drugih izvora i interakciju sa prozorima iz drugih izvora, redom.
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin-allow-popups
HTTP Strict Transport Security (HSTS)
Na kraju, HSTS je bezbednosna funkcija koja prisiljava pretraživače da komuniciraju sa serverima samo preko sigurnih HTTPS veza, čime se poboljšava privatnost i bezbednost.
Strict-Transport-Security: max-age=3153600
Header Name Casing Bypass
HTTP/1.1 definiše imena polja zaglavlja kao neosetljiva na velika i mala slova (RFC 9110 §5.1). Ipak, veoma je uobičajeno pronaći prilagođeni middleware, sigurnosne filtre ili poslovnu logiku koja upoređuje doslovno ime zaglavlja koje je primljeno bez prethodne normalizacije velikih i malih slova (npr. header.equals("CamelExecCommandExecutable")
). Ako se te provere vrše osetljivo na velika i mala slova, napadač može da ih zaobiđe jednostavno slanjem istog zaglavlja sa drugačijom kapitalizacijom.
Tipične situacije u kojima se ova greška pojavljuje:
- Prilagođene liste dozvoljenih/zakonitih koje pokušavaju da blokiraju "opasna" interna zaglavlja pre nego što zahtev stigne do osetljive komponente.
- Interna implementacija reverznih proxy pseudo-zaglavlja (npr.
X-Forwarded-For
sanitizacija). - Okviri koji izlažu upravljačke / debag endpointe i oslanjaju se na imena zaglavlja za autentifikaciju ili izbor komandi.
Abusing the bypass
- Identifikujte zaglavlje koje se filtrira ili validira na serverskoj strani (na primer, čitanjem izvornog koda, dokumentacije ili poruka o grešci).
- Pošaljite isto zaglavlje sa drugačijom kapitalizacijom (mešovita ili velika slova). Pošto HTTP stekovi obično kanonizuju zaglavlja samo nakon što je korisnički kod izvršen, ranjiva provera može biti preskočena.
- Ako donja komponenta tretira zaglavlja na način koji nije osetljiv na velika i mala slova (većina to radi), prihvatiće vrednost koju kontroliše napadač.
Example: Apache Camel exec
RCE (CVE-2025-27636)
U ranjivim verzijama Apache Camel Command Center rute pokušavaju da blokiraju nepouzdane zahteve uklanjanjem zaglavlja CamelExecCommandExecutable
i CamelExecCommandArgs
. Upoređivanje je izvršeno sa equals()
, tako da su samo tačno mala imena uklonjena.
# 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: /"
Zaglavlja dolaze do exec
komponente nefiltrirana, što rezultira daljinskim izvršavanjem komandi sa privilegijama Camel procesa.
Detekcija i ublažavanje
- Normalizujte sva imena zaglavlja na jedan oblik (obično mala slova) pre nego što izvršite poređenja dozvola/odbijanja.
- Odbacite sumnjive duplikate: ako su prisutni i
Header:
iHeAdEr:
, tretirajte to kao anomaliju. - Koristite pozitivnu dozvoljenu listu koja se primenjuje posle kanonizacije.
- Zaštitite upravljačke krajnje tačke autentifikacijom i mrežnom segmentacijom.
Reference
- CVE-2025-27636 – RCE u Apache Camel putem zaobilaženja velikih i malih slova zaglavlja (OffSec blog)
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
- https://web.dev/security-headers/
- https://web.dev/articles/security-headers
{{#include ../../banners/hacktricks-training.md}}