From ad06e0d8c1c91b8858764d57bbb4d4f37df0f9d1 Mon Sep 17 00:00:00 2001 From: Translator Date: Fri, 5 Sep 2025 11:18:52 +0000 Subject: [PATCH] Translated ['src/pentesting-web/http-request-smuggling/README.md', 'src/ --- .../pentesting-web/special-http-headers.md | 167 ++++---- .../http-request-smuggling/README.md | 373 ++++++++++-------- theme/sponsor.js | 3 +- 3 files changed, 307 insertions(+), 236 deletions(-) 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 4d0f9b11f..4c8226117 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -1,4 +1,4 @@ -# Spesiale HTTP koppe +# Spesiale HTTP-opskrifte {{#include ../../banners/hacktricks-training.md}} @@ -7,9 +7,9 @@ - [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) -## Koppe om Ligging te Verander +## Opskrifte om ligging te verander -Herschryf **IP bron**: +Herskryf **IP-bron**: - `X-Originating-IP: 127.0.0.1` - `X-Forwarded-For: 127.0.0.1` @@ -26,111 +26,132 @@ Herschryf **IP bron**: - `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` (Kontroleer hop-by-hop koppe) +- `Connection: close, X-Forwarded-For` (Kontroleer hop-by-hop-opskrifte) -Herschryf **ligging**: +Herskryf **ligging**: - `X-Original-URL: /admin/console` - `X-Rewrite-URL: /admin/console` -## Hop-by-Hop koppe +## Hop-by-Hop-opskrifte -'n Hop-by-hop kop is 'n kop wat ontwerp is om verwerk en verbruik te word deur die proxy wat tans die versoek hanteer, in teenstelling met 'n eind-tot-eind kop. +'n Hop-by-hop-opskrif is 'n opskrif wat ontwerp is om verwerk en verbruik te word deur die proxy wat tans die versoek hanteer, in teenstelling met 'n end-to-end-opskrif. - `Connection: close, X-Forwarded-For` + {{#ref}} ../../pentesting-web/abusing-hop-by-hop-headers.md {{#endref}} -## HTTP Versoek Smuggling +## HTTP Request Smuggling - `Content-Length: 30` - `Transfer-Encoding: chunked` + {{#ref}} ../../pentesting-web/http-request-smuggling/ {{#endref}} -## Cache Koppe +## Die Expect-opskrif -**Bediener Cache Koppe**: +Dit is moontlik vir die kliënt om die opskrif `Expect: 100-continue` te stuur, waarna 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 opskrif nie. + +Interessante gevolge van `Expect: 100-continue`: +- Om 'n HEAD-versoek met 'n liggaam te stuur het veroorsaak dat die bediener nie in ag geneem het dat HEAD-versoeke geen liggaam het nie, en die verbinding oopgehou het totdat dit verval het. +- Ander bedieners het vreemde data teruggestuur: lukrake data wat vanaf die sok gelees is in die respons, geheime sleutels, of dit het selfs toegelaat om te verhoed dat die front-end opskrifwaardes verwyder. +- Dit het ook 'n `0.CL` desync veroorsaak omdat die backend met 'n 400-respons in plaas van 'n 100-respons geantwoord het, maar die proxy front-end was gereed om die liggaam van die aanvanklike versoek te stuur; dit stuur dit en die backend neem dit as 'n nuwe versoek. +- Om 'n variasie soos `Expect: y 100-continue` te stuur het ook die `0.CL` desync veroorsaak. +- 'n Gelyksoortige fout waar die backend met 'n 404 geantwoord het, het 'n `CL.0` desync gegenereer omdat die kwaadwillige versoek 'n `Content-Length` aandui. Die backend stuur dus die kwaadwillige versoek plus die `Content-Length` bytes van die volgende versoek (van 'n slagoffer). Dit desinkroniseer die ry omdat die backend die 404-respons vir die kwaadwillige versoek stuur plus die respons van die slagoffer se versoek, maar die front-end dink dat slegs 1 versoek gestuur is; dus word die tweede respons aan 'n tweede slagoffer versoek gestuur en die respons van daardie een aan die volgende, ensovoorts... + +Vir meer inligting oor HTTP Request Smuggling, kyk: + +{{#ref}} +../../pentesting-web/http-request-smuggling/ +{{#endref}} + + +## Kas-opskrifte + +**Bediener-kas-opskrifte**: + +- **`X-Cache`** in die respons kan die waarde **`miss`** hê wanneer die versoek nie in die kas was nie en die waarde **`hit`** wanneer dit in die kas is +- Gelyke gedrag in die opskrif **`Cf-Cache-Status`** +- **`Cache-Control`** dui aan of 'n bron gekas word en vir hoe lank: `Cache-Control: public, max-age=1800` +- **`Vary`** word dikwels in die respons gebruik om bykomende opskrifte aan te dui wat as deel van die kas-sleutel beskou word, selfs al is hulle gewoonlik nie gekey nie. +- **`Age`** gee die tyd in sekondes aan wat die objek in die proxy-kas is. +- **`Server-Timing: cdn-cache; desc=HIT`** dui ook aan dat 'n bron gekas is -- **`X-Cache`** in die antwoord mag die waarde **`miss`** hê wanneer die versoek nie in die cache was nie en die waarde **`hit`** wanneer dit in die cache is -- Soortgelyke gedrag in die kop **`Cf-Cache-Status`** -- **`Cache-Control`** dui aan of 'n hulpbron in die cache gestoor word en wanneer die volgende keer die hulpbron weer in die cache gestoor sal word: `Cache-Control: public, max-age=1800` -- **`Vary`** word dikwels in die antwoord gebruik om **addisionele koppe** aan te dui wat as **deel van die cache sleutel** behandel word, selfs al is hulle normaalweg nie gesleutel nie. -- **`Age`** definieer die tyd in sekondes wat die objek in die proxy cache was. -- **`Server-Timing: cdn-cache; desc=HIT`** dui ook aan dat 'n hulpbron in die cache was {{#ref}} ../../pentesting-web/cache-deception/ {{#endref}} -**Plaaslike Cache koppe**: +**Plaaslike kas-opskrifte**: -- `Clear-Site-Data`: Kop om aan te dui watter cache verwyder moet word: `Clear-Site-Data: "cache", "cookies"` -- `Expires`: Bevat datum/tyd wanneer die antwoord moet verval: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` +- `Clear-Site-Data`: Opskrif om aan te dui watter kas verwyder moet word: `Clear-Site-Data: "cache", "cookies"` +- `Expires`: Bevat die datum/tyd wanneer die respons behoort te verval: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` - `Pragma: no-cache` dieselfde as `Cache-Control: no-cache` -- `Warning`: Die **`Warning`** algemene HTTP kop bevat inligting oor moontlike probleme met die status van die boodskap. Meer as een `Warning` kop mag in 'n antwoord verskyn. `Warning: 110 anderson/1.3.37 "Response is stale"` +- `Warning`: Die **`Warning`** algemene HTTP-opskrif bevat inligting oor moontlike probleme met die status van die boodskap. Meer as een `Warning`-opskrif kan in 'n respons verskyn. `Warning: 110 anderson/1.3.37 "Response is stale"` -## Voorwaardes +## Voorwaardelike versoeke -- Versoeke wat hierdie koppe gebruik: **`If-Modified-Since`** en **`If-Unmodified-Since`** sal met data geantwoord word slegs as die antwoord kop **`Last-Modified`** 'n ander tyd bevat. -- Voorwaardelike versoeke wat **`If-Match`** en **`If-None-Match`** gebruik, gebruik 'n Etag waarde sodat die webbediener die inhoud van die antwoord sal stuur as die data (Etag) verander het. Die `Etag` word geneem uit die HTTP antwoord. -- Die **Etag** waarde word gewoonlik **bereken** op grond van die **inhoud** van die antwoord. Byvoorbeeld, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` dui aan dat die `Etag` die **Sha1** van **37 bytes** is. +- Versoeke wat hierdie opskrifte gebruik: **`If-Modified-Since`** en **`If-Unmodified-Since`** word slegs met data beantwoord as die respons-opskrif **`Last-Modified`** 'n ander tyd bevat. +- Voorwaardelike versoeke wat **`If-Match`** en **`If-None-Match`** gebruik maak 'n ETag-waarde sodat die webbediener die inhoud van die respons sal stuur as die data (ETag) verander het. Die `Etag` word uit die HTTP-respons gehaal. +- Die **Etag**-waarde word gewoonlik bereken op grond van die **inhoud** van die respons. Byvoorbeeld, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` dui aan dat die `Etag` die **Sha1** van **37 bytes** is. -## Bereik versoeke +## Range-versoeke -- **`Accept-Ranges`**: Dui aan of die bediener bereik versoeke ondersteun, en indien wel in watter eenheid die bereik uitgedruk kan word. `Accept-Ranges: ` -- **`Range`**: Dui die deel van 'n dokument aan wat die bediener moet teruggee. Byvoorbeeld, `Range:80-100` sal die bytes 80 tot 100 van die oorspronklike antwoord met 'n statuskode van 206 Partial Content teruggee. Onthou ook om die `Accept-Encoding` kop uit die versoek te verwyder. -- Dit kan nuttig wees om 'n antwoord met arbitrêre weerspieëlde javascript kode te kry wat andersins ontsnap kon word. Maar om dit te misbruik, sal jy hierdie koppe in die versoek moet inspuit. -- **`If-Range`**: Skep 'n voorwaardelike bereik versoek wat slegs vervul word as die gegewe etag of datum met die afstandlike hulpbron ooreenstem. Gebruik om te voorkom dat twee bereik van onverenigbare weergawe van die hulpbron afgelaai word. -- **`Content-Range`**: Dui aan waar in 'n volle liggaam boodskap 'n gedeeltelike boodskap behoort. +- **`Accept-Ranges`**: Dui aan of die bediener range-versoeke ondersteun, en in watter eenheid die reeks uitgedruk kan word. `Accept-Ranges: ` +- **`Range`**: Dui die deel van 'n dokument aan wat die bediener moet teruggee. Byvoorbeeld, `Range:80-100` sal die bytes 80 tot 100 van die oorspronklike respons teruggee met 'n statuskode van 206 Partial Content. Onthou ook om die `Accept-Encoding`-opskrif uit die versoek te verwyder. +- Dit kan nuttig wees om 'n respons met ewekansige gereflekteerde javascript-kode te kry wat andersins ontsnap sou word. Om dit te misbruik sal jy egter hierdie opskrifte in die versoek moet injekteer. +- **`If-Range`**: Skep 'n voorwaardelike range-versoek wat slegs uitgevoer word as die gegewe etag of datum met die afgeleë hulpbron ooreenstem. Word gebruik om te voorkom dat twee reekse van 'n onverenigbare weergawe van die hulpbron afgelaai word. +- **`Content-Range`**: Dui aan waar 'n gedeeltelike boodskap in 'n volledige liggaam behoort te wees. -## Boodskap liggaam inligting +## Inligting oor boodskapliggaam - **`Content-Length`:** Die grootte van die hulpbron, in desimale getal van bytes. -- **`Content-Type`**: Dui die media tipe van die hulpbron aan -- **`Content-Encoding`**: Gebruik om die kompressie algoritme aan te dui. -- **`Content-Language`**: Beskryf die menslike taal/tale wat bedoel is vir die gehoor, sodat dit 'n gebruiker toelaat om te onderskei volgens die gebruiker se eie verkose taal. -- **`Content-Location`**: Dui 'n alternatiewe ligging aan vir die teruggegee data. +- **`Content-Type`**: Dui die media-tipe van die hulpbron aan +- **`Content-Encoding`**: Word gebruik om die kompressie-algoritme te spesifiseer. +- **`Content-Language`**: Beskryf die menslike taal(-tale) waarna dit bedoel is, sodat 'n gebruiker kan onderskei volgens hul eie voorkeurtaal. +- **`Content-Location`**: Dui 'n alternatiewe ligging vir die teruggegewe data aan. -Vanuit 'n pentest oogpunt is hierdie inligting gewoonlik "nutteloos", maar as die hulpbron **beskerm** word deur 'n 401 of 403 en jy 'n **manier** kan vind om hierdie **inligting** 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 lek: +Vanuit 'n pentest-perspektief is hierdie inligting gewoonlik nutteloos, maar as die bron **beskerm** is deur 'n 401 of 403 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 kop `Range: bytes=20-20` en met 'n antwoord wat `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` bevat, lek dat die SHA1 van die byte 20 `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` is +- A request with the header `Range: bytes=20-20` and with a response containing `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` is leaking that the SHA1 of the byte 20 is `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` -## Bediener Inligting +## Bediener-inligting - `Server: Apache/2.4.1 (Unix)` - `X-Powered-By: PHP/5.3.3` -## Beheer +## Kontroles -- **`Allow`**: Hierdie kop word gebruik om die HTTP metodes te kommunikeer wat 'n hulpbron kan hanteer. Byvoorbeeld, dit mag gespesifiseer word as `Allow: GET, POST, HEAD`, wat aandui dat die hulpbron hierdie metodes ondersteun. -- **`Expect`**: Gebruik deur die kliënt om verwagtinge oor te dra wat die bediener moet nakom vir die versoek om suksesvol verwerk te word. 'n Algemene gebruiksgeval behels die `Expect: 100-continue` kop, wat aandui dat die kliënt van plan is om 'n groot data payload te stuur. Die kliënt soek 'n `100 (Continue)` antwoord voordat hy met die oordrag voortgaan. Hierdie meganisme help om netwerkgebruik te optimaliseer deur op bedienerbevestiging te wag. +- **`Allow`**: Hierdie opskrif word gebruik om die HTTP-metodes te kommunikeer wat 'n hulpbron kan hanteer. Byvoorbeeld, dit kan gespesifiseer wees as `Allow: GET, POST, HEAD`, wat aandui dat die hulpbron hierdie metodes ondersteun. +- **`Expect`**: Word deur die kliënt gebruik om verwagtinge oor te dra wat die bediener moet vervul sodat die versoek suksesvol verwerk kan word. 'n Algemene gebruik is die `Expect: 100-continue`-opskrif, wat aandui dat die kliënt 'n groot datalading wil stuur en op 'n `100 (Continue)`-respons wag voordat dit voortgaan. Hierdie meganisme help om netwerkverbruik te optimaliseer deur op bedienerbevestiging te wag. ## Aflaaie -- Die **`Content-Disposition`** kop in HTTP antwoorde dui aan of 'n lêer **inline** (binne die webblad) vertoon moet word of as 'n **aanhangsel** (afgelaai) behandel moet word. Byvoorbeeld: +- Die **`Content-Disposition`** opskrif in HTTP-responses bepaal of 'n lêer inline (within the webpage) vertoon moet word of as 'n attachment (downloaded) behandel moet word. Byvoorbeeld: ``` Content-Disposition: attachment; filename="filename.jpg" ``` -Dit beteken die lêer met die naam "filename.jpg" is bedoel om afgelaai en gestoor te word. +Dit beteken dat die lêer met die naam "filename.jpg" bedoel is om afgelaai en gestoor te word. -## Sekuriteitskoppe +## Security Headers -### Inhoud Sekuriteitsbeleid (CSP) +### Content Security Policy (CSP) {{#ref}} ../../pentesting-web/content-security-policy-csp-bypass/ {{#endref}} -### **Vertroude Tipes** +### **Trusted Types** -Deur Vertroude Tipes deur CSP af te dwing, kan toepassings teen DOM XSS-aanvalle beskerm word. Vertroude Tipes verseker dat slegs spesifiek saamgestelde voorwerpe, wat voldoen aan gevestigde sekuriteitsbeleide, in gevaarlike web API-oproepe gebruik kan word, wat JavaScript-kode standaard beveilig. +Deur Trusted Types via CSP af te dwing, kan toepassings teen DOM XSS-aanvalle beskerm word. Trusted Types verseker dat slegs spesifiek vervaardigde objekte, wat voldoen aan gevestigde sekuriteitsbeleid, in gevaarlike web API-aanroepe gebruik kan word, en sodoende JavaScript-kode standaard beveilig. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { @@ -149,70 +170,70 @@ el.innerHTML = escaped // Results in safe assignment. ``` ### **X-Content-Type-Options** -Hierdie kop voorkom MIME tipe sniffing, 'n praktyk wat kan lei tot XSS kwesbaarhede. Dit verseker dat blaaiers die MIME tipes wat deur die bediener gespesifiseer is, respekteer. +Hierdie header verhoed MIME-tipe-snuffeling, 'n praktyk wat tot XSS-kwesbaarhede kan lei. Dit verseker dat blaaiers die deur die bediener gespesifiseerde MIME-tipes respekteer. ``` X-Content-Type-Options: nosniff ``` ### **X-Frame-Options** -Om clickjacking te bekamp, beperk hierdie kop wat dokumente in ``, `