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 9d61a9cf1..82feaed31 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -1,8 +1,8 @@ -# Posebni HTTP zaglavlja +# Posebna HTTP zaglavlja {{#include ../../banners/hacktricks-training.md}} -## Liste reči i alati +## Rečnici i alati - [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) @@ -35,10 +35,11 @@ Prepiši **lokaciju**: ## 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 od kraja do kraja. +Hop-by-hop zaglavlje je zaglavlje koje treba da obradi i potroši proxy koji trenutno obrađuje zahtev, za razliku od end-to-end zaglavlja. - `Connection: close, X-Forwarded-For` + {{#ref}} ../../pentesting-web/abusing-hop-by-hop-headers.md {{#endref}} @@ -48,58 +49,78 @@ Hop-by-hop zaglavlje je zaglavlje koje je dizajnirano da bude obrađeno i konzum - `Content-Length: 30` - `Transfer-Encoding: chunked` + {{#ref}} ../../pentesting-web/http-request-smuggling/ {{#endref}} +## Zaglavlje Expect + +Moguće je da klijent pošalje zaglavlje `Expect: 100-continue`, a server odgovori sa `HTTP/1.1 100 Continue` da bi dozvolio klijentu da nastavi sa slanjem tela zahteva. Međutim, neki proxyji ne vole ovo zaglavlje. + +Zanimljivi rezultati `Expect: 100-continue`: +- Slanje HEAD zahteva sa telom — server nije uzeo u obzir da HEAD zahtevi obično nemaju telo i drži konekciju otvorenom dok ne istekne timeout. +- Neki serveri su slali čudne podatke: nasumične podatke pročitane sa soketa u odgovoru, tajne ključeve ili čak omogućili da front-end ne ukloni vrednosti zaglavlja. +- Takođe je izazvalo `0.CL` desync kada je backend odgovorio sa 400 umesto sa 100, ali frontend proxy je bio spreman da pošalje telo inicijalnog zahteva, pa ga je poslao, a backend ga je tretirao kao novi zahtev. +- Slanje varijacije poput `Expect: y 100-continue` takođe je izazvalo `0.CL` desync. +- Slična greška gde je backend odgovorio sa 404 je generisala `CL.0` desync jer zlonamerni zahtev navodi `Content-Length`, pa backend šalje zlonamerni zahtev + `Content-Length` bajtova sledećeg zahteva (žrtve). Ovo desinhronizuje red: backend šalje 404 odgovor za zlonamerni zahtev + odgovor žrtvinog zahteva, dok frontend misli da je poslat samo 1 zahtev, pa drugi odgovor pošalje drugom žrtvinom zahtevu i tako dalje... + +Za više informacija o HTTP Request Smuggling pogledajte: + +{{#ref}} +../../pentesting-web/http-request-smuggling/ +{{#endref}} + + ## Cache zaglavlja -**Zaglavlja servera za keširanje**: +**Server cache zaglavlja**: + +- **`X-Cache`** u odgovoru može imati vrednost **`miss`** kada zahtev nije bio keširan i vrednost **`hit`** kada jeste keširan +- Sličan ponašanje ima zaglavlje **`Cf-Cache-Status`** +- **`Cache-Control`** pokazuje da li se resurs kešira i kada će sledeći put resurs isteći: `Cache-Control: public, max-age=1800` +- **`Vary`** se često koristi u odgovoru da **naznači dodatna zaglavlja** koja se tretiraju kao **deo ključa keša** čak i ako se obično ne koriste za keširanje. +- **`Age`** definiše koliko je objekat bio u proxy kešu, u sekundama. +- **`Server-Timing: cdn-cache; desc=HIT`** takođe ukazuje da je resurs bio keširan -- **`X-Cache`** u odgovoru može imati vrednost **`miss`** kada zahtev nije keširan i vrednost **`hit`** kada je keširan -- Slična ponašanja 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**: +**Lokalna cache 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` +- `Clear-Site-Data`: Zaglavlje koje ukazuje koji keš treba obrisati: `Clear-Site-Data: "cache", "cookies"` +- `Expires`: Sadrži datum/vreme kada odgovor treba isteći: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` - `Pragma: no-cache` isto kao `Cache-Control: no-cache` -- `Warning`: Opšte HTTP zaglavlje **`Warning`** sadrži informacije o mogućim problemima sa statusom poruke. Više od jednog `Warning` zaglavlja može se pojaviti u odgovoru. `Warning: 110 anderson/1.3.37 "Response is stale"` +- `Warning`: Generalno HTTP zaglavlje koje sadrži informacije o mogućim problemima sa statusom poruke. Više od jednog `Warning` zaglavlja može se pojaviti u odgovoru. `Warning: 110 anderson/1.3.37 "Response is stale"` -## Uslovi +## Uslovni zahtevi -- Zahtevi koji koriste ova zaglavlja: **`If-Modified-Since`** i **`If-Unmodified-Since`** će dobiti odgovor sa podacima samo ako zaglavlje odgovora **`Last-Modified`** sadrži drugačije vreme. -- Uslovni zahtevi koristeći **`If-Match`** i **`If-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 **računa** na osnovu **sadržaja** odgovora. Na primer, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` označava da je `Etag` **Sha1** od **37 bajtova**. +- Zahtevi koji koriste ova zaglavlja: **`If-Modified-Since`** i **`If-Unmodified-Since`** biće odgovoreni podacima samo ako odgovor sadrži drugačije vreme u zaglavlju **`Last-Modified`**. +- Uslovni zahtevi koristeći **`If-Match`** i **`If-None-Match`** koriste vrednost Etag, tako da web server pošalje sadržaj odgovora samo ako se podaci (Etag) promene. `Etag` se uzima iz HTTP odgovora. +- Vrednost **Etag** se obično **izračunava** na osnovu **sadržaja** odgovora. Na primer, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` ukazuje da je `Etag` **Sha1** od **37 bajtova**. -## Zahtevi opsega +## Range zahtevi -- **`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`**: 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š `Accept-Encoding` zaglavlje 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. +- **`Accept-Ranges`**: Ukazuje da li server podržava range zahteve, i u kojoj jedinici se opseg može izraziti. `Accept-Ranges: ` +- **`Range`**: Ukazuje koji deo dokumenta 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, zapamtite da uklonite `Accept-Encoding` zaglavlje iz zahteva. +- Ovo može biti korisno za dobijanje odgovora sa proizvoljnim reflektovanim javascript kodom koji bi inače bio escapovan. Ali da biste to zloupotrebili, potreban je način da ubacite ova zaglavlja u zahtev. +- **`If-Range`**: Pravi uslovni range zahtev koji se izvršava samo ako zadati etag ili datum odgovara udaljenom resursu. Koristi se da se spreči preuzimanje dva range-a iz neslagajućih verzija resursa. +- **`Content-Range`**: Ukazuje gde u punom telu poruke pripada parcijalna poruka. ## Informacije o telu poruke - **`Content-Length`:** Veličina resursa, u decimalnom broju bajtova. -- **`Content-Type`**: Označava medijski tip resursa -- **`Content-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. +- **`Content-Type`**: Ukazuje medija tip resursa +- **`Content-Encoding`**: Koristi se da specificira algoritam kompresije. +- **`Content-Language`**: Opisuje ljudski jezik(e) namenjen publici, kako bi omogućilo korisniku da razlikuje prema svom preferiranom jeziku. +- **`Content-Location`**: Ukazuje 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: +Sa stanovišta pentesta ove informacije su obično "useless", ali ako je resurs **protected** od 401 ili 403 i možete naći neki **način** da dobijete ove **info**, to može biti **interesantno.**\ +Na primer, kombinacija **`Range`** i **`Etag`** u HEAD zahtevu može leak-ovati sadržaj stranice putem HEAD zahteva: -- Zahtev sa zaglavljem `Range: bytes=20-20` i sa odgovorom koji sadrži `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` otkriva da je SHA1 bajta 20 `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` +- Zahtev sa zaglavljem `Range: bytes=20-20` i odgovor koji sadrži `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` otkriva da je SHA1 od bajta 20 `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` ## Informacije o serveru @@ -108,28 +129,29 @@ Na primer, kombinacija **`Range`** i **`Etag`** u HEAD zahtevu može otkriti sad ## Kontrole -- **`Allow`**: Ovo zaglavlje se koristi za komunikaciju HTTP metoda koje resurs može obraditi. Na primer, može biti specificirano kao `Allow: 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 da bi zahtev bio uspešno obrađen. Uobičajena upotreba uključuje zaglavlje `Expect: 100-continue`, koje signalizira da klijent namerava da pošalje veliki paket podataka. Klijent traži `100 (Continue)` odgovor pre nego što nastavi sa prenosom. Ovaj mehanizam pomaže u optimizaciji korišćenja mreže čekajući potvrdu servera. +- **`Allow`**: Ovo zaglavlje se koristi da saopšti HTTP metode koje resurs može da podrži. Na primer, može biti specificirano kao `Allow: GET, POST, HEAD`, što znači da resurs podržava te metode. +- **`Expect`**: Koristi se od strane klijenta da izrazi očekivanja koja server mora da ispuni da bi zahtev bio uspešno obrađen. Uobičajen primer je `Expect: 100-continue`, koji signalizira da klijent namerava da pošalje veliki payload i očekuje `100 (Continue)` pre nego što nastavi sa slanjem. Ovaj mehanizam pomaže u optimizaciji mrežnog saobraćaja č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: +- Zaglavlje **`Content-Disposition`** u HTTP odgovorima određuje da li fajl treba da bude prikazan **inline** (u okviru web stranice) ili tretiran kao **attachment** (preuzet). Na primer: ``` Content-Disposition: attachment; filename="filename.jpg" ``` -Ovo znači da je datoteka pod nazivom "filename.jpg" namenjena preuzimanju i čuvanju. +Ovo znači da je fajl pod imenom "filename.jpg" predviđen za preuzimanje i čuvanje. -## Bezbednosni zaglavlja +## Sigurnosni zaglavlja ### Politika bezbednosti sadržaja (CSP) + {{#ref}} ../../pentesting-web/content-security-policy-csp-bypass/ {{#endref}} -### **Poverljivi tipovi** +### **Trusted Types** -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. +Sprovodeći Trusted Types putem CSP-a, aplikacije mogu biti zaštićene od DOM XSS napada. Trusted Types osiguravaju da se u opasnim pozivima web API-ja mogu koristiti samo posebno kreirani objekti, usklađeni sa uspostavljenim bezbednosnim politikama, čime se JavaScript kod podrazumevano štiti. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { @@ -148,75 +170,75 @@ 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. +Ovaj header sprečava MIME type sniffing — praksu koja može dovesti do XSS ranjivosti. Time se osigurava da pregledači poštuju MIME tipove koje server navede. ``` 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 ``, `