# 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/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers) - [https://github.com/rfc-st/humble](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 vrednost **`miss`** kada zahtev nije keširan i vrednost **`hit`** 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 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"` ## Uslovi - Zahtevi koji koriste ova zaglavlja: **`If-Modified-Since`** i **`If-Unmodified-Since`** biće odgovoreni 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 **izračunava** na osnovu **sadržaja** odgovora. Na primer, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` označava da je `Etag` **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`**: 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š zaglavlje `Accept-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 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. 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ži `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` otkriva da je SHA1 bajta 20 `ETag: 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 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 kako 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. ## 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. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { // Name and create a policy const policy = trustedTypes.createPolicy('escapePolicy', { createHTML: str => str.replace(/\/g, '>'); }); } ``` ```javascript // Assignment of raw strings is blocked, ensuring safety. el.innerHTML = "some string" // Throws an exception. const escaped = policy.createHTML("") 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 ``, `