Spesiale HTTP-headers
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Wordlists & Gereedskap
- https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers
- https://github.com/rfc-st/humble
Hoofde om ligging te verander
Herskryf IP-bron:
X-Originating-IP: 127.0.0.1X-Forwarded-For: 127.0.0.1X-Forwarded: 127.0.0.1Forwarded-For: 127.0.0.1X-Forwarded-Host: 127.0.0.1X-Remote-IP: 127.0.0.1X-Remote-Addr: 127.0.0.1X-ProxyUser-Ip: 127.0.0.1X-Original-URL: 127.0.0.1Client-IP: 127.0.0.1X-Client-IP: 127.0.0.1X-Host: 127.0.0.1True-Client-IP: 127.0.0.1Cluster-Client-IP: 127.0.0.1Via: 1.0 fred, 1.1 127.0.0.1Connection: close, X-Forwarded-For(Check hop-by-hop headers)
Herskryf ligging:
X-Original-URL: /admin/consoleX-Rewrite-URL: /admin/console
Hop-by-Hop hoofde
’n hop-by-hop header is ’n header wat ontwerp is om verwerk en gebruik te word deur die proxy wat tans die versoek hanteer, in teenstelling met ’n end-to-end header.
Connection: close, X-Forwarded-For
HTTP Request Smuggling
Content-Length: 30Transfer-Encoding: chunked
HTTP Request Smuggling / HTTP Desync Attack
Die Expect-header
Dit is moontlik dat die kliënt die header Expect: 100-continue stuur en dat die bediener met HTTP/1.1 100 Continue kan antwoord om die kliënt toe te laat om voort te gaan om die liggaam van die versoek te stuur. Sommige proxies hou egter nie regtig van hierdie header nie.
Interessante resultate van Expect: 100-continue:
- Die stuur van ’n HEAD-versoek met ’n body — die bediener het nie geag dat HEAD-versoeke geen body het nie en hou die verbinding oop totdat dit verstryk.
- Ander bedieners het vreemde data teruggestuur: ewekansige data wat vanaf die sok gelees is in die response, geheime sleutels, of dit het selfs toegelaat om te voorkom dat die front-end headerwaardes verwyder.
- Dit het ook ’n
0.CLdesync veroorsaak omdat die backend met ’n 400-antwoord in plaas van ’n 100-antwoord geantwoord het, maar die proxy front-end was gereed om die liggaam van die aanvanklike versoek te stuur, so dit stuur dit en die backend beskou dit as ’n nuwe versoek. - Die stuur van ’n
Expect: y 100-continuevariasie het ook die0.CLdesync veroorsaak. - ’n Soortgelyke fout waar die backend met ’n 404 geantwoord het, het ’n
CL.0desync gegenereer omdat die kwaadwillige versoek ’nContent-Lengthaandui, sodat die backend die kwaadwillige versoek stuur plus dieContent-Lengthbytes van die volgende versoek (van ’n slagoffer). Dit desinkroniseer die tou omdat die backend die 404-antwoord stuur vir die kwaadwillige versoek plus die antwoord van die slagoffer-versoeke, maar die front-end het gedink slegs 1 versoek is gestuur, so die tweede antwoord word na ’n tweede slagoffer-versoek gestuur en die antwoord daarvan word na die volgende een gestuur…
Vir meer inligting oor HTTP Request Smuggling, sien:
HTTP Request Smuggling / HTTP Desync Attack
Cache-hoofde
Server Cache-hoofde:
X-Cachein die respons kan die waardemisshê wanneer die versoek nie in die kas was nie en die waardehitwanneer dit in die kas is- Vergelykbare gedrag in die header
Cf-Cache-Status Cache-Controldui aan of ’n bron gekas word en wanneer dit weer ververs sal word:Cache-Control: public, max-age=1800Varyword dikwels in die response gebruik om addisionele header(s) aan te dui wat as deel van die cache-sleutel beskou word, selfs al is hulle gewoonlik nie gesleutel nie.Agedefinieer die tyd in sekondes wat die objek al in die proxy-kas is.Server-Timing: cdn-cache; desc=HITdui ook aan dat ’n bron gekas is
Cache Poisoning and Cache Deception
Lokale cache-hoofde:
Clear-Site-Data: Header om aan te dui watter kas verwyder moet word:Clear-Site-Data: "cache", "cookies"Expires: Bevat die datum/tyd wanneer die respons moet verval:Expires: Wed, 21 Oct 2015 07:28:00 GMTPragma: no-cachedieselfde asCache-Control: no-cacheWarning: DieWarningalgemene HTTP-header bevat inligting oor moontlike probleme met die status van die boodskap. Meer as eenWarning-header kan in ’n response verskyn.Warning: 110 anderson/1.3.37 "Response is stale"
Voorwaardelike versoeke
- Versoeke wat hierdie header(s) gebruik:
If-Modified-SinceenIf-Unmodified-Sincesal slegs met data beantwoord word as die response headerLast-Modified’n ander tydstip bevat. - Voorwaardelike versoeke wat
If-MatchenIf-None-Matchgebruik, gebruik ’n Etag-waarde sodat die webbediener die inhoud van die response sal stuur as die data (Etag) verander het. DieEtagword uit die HTTP-response geneem. - Die Etag-waarde word gewoonlik bereken gebaseer op die inhoud van die response. Byvoorbeeld,
ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"dui aan dat dieEtagdie Sha1 is van 37 bytes.
Range-versoeke
Accept-Ranges: Dui aan of die bediener range-versoeke ondersteun, en indien wel in watter eenheid die range uitgedruk kan word.Accept-Ranges: <range-unit>Range: Dui die deel van ’n dokument aan wat die bediener behoort terug te stuur. Byvoorbeeld,Range:80-100sal die bytes 80 tot 100 van die oorspronklike respons terugstuur met ’n statuskode van 206 Partial Content. Onthou ook om dieAccept-Encodingheader uit die versoek te verwyder.- Dit kan nuttig wees om ’n response met ewekansige gereflekteerde JavaScript-kode te kry wat andersins ontsnap sou word. Maar om dit te misbruik moet jy hierdie headers in die versoek injekteer.
If-Range: Skep ’n voorwaardelike range-versoek wat slegs vervul word as die gegewe etag of datum ooreenstem met die afstandbron. Word gebruik om te verhoed dat twee ranges van ongematcheerde weergawes van die bron afgelaai word.Content-Range: Dui aan waar in ’n volledige liggaamsboodskap ’n gedeeltelike boodskap behoort te pas.
Inligting oor boodskapliggaam
Content-Length: Die grootte van die bron, in desimale aantal bytes.Content-Type: Dui die media-tipe van die bron aanContent-Encoding: Word gebruik om die kompressie-algoritme te spesifiseer.Content-Language: Beskryf die menslike taal(e) vir die beoogde gehoor, sodat dit ’n gebruiker toelaat om te onderskei volgens die gebruiker se eie voorkeurtaal.Content-Location: Dui ’n alternatiewe ligging vir die teruggestuurde data aan.
Vanuit ’n pentest-perspektief is hierdie inligting gewoonlik “nutloos”, maar as die bron deur ’n 401 of 403 beskerm word en jy kan ’n manier vind om hierdie info te kry, kan dit interessant wees.
Byvoorbeeld ’n kombinasie van Range en Etag in ’n HEAD-versoek kan die inhoud van die bladsy via HEAD-versoeke leak:
- ’n versoek met die header
Range: bytes=20-20en met ’n response watETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"bevat, is leaking dat die SHA1 van byte 20ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Yis
Bediener-inligting
Server: Apache/2.4.1 (Unix)X-Powered-By: PHP/5.3.3
Kontroles
Allow: Hierdie header word gebruik om die HTTP-metodes wat ’n bron kan hanteer te kommunikeer. Byvoorbeeld, dit kan gespesifiseer word asAllow: GET, POST, HEAD, wat aandui dat die bron hierdie metodes ondersteun.Expect: Word deur die kliënt gebruik om verwagtinge oor te dra wat die bediener moet nakom vir die versoek om suksesvol verwerk te word. ’n Algemene geval is die headerExpect: 100-continue, wat aandui dat die kliënt ’n groot datalading wil stuur. Die kliënt soek ’n100 (Continue)antwoord voordat dit voortgaan met die oordrag. Hierdie meganisme help om netwerkverkeer te optimaliseer deur op bedienerbevestiging te wag.
Aflaaie
- Die
Content-Dispositionheader in HTTP-responses bepaal of ’n lêer inline (binne die webblad) vertoon moet word of as ’n attachment behandel moet word (gedownload). Byvoorbeeld:
Content-Disposition: attachment; filename="filename.jpg"
Dit beteken dat die lêer met die naam “filename.jpg” bedoel is om afgelaai en gestoor te word.
Sekuriteitskoppe
Content Security Policy (CSP)
Content Security Policy (CSP) Bypass
Trusted Types
Deur Trusted Types via CSP af te dwing, kan toepassings teen DOM XSS-aanvalle beskerm word. Trusted Types verseker dat slegs spesifiek opgestelde objekte, wat aan gevestigde veiligheidsbeleid voldoen, in gevaarlike web API-oproepe gebruik kan word, en sodoende JavaScript-kode per verstek beveilig.
// 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
Hierdie koptekst voorkom MIME type sniffing, ’n praktyk wat tot XSS-kwesbaarhede kan lei. Dit verseker dat blaaiers die MIME-tipes soos deur die bediener gespesifiseer, respekteer.
X-Content-Type-Options: nosniff
X-Frame-Options
Om clickjacking te bekamp, beperk hierdie header hoe dokumente in <frame>, <iframe>, <embed>, of <object> tags ingebed kan word, en beveel aan dat alle dokumente hul ingebedingsmagte uitdruklik spesifiseer.
X-Frame-Options: DENY
Cross-Origin Resource Policy (CORP) en Cross-Origin Resource Sharing (CORS)
CORP is noodsaaklik om te spesifiseer watter hulpbronne deur webwerwe gelaai kan word, en om cross-site leaks te beperk. CORS laat, aan die ander kant, ’n meer buigsame meganisme toe vir cross-origin resource sharing, en verslap die same-origin policy onder sekere omstandighede.
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 en COOP is essensieel om cross-origin isolation te aktiveer, wat die risiko van Spectre-agtige aanvalle aansienlik verminder. Hulle beheer onderskeidelik die laai van cross-origin hulpbronne en die interaksie met cross-origin vensters.
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin-allow-popups
HTTP Strict Transport Security (HSTS)
Laastens is HSTS ’n sekuriteitsfunksie wat blaaiers dwing om slegs oor veilige HTTPS-verbindinge met bedieners te kommunikeer, en sodoende privaatheid en sekuriteit te verbeter.
Strict-Transport-Security: max-age=3153600
Permissions-Policy (voorheen Feature-Policy)
Permissions-Policy stel webontwikkelaars in staat om selektief sekere blaaierfunksies en APIs binne ’n dokument te aktiveer, deaktiveer of die gedrag daarvan aan te pas. Dit is die opvolger van die nou verouderde Feature-Policy header. Hierdie header help om die aanvalsoppervlakte te verminder deur toegang tot kragtige funksies wat misbruik kan word, te beperk.
Permissions-Policy: geolocation=(), camera=(), microphone=()
Algemene direktiewe:
| Direktief | Beskrywing |
|---|---|
accelerometer | Beheer toegang tot die accelerometer-sensor |
camera | Beheer toegang tot video-invoertoestelle (webcam) |
geolocation | Beheer toegang tot die Geolocation API |
gyroscope | Beheer toegang tot die gyroskoop-sensor |
magnetometer | Beheer toegang tot die magnetometer-sensor |
microphone | Beheer toegang tot audio-invoertoestelle |
payment | Beheer toegang tot die Payment Request API |
usb | Beheer toegang tot die WebUSB API |
fullscreen | Beheer toegang tot die Fullscreen API |
autoplay | Beheer of media outomaties kan afspeel |
clipboard-read | Beheer toegang om klembordinhoud te lees |
clipboard-write | Beheer toegang om na die klembord te skryf |
Sintaksiswaardes:
()- Deaktiveer die funksie heeltemal(self)- Laat die funksie slegs toe vir dieselfde oorsprong*- Laat die funksie toe vir alle oorspronge(self "https://example.com")- Laat toe vir dieselfde oorsprong en die gespesifiseerde domein
Voorbeeldkonfigurasies:
# Restrictive policy - disable most features
Permissions-Policy: geolocation=(), camera=(), microphone=(), payment=(), usb=()
# Allow camera only from same origin
Permissions-Policy: camera=(self)
# Allow geolocation for same origin and a trusted partner
Permissions-Policy: geolocation=(self "https://maps.example.com")
Vanuit ’n sekuriteitsoptiek kan ontbrekende of te toegeeflike Permissions-Policy headers aanvallers (bv. via XSS of ingesette iframes) toelaat om kragtige blaaierfunksies te misbruik. Beperk altyd funksies tot die minimum wat jou toepassing benodig.
Header Name Casing Bypass
HTTP/1.1 definieer header-veldname as ongevoelig vir hoofletters/kleinletters (RFC 9110 §5.1). Desondanks is dit baie algemeen om aangepaste middleware, sekuriteitsfilters, of besigheidslogika te vind wat die letterlike header-naam wat ontvang is vergelyk sonder eers die hooflettergebruik te normaliseer (bv. header.equals("CamelExecCommandExecutable")). As daardie kontroles gevoelig vir hooflettergebruik uitgevoer word, kan ’n aanvaller dit eenvoudig omseil deur dieselfde header met ’n ander hooflettergebruik te stuur.
Tipiese situasies waar hierdie fout voorkom:
- Aangepaste allow/deny-lyste wat probeer om “gevaarlike” interne headers te blokkeer voordat die versoek ’n sensitiewe komponent bereik.
- In-huis implementasies van reverse-proxy pseudo-headers (bv.
X-Forwarded-Forsanitisering). - Frameworks wat management / debug endpunte blootstel en staatmaak op header-name vir verifikasie of kommandoseleksie.
Misbruik van die bypass
- Identifiseer ’n header wat server-side gefilter of gevalideer word (byvoorbeeld deur bronkode, dokumentasie, of foutboodskappe te lees).
- Stuur die dieselfde header met ’n ander hooflettergebruik (gemengde letters of hoofletters). Omdat HTTP-stakke gewoonlik headers eers kanoniseer nadat gebruikerkode geloop het, kan die kwesbare kontrole oorgeslaan word.
- As die downstream-komponent headers op ’n hoofletterongevoelige manier hanteer (meeste doen), sal dit die waarde wat deur die aanvaller beheer word aanvaar.
Voorbeeld: Apache Camel exec RCE (CVE-2025-27636)
In kwesbare weergawes van Apache Camel probeer die Command Center routes onbetroubare versoeke blokkeer deur die headers CamelExecCommandExecutable en CamelExecCommandArgs te verwyder. Die vergelyking is met equals() gedoen, slegs die presiese naam in kleinletters is verwyder.
# 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: /"
Die headers bereik die exec-component ongesif, wat lei tot remote command execution met die voorregte van die Camel-proses.
Opsporing & Mitigering
- Normaliseer alle header-name na ’n enkele case (gewoonlik lowercase) voor die uitvoering van allow/deny comparisons.
- Weier verdagte duplikate: indien beide
Header:enHeAdEr:teenwoordig is, beskou dit as ’n anomalie. - Gebruik ’n positiewe allow-list wat na kanonisasie afgedwing word.
- Beskerm management-endpunte met authentisering en netwerksegmentering.
Verwysings
- CVE-2025-27636 – RCE in Apache Camel via header casing bypass (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
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
HackTricks

