mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
189 lines
9.0 KiB
Markdown
189 lines
9.0 KiB
Markdown
# Specijalni 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 keš servera**:
|
|
|
|
- **`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 bez ključa.
|
|
- **`Age`** definiše vreme u sekundama koliko je objekat bio u kešu proksija.
|
|
- **`Server-Timing: cdn-cache; desc=HIT`** takođe označava da je resurs keširan
|
|
|
|
{{#ref}}
|
|
../../pentesting-web/cache-deception/
|
|
{{#endref}}
|
|
|
|
**Zaglavlja lokalnog keša**:
|
|
|
|
- `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. Može se pojaviti više od jednog `Warning` zaglavlja 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-unit>`
|
|
- **`Range`**: Označava deo dokumenta koji server treba da vrati.
|
|
- **`If-Range`**: Stvara 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** 401 ili 403 i možete pronaći neki **način** da **dobijete** 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 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 Headeri
|
|
|
|
### Politika Bezbednosti Sadržaja (CSP) <a href="#csp" id="csp"></a>
|
|
|
|
{{#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, '<').replace(/>/g, '>');
|
|
});
|
|
}
|
|
```
|
|
|
|
```javascript
|
|
// 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 prava na ugradnju.
|
|
```
|
|
X-Frame-Options: DENY
|
|
```
|
|
### **Cross-Origin Resource Policy (CORP) i 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) i 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
|
|
```
|
|
## Reference
|
|
|
|
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition)
|
|
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)
|
|
- [https://web.dev/security-headers/](https://web.dev/security-headers/)
|
|
- [https://web.dev/articles/security-headers](https://web.dev/articles/security-headers)
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|