Translated ['src/generic-methodologies-and-resources/external-recon-meth

This commit is contained in:
Translator 2025-03-29 22:58:29 +00:00
parent c34912145c
commit 4792a2d7ea
3 changed files with 75 additions and 44 deletions

View File

@ -2,18 +2,13 @@
{{#include ../../banners/hacktricks-training.md}}
Sada kada smo sastavili listu resursa našeg opsega, vreme je da potražimo neke OSINT niske plodove.
### Platforme koje su već tražile leakove
- [https://trufflesecurity.com/blog/introducing-forager/](https://trufflesecurity.com/blog/introducing-forager/)
### Api ključevi leakovi u github-u
### Alati za pronalaženje tajni u git repozitorijumima i fajl sistemu
- [https://github.com/dxa4481/truffleHog](https://github.com/dxa4481/truffleHog)
- [https://github.com/gitleaks/gitleaks](https://github.com/gitleaks/gitleaks)
- [https://github.com/praetorian-inc/noseyparker](https://github.com/praetorian-inc/noseyparker)
- [https://github.com/GitGuardian/ggshield](https://github.com/GitGuardian/ggshield)
- [https://github.com/JaimePolop/RExpository](https://github.com/JaimePolop/RExpository)
- [https://github.com/Yelp/detect-secrets](https://github.com/Yelp/detect-secrets)
- [https://github.com/hisxo/gitGraber](https://github.com/hisxo/gitGraber)
- [https://github.com/eth0izzle/shhgit](https://github.com/eth0izzle/shhgit)

View File

@ -4,24 +4,24 @@
## Osnovne informacije <a href="#d4a8" id="d4a8"></a>
OAuth nudi različite verzije, sa osnovnim uvidima dostupnim na [OAuth 2.0 dokumentacija](https://oauth.net/2/). Ova diskusija se prvenstveno fokusira na široko korišćeni [OAuth 2.0 tip dodeljivanja autorizacionog koda](https://oauth.net/2/grant-types/authorization-code/), pružajući **okvir autorizacije koji omogućava aplikaciji da pristupi ili izvrši radnje na korisničkom nalogu u drugoj aplikaciji** (autorizacioni server).
OAuth nudi različite verzije, sa osnovnim uvidima dostupnim na [OAuth 2.0 dokumentacija](https://oauth.net/2/). Ova diskusija se prvenstveno fokusira na široko korišćeni [OAuth 2.0 tip granta za autorizaciju](https://oauth.net/2/grant-types/authorization-code/), pružajući **okvir autorizacije koji omogućava aplikaciji da pristupi ili izvrši radnje na korisničkom nalogu u drugoj aplikaciji** (server za autorizaciju).
Zamislite hipotetičku veb stranicu _**https://example.com**_, dizajniranu da **prikaže sve vaše objave na društvenim mrežama**, uključujući privatne. Da bi to postigla, koristi se OAuth 2.0. _https://example.com_ će zatražiti vašu dozvolu da **pristupi vašim objavama na društvenim mrežama**. Kao rezultat toga, na _https://socialmedia.com_ će se pojaviti ekran za saglasnost, koji će prikazati **dozvole koje se traže i programera koji podnosi zahtev**. Nakon vaše autorizacije, _https://example.com_ dobija mogućnost da **pristupi vašim objavama u vaše ime**.
Važno je razumeti sledeće komponente unutar OAuth 2.0 okvira:
- **vlasnik resursa**: Vi, kao **korisnik/entitet**, autorizujete pristup vašem resursu, kao što su objave na vašem nalogu na društvenim mrežama.
- **server resursa**: **server koji upravlja autentifikovanim zahtevima** nakon što je aplikacija obezbedila `access token` u ime `vlasnika resursa`, npr., **https://socialmedia.com**.
- **server resursa**: **server koji upravlja autentifikovanim zahtevima** nakon što je aplikacija obezbedila `access token` u ime `vlasnika resursa`, npr. **https://socialmedia.com**.
- **klijentska aplikacija**: **aplikacija koja traži autorizaciju** od `vlasnika resursa`, kao što je **https://example.com**.
- **autorizacioni server**: **server koji izdaje `access tokens`** klijentskoj aplikaciji nakon uspešne autentifikacije `vlasnika resursa` i obezbeđivanja autorizacije, npr., **https://socialmedia.com**.
- **server za autorizaciju**: **server koji izdaje `access tokens`** klijentskoj aplikaciji nakon uspešne autentifikacije `vlasnika resursa` i obezbeđivanja autorizacije, npr. **https://socialmedia.com**.
- **client_id**: Javni, jedinstveni identifikator za aplikaciju.
- **client_secret:** Tajni ključ, poznat samo aplikaciji i autorizacionom serveru, koji se koristi za generisanje `access_tokens`.
- **client_secret:** Tajni ključ, poznat samo aplikaciji i serveru za autorizaciju, koji se koristi za generisanje `access_tokens`.
- **response_type**: Vrednost koja specificira **tip tokena koji se traži**, kao što je `code`.
- **scope**: **nivo pristupa** koji klijentska aplikacija traži od `vlasnika resursa`.
- **redirect_uri**: **URL na koji se korisnik preusmerava nakon autorizacije**. Ovo obično mora biti u skladu sa unapred registrovanim URL-om za preusmeravanje.
- **state**: Parametar za **održavanje podataka tokom preusmeravanja korisnika ka i sa autorizacionog servera**. Njegova jedinstvenost je ključna za služenje kao **mehanizam zaštite od CSRF**.
- **grant_type**: Parametar koji označava **tip dodeljivanja i tip tokena koji treba da bude vraćen**.
- **code**: Autorizacioni kod sa `autorizacionog servera`, koji klijentska aplikacija koristi zajedno sa `client_id` i `client_secret` da bi dobila `access_token`.
- **state**: Parametar za **održavanje podataka tokom korisnikovog preusmeravanja ka i sa servera za autorizaciju**. Njegova jedinstvenost je ključna za služenje kao **mehanizam zaštite od CSRF**.
- **grant_type**: Parametar koji označava **tip granta i tip tokena koji treba da bude vraćen**.
- **code**: Autorizacioni kod sa `servera za autorizaciju`, koji klijentska aplikacija koristi zajedno sa `client_id` i `client_secret` da bi dobila `access_token`.
- **access_token**: **token koji klijentska aplikacija koristi za API zahteve** u ime `vlasnika resursa`.
- **refresh_token**: Omogućava aplikaciji da **dobije novi `access_token` bez ponovnog traženja od korisnika**.
@ -50,7 +50,7 @@ POST /oauth/access_token
Host: socialmedia.com
...{"client_id": "example_clientId", "client_secret": "example_clientSecret", "code": "uniqueCode123", "grant_type": "authorization_code"}
```
6. Na kraju, proces se završava kada https://example.com koristi vaš `access_token` za API poziv ka društvenim mrežama kako bi pristupio
6. Na kraju, proces se završava kada https://example.com koristi vaš `access_token` da izvrši API poziv ka društvenim mrežama za pristup
## Ranljivosti <a href="#id-323a" id="id-323a"></a>
@ -62,7 +62,7 @@ Tehnike eksploatacije variraju u zavisnosti od logike validacije autorizacionog
Pored `redirect_uri`, drugi OAuth i OpenID parametri kao što su `client_uri`, `policy_uri`, `tos_uri` i `initiate_login_uri` su takođe podložni napadima preusmeravanja. Ovi parametri su opcioni i njihova podrška varira među serverima.
Za one koji ciljaju OpenID server, krajnja tačka otkrivanja (`**.well-known/openid-configuration**`) često navodi vredne konfiguracione detalje kao što su `registration_endpoint`, `request_uri_parameter_supported` i "`require_request_uri_registration`. Ovi detalji mogu pomoći u identifikaciji krajnje tačke registracije i drugih specifičnosti konfiguracije servera.
Za one koji ciljaju OpenID server, krajnja tačka otkrivanja (`**.well-known/openid-configuration**`) često navodi vredne detalje o konfiguraciji kao što su `registration_endpoint`, `request_uri_parameter_supported` i "`require_request_uri_registration`. Ovi detalji mogu pomoći u identifikaciji krajnje tačke registracije i drugih specifičnosti konfiguracije servera.
### XSS u implementaciji preusmeravanja <a href="#bda5" id="bda5"></a>
@ -72,9 +72,9 @@ https://app.victim.com/login?redirectUrl=https://app.victim.com/dashboard</scrip
```
### CSRF - Nepravilno rukovanje parametrom stanja <a href="#bda5" id="bda5"></a>
U OAuth implementacijama, zloupotreba ili propuštanje **`state` parametra** može značajno povećati rizik od napada **Cross-Site Request Forgery (CSRF)**. Ova ranjivost se javlja kada se `state` parametar ili **ne koristi, koristi kao statička vrednost, ili se nevalidira pravilno**, omogućavajući napadačima da zaobiđu CSRF zaštite.
U OAuth implementacijama, zloupotreba ili izostavljanje **`state` parametra** može značajno povećati rizik od napada **Cross-Site Request Forgery (CSRF)**. Ova ranjivost nastaje kada se `state` parametar ili **ne koristi, koristi kao statička vrednost, ili se nevalidira ili ne povezuje pravilno sa korisničkom sesijom** prilikom prijavljivanja, omogućavajući napadačima da zaobiđu CSRF zaštite.
Napadači mogu iskoristiti ovo tako što će presresti proces autorizacije kako bi povezali svoj nalog sa nalogom žrtve, što može dovesti do potencijalnih **preuzimanja naloga**. Ovo je posebno kritično u aplikacijama gde se OAuth koristi u **svrhe autentifikacije**.
Napadači mogu iskoristiti ovo presrećući proces autorizacije kako bi povezali svoj nalog sa nalogom žrtve, što može dovesti do potencijalnih **preuzimanja naloga** tako što će korisnik da se prijavi sa gotovo završenim oauth tokom koji pripada napadaču. Ovo je posebno kritično u aplikacijama gde se OAuth koristi u **svrhe autentifikacije**.
Primeri iz stvarnog sveta ove ranjivosti dokumentovani su u raznim **CTF izazovima** i **hacking platformama**, ističući njene praktične implikacije. Problem se takođe proširuje na integracije sa uslugama trećih strana kao što su **Slack**, **Stripe**, i **PayPal**, gde napadači mogu preusmeriti obaveštenja ili uplate na svoje naloge.
@ -89,7 +89,7 @@ Pravilno rukovanje i validacija **`state` parametra** su ključni za zaštitu od
Identifikacija i zaštita tajnih OAuth parametara je ključna. Dok se **`client_id`** može bezbedno otkriti, otkrivanje **`client_secret`** predstavlja značajne rizike. Ako je `client_secret` kompromitovan, napadači mogu iskoristiti identitet i poverenje aplikacije da **ukradu korisničke `access_tokens`** i privatne informacije.
Uobičajena ranjivost se javlja kada aplikacije greškom rukovode razmenom autorizacionog `code` za `access_token` na klijentskoj strani umesto na serverskoj strani. Ova greška dovodi do izlaganja `client_secret`, omogućavajući napadačima da generišu `access_tokens` pod krinkom aplikacije. Štaviše, putem socijalnog inženjeringa, napadači bi mogli da eskaliraju privilegije dodavanjem dodatnih opsega OAuth autorizaciji, dodatno iskorišćavajući poveren status aplikacije.
Uobičajena ranjivost nastaje kada aplikacije greškom rukovode razmenom autorizacionog `code` za `access_token` na klijentskoj strani umesto na serverskoj strani. Ova greška dovodi do izlaganja `client_secret`, omogućavajući napadačima da generišu `access_tokens` pod krinkom aplikacije. Štaviše, kroz socijalno inženjerstvo, napadači bi mogli da eskaliraju privilegije dodavanjem dodatnih opsega u OAuth autorizaciju, dodatno iskorišćavajući povereni status aplikacije.
### Bruteforce klijent tajne
@ -106,19 +106,19 @@ code=77515&redirect_uri=http%3A%2F%2F10.10.10.10%3A3000%2Fcallback&grant_type=au
```
### Referer Header leaking Code + State
Kada klijent ima **code and state**, ako je **reflektovan unutar Referer header-a** kada pretražuje drugu stranicu, onda je ranjiv.
Kada klijent ima **code i state**, ako se **reflektuje unutar Referer header-a** kada pređe na drugu stranicu, onda je ranjiv.
### Access Token Stored in Browser History
Idite na **browser history i proverite da li je access token sačuvan tamo**.
Idite na **istoriju pretraživača i proverite da li je access token sačuvan tamo**.
### Everlasting Authorization Code
**Authorization code bi trebao da živi samo neko vreme kako bi se ograničio vremenski prozor u kojem napadač može da ga ukrade i koristi**.
**Authorization code bi trebao da živi samo neko vreme kako bi se ograničio vremenski prozor u kojem napadač može da ga ukrade i iskoristi**.
### Authorization/Refresh Token not bound to client
Ako možete da dobijete **authorization code i koristite ga sa različitim klijentom, onda možete preuzeti druge naloge**.
Ako možete da dobijete **authorization code i iskoristite ga sa različitim klijentom, onda možete preuzeti druge naloge**.
### Happy Paths, XSS, Iframes & Post Messages to leak code & state values
@ -153,28 +153,28 @@ https://cloud.hacktricks.wiki/en/pentesting-cloud/aws-security/aws-unauthenticat
Kao što je [**spomenuto u ovom izveštaju**](https://salt.security/blog/oh-auth-abusing-oauth-to-take-over-millions-of-accounts), OAuth tokovi koji očekuju da prime **token** (a ne kod) mogli bi biti ranjivi ako ne provere da li token pripada aplikaciji.
To je zato što bi **napadač** mogao da kreira **aplikaciju koja podržava OAuth i prijavu putem Facebook-a** (na primer) u svojoj aplikaciji. Zatim, kada žrtva prijavi putem Facebook-a u **napadačevoj aplikaciji**, napadač bi mogao da dobije **OAuth token korisnika dodeljen njegovoj aplikaciji i koristi ga za prijavu u žrtvinu OAuth aplikaciju koristeći žrtvin korisnički token**.
To je zato što bi **napadač** mogao da kreira **aplikaciju koja podržava OAuth i prijavi se putem Facebook-a** (na primer) u svojoj aplikaciji. Zatim, kada žrtva prijavi putem Facebook-a u **napadačevoj aplikaciji**, napadač bi mogao da dobije **OAuth token korisnika dodeljen njegovoj aplikaciji i iskoristi ga za prijavu u žrtvinu OAuth aplikaciju koristeći žrtvin korisnički token**.
> [!CAUTION]
> Stoga, ako napadač uspe da dobije pristup korisniku svojoj OAuth aplikaciji, moći će da preuzme žrtvin račun u aplikacijama koje očekuju token i ne provere da li je token dodeljen njihovom ID-u aplikacije.
### Dva linka i kolačić <a href="#bda5" id="bda5"></a>
### Dva linka & kolačić <a href="#bda5" id="bda5"></a>
Prema [**ovom izveštaju**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), bilo je moguće naterati žrtvu da otvori stranicu sa **returnUrl** koji upućuje na napadačev host. Ove informacije bi bile **smeštene u kolačiću (RU)**, a u **kasnijem koraku** **prompt** će **pitati** **korisnika** da li želi da da pristup tom napadačevom hostu.
Prema [**ovom izveštaju**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), bilo je moguće naterati žrtvu da otvori stranicu sa **returnUrl** koja pokazuje na napadačev host. Ove informacije bi bile **smeštene u kolačiću (RU)**, a u **kasnijem koraku** **prompt** će **pitati** **korisnika** da li želi da da pristup tom napadačevom hostu.
Da bi se zaobišao ovaj prompt, bilo je moguće otvoriti tab za iniciranje **Oauth toka** koji bi postavio ovaj RU kolačić koristeći **returnUrl**, zatvoriti tab pre nego što se prompt prikaže, i otvoriti novi tab bez te vrednosti. Tada **prompt neće obavestiti o napadačevom hostu**, ali bi kolačić bio postavljen na njega, tako da će **token biti poslat na napadačev host** u redirekciji.
### Zaobilaženje interakcije sa promptom <a href="#bda5" id="bda5"></a>
Kao što je objašnjeno u [**ovom videu**](https://www.youtube.com/watch?v=n9x7_J_a_7Q), neke OAuth implementacije omogućavaju da se GET parametar **`prompt`** označi kao None (**`&prompt=none`**) kako bi se **sprečilo da korisnici budu pitani da potvrde** dodeljeni pristup u promptu na vebu ako su već prijavljeni na platformu.
Kao što je objašnjeno u [**ovom videu**](https://www.youtube.com/watch?v=n9x7_J_a_7Q), neke OAuth implementacije omogućavaju da se GET parametar **`prompt`** označi kao None (**`&prompt=none`**) kako bi se **sprečilo da se korisnicima postavlja pitanje da potvrde** dodeljeni pristup u promptu na vebu ako su već prijavljeni na platformu.
### response_mode
Kao što je [**objašnjeno u ovom videu**](https://www.youtube.com/watch?v=n9x7_J_a_7Q), možda je moguće označiti parametar **`response_mode`** da se naznači gde želite da kod bude dostavljen u konačnom URL-u:
Kao što je [**objašnjeno u ovom videu**](https://www.youtube.com/watch?v=n9x7_J_a_7Q), može biti moguće označiti parametar **`response_mode`** da se naznači gde želite da se kod dostavi u konačnom URL-u:
- `response_mode=query` -> Kod se pruža unutar GET parametra: `?code=2397rf3gu93f`
- `response_mode=fragment` -> Kod se pruža unutar fragmenta URL-a `#code=2397rf3gu93f`
- `response_mode=form_post` -> Kod se pruža unutar POST forme sa inputom pod nazivom `code` i vrednošću
- `response_mode=query` -> Kod se dostavlja unutar GET parametra: `?code=2397rf3gu93f`
- `response_mode=fragment` -> Kod se dostavlja unutar fragmenta URL-a `#code=2397rf3gu93f`
- `response_mode=form_post` -> Kod se dostavlja unutar POST forme sa inputom pod nazivom `code` i vrednošću
- `response_mode=web_message` -> Kod se šalje u post poruci: `window.opener.postMessage({"code": "asdasdasd...`
### OAuth ROPC tok - zaobilaženje 2 FA <a href="#b440" id="b440"></a>
@ -187,10 +187,10 @@ Ovaj [**blog post**](https://blog.voorivex.team/oauth-non-happy-path-to-ato) kom
1. Žrtva pristupa napadačevoj veb stranici
2. Žrtva otvara zlonamerni link i otvarač pokreće Google OAuth tok sa `response_type=id_token,code&prompt=none` kao dodatnim parametrima koristeći kao **referent napadačevu veb stranicu**.
3. U otvaraču, nakon što provajder odobri žrtvu, vraća ih nazad na vrednost parametra `redirect_uri` (žrtvina veb stranica) sa 30X kodom koji i dalje drži napadačevu veb stranicu u referentu.
3. U otvaraču, nakon što provajder odobri žrtvu, vraća ih nazad na vrednost parametra `redirect_uri` (žrtvina veb) sa 30X kodom koji i dalje drži napadačevu veb stranicu u referentu.
4. Žrtvina **veb stranica pokreće otvoreno preusmeravanje na osnovu referenta** preusmeravajući žrtvinog korisnika na napadačevu veb stranicu, pošto je **`respose_type`** bio **`id_token,code`**, kod će biti vraćen napadaču u **fragmentu** URL-a omogućavajući mu da preuzme račun korisnika putem Google-a na žrtvinom sajtu.
### SSRF parametri <a href="#bda5" id="bda5"></a>
### SSRFs parametri <a href="#bda5" id="bda5"></a>
[**Proverite ovo istraživanje**](https://portswigger.net/research/hidden-oauth-attack-vectors) **Za dalja objašnjenja ove tehnike.**
@ -201,23 +201,45 @@ Dinamička registracija klijenata u OAuth služi kao manje očigledan, ali kriti
- **Dinamička registracija klijenata** se često mapira na `/register` i prihvata detalje kao što su `client_name`, `client_secret`, `redirect_uris`, i URL-ove za logotipe ili JSON Web Key Sets (JWKs) putem POST zahteva.
- Ova funkcija se pridržava specifikacija navedenih u **RFC7591** i **OpenID Connect Registration 1.0**, koje uključuju parametre koji su potencijalno ranjivi na SSRF.
- Proces registracije može nenamerno izložiti servere SSRF na nekoliko načina:
- **`logo_uri`**: URL za logo klijentske aplikacije koji bi server mogao da preuzme, pokrećući SSRF ili dovodeći do XSS ako se URL pogrešno obradi.
- **`logo_uri`**: URL za logotip klijentske aplikacije koji bi server mogao da preuzme, pokrećući SSRF ili dovodeći do XSS ako se URL nepravilno obradi.
- **`jwks_uri`**: URL do JWK dokumenta klijenta, koji, ako je zlonamerno kreiran, može uzrokovati da server izvrši izlazne zahteve ka serveru pod kontrolom napadača.
- **`sector_identifier_uri`**: Upućuje na JSON niz `redirect_uris`, koji server može preuzeti, stvarajući priliku za SSRF.
- **`request_uris`**: Navodi dozvoljene URI zahteva za klijenta, koji se mogu zloupotrebiti ako server preuzme ove URI na početku procesa autorizacije.
- **`request_uris`**: Navodi dozvoljene URI zahteve za klijenta, koji se mogu zloupotrebiti ako server preuzima ove URI na početku procesa autorizacije.
**Strategija eksploatacije:**
- SSRF se može pokrenuti registracijom novog klijenta sa zlonamernim URL-ovima u parametrima kao što su `logo_uri`, `jwks_uri`, ili `sector_identifier_uri`.
- Dok direktna eksploatacija putem `request_uris` može biti ublažena kontrolama na osnovu bele liste, pružanje unapred registrovanog, napadačem kontrolisanog `request_uri` može olakšati SSRF tokom faze autorizacije.
- Iako direktna eksploatacija putem `request_uris` može biti ublažena kontrolama na beloj listi, pružanje unapred registrovanog, napadačem kontrolisanog `request_uri` može olakšati SSRF tokom faze autorizacije.
## OAuth provajderi trke
Ako je platforma koju testirate OAuth provajder [**pročitajte ovo da biste testirali moguće trke**](race-condition.md).
Ako je platforma koju testirate OAuth provajder, [**pročitajte ovo da biste testirali moguće trke**](race-condition.md).
## Napad na promenljive tvrdnje
U OAuth-u, sub polje jedinstveno identifikuje korisnika, ali njegov format varira u zavisnosti od servera za autorizaciju. Da bi se standardizovala identifikacija korisnika, neki klijenti koriste e-mail adrese ili korisničke oznake. Međutim, ovo je rizično jer:
- Neki serveri za autorizaciju ne osiguravaju da ove osobine (kao što je e-mail) ostanu nepromenljive.
- U određenim implementacijama—kao što je **"Prijava putem Microsoft-a"**—klijent se oslanja na polje e-maila, koje je **pod kontrolom korisnika u Entra ID** i nije verifikovano.
- Napadač može iskoristiti ovo tako što će kreirati svoju Azure AD organizaciju (npr. doyensectestorg) i koristiti je za izvršenje prijave putem Microsoft-a.
- Iako je Object ID (smešten u sub) nepromenljiv i siguran, oslanjanje na promenljivo polje e-maila može omogućiti preuzimanje računa (na primer, otmicu računa kao što je victim@gmail.com).
## Napad na konfuziju klijenata
U **napadu na konfuziju klijenata**, aplikacija koja koristi OAuth Implicit Flow ne uspeva da verifikuje da je konačni pristupni token posebno generisan za njen vlastiti Client ID. Napadač postavlja javnu veb stranicu koja koristi Google-ov OAuth Implicit Flow, obmanjujući hiljade korisnika da se prijave i tako prikupljajući pristupne tokene namenjene napadačevoj stranici. Ako ovi korisnici takođe imaju račune na drugoj ranjivoj veb stranici koja ne verifikuje Client ID tokena, napadač može ponovo koristiti prikupljene tokene da se pretvara da su žrtve i preuzme njihove račune.
## Napad na nadogradnju opsega
Tip **Authorization Code Grant** uključuje sigurnu komunikaciju servera do servera za prenos korisničkih podataka. Međutim, ako **Authorization Server** implicitno veruje parametru opsega u zahtevu za pristupni token (parametar koji nije definisan u RFC-u), zlonamerna aplikacija bi mogla da nadogradi privilegije autorizacionog koda tražeći viši opseg. Nakon što je **Access Token** generisan, **Resource Server** mora da ga verifikuje: za JWT tokene, to uključuje proveru JWT potpisa i vađenje podataka kao što su client_id i opseg, dok za tokene nasumičnih stringova server mora da upita Authorization Server da bi dobio detalje o tokenu.
## Otimanje sheme preusmeravanja
U mobilnim OAuth implementacijama, aplikacije koriste **prilagođene URI sheme** za primanje preusmeravanja sa autorizacionim kodovima. Međutim, pošto više aplikacija može registrovati istu shemu na uređaju, pretpostavka da samo legitimni klijent kontroliše URI preusmeravanja je prekršena. Na Android-u, na primer, Intent URI kao što je `com.example.app://` oauth se hvata na osnovu sheme i opcionalnih filtera definisanih u aplikaciji. Pošto Android-ovo rešavanje intencija može biti široko—posebno ako je samo shema specificirana—napadač može registrovati zlonamernu aplikaciju sa pažljivo izrađenim intent filterom da bi otimao autorizacioni kod. Ovo može **omogućiti preuzimanje računa** ili kroz interakciju korisnika (kada više aplikacija može da obradi intenciju) ili putem tehnika zaobilaženja koje koriste previše specifične filtere, kao što je detaljno opisano u Ostorlabovom dijagramu toka procene.
## Reference
- [**https://medium.com/a-bugz-life/the-wondeful-world-of-oauth-bug-bounty-edition-af3073b354c1**](https://medium.com/a-bugz-life/the-wondeful-world-of-oauth-bug-bounty-edition-af3073b354c1)
- [**https://portswigger.net/research/hidden-oauth-attack-vectors**](https://portswigger.net/research/hidden-oauth-attack-vectors)
- [**https://blog.doyensec.com/2025/01/30/oauth-common-vulnerabilities.html**](https://blog.doyensec.com/2025/01/30/oauth-common-vulnerabilities.html)
{{#include ../banners/hacktricks-training.md}}

View File

@ -19,17 +19,17 @@ unicode-normalization.md
## `\u` to `%`
Unicode karakteri se obično predstavljaju sa **`\u` prefiksom**. Na primer, karakter `㱋` je `\u3c4b`([proverite ovde](https://unicode-explorer.com/c/3c4B)). Ako backend **transformiše** prefiks **`\u` u `%`**, rezultantni string će biti `%3c4b`, što URL dekodirano daje: **`<4b`**. I, kao što možete videti, **`<` karakter je ubrizgan**.\
Možete koristiti ovu tehniku da **ubrizgate bilo koji tip karaktera** ako je backend ranjiv.\
Unicode karakteri se obično predstavljaju sa **`\u` prefiksom**. Na primer, karakter `㱋` je `\u3c4b`([proverite ovde](https://unicode-explorer.com/c/3c4B)). Ako backend **transformiše** prefiks **`\u` u `%`**, rezultantni string će biti `%3c4b`, što je URL dekodirano: **`<4b`**. I, kao što možete videti, **karakter ` < ` je ubrizgan**.\
Možete koristiti ovu tehniku da **ubrizgate bilo koju vrstu karaktera** ako je backend ranjiv.\
Pogledajte [https://unicode-explorer.com/](https://unicode-explorer.com/) da pronađete potrebne karaktere.
Ova ranjivost zapravo dolazi iz ranjivosti koju je istraživač pronašao, za dublje objašnjenje pogledajte [https://www.youtube.com/watch?v=aUsAHb0E7Cg](https://www.youtube.com/watch?v=aUsAHb0E7Cg)
## Emoji Injection
Back-endovi se čudno ponašaju kada **prime emotikone**. To se desilo u [**ovoj analizi**](https://medium.com/@fpatrik/how-i-found-an-xss-vulnerability-via-using-emojis-7ad72de49209) gde je istraživač uspeo da postigne XSS sa payload-om kao što je: `💋img src=x onerror=alert(document.domain)//💛`
Back-endovi se čudno ponašaju kada **primi emojije**. To se desilo u [**ovoj analizi**](https://medium.com/@fpatrik/how-i-found-an-xss-vulnerability-via-using-emojis-7ad72de49209) gde je istraživač uspeo da postigne XSS sa payload-om kao što je: `💋img src=x onerror=alert(document.domain)//💛`
U ovom slučaju, greška je bila što je server nakon uklanjanja zlonamernih karaktera **konvertovao UTF-8 string iz Windows-1252 u UTF-8** (osnovno, kodiranje ulaza i konverzija kodiranja su se neslagali). Tada ovo ne daje pravi < već samo čudan unicode: ``\
U ovom slučaju, greška je bila da je server nakon uklanjanja zlonamernih karaktera **konvertovao UTF-8 string iz Windows-1252 u UTF-8** (osnovno, kodiranje ulaza i konverzija kodiranja su se neslagali). Tada ovo ne daje pravi < već samo čudan unicode: ``\
``Tako su uzeli ovaj izlaz i **ponovo konvertovali sada iz UTF-8 u ASCII**. Ovo je **normalizovalo** `` u `<`, tako je eksploatacija mogla da funkcioniše na tom sistemu.\
To je ono što se desilo:
```php
@ -42,9 +42,23 @@ $str = iconv("UTF-8", "ASCII//TRANSLIT", $str);
echo "String: " . $str;
```
Lista emojija:
Emoji liste:
- [https://github.com/iorch/jakaton_feminicidios/blob/master/data/emojis.csv](https://github.com/iorch/jakaton_feminicidios/blob/master/data/emojis.csv)
- [https://unicode.org/emoji/charts-14.0/full-emoji-list.html](https://unicode.org/emoji/charts-14.0/full-emoji-list.html)
## Windows Best-Fit/Worst-fit
Kao što je objašnjeno u **[ovom sjajnom postu](https://blog.orange.tw/posts/2025-01-worstfit-unveiling-hidden-transformers-in-windows-ansi/)**, Windows ima funkciju pod nazivom **Best-Fit** koja će **zameniti unicode karaktere** koji se ne mogu prikazati u ASCII modu sličnim karakterom. To može dovesti do **neočekivanog ponašanja** kada backend **očekuje određeni karakter** ali dobija drugačiji.
Moguće je pronaći best-fit karaktere u **[https://worst.fit/mapping/](https://worst.fit/mapping/)**.
Kako Windows obično konvertuje unicode stringove u ascii stringove kao jedan od poslednjih delova izvršenja (obično prelazeći sa "W" sufiksiranog API-ja na "A" sufiksirani API kao što su `GetEnvironmentVariableA` i `GetEnvironmentVariableW`), to bi omogućilo napadačima da zaobiđu zaštite slanjem unicode karaktera koji će na kraju biti konvertovani u ASCII karaktere koji bi izvršili neočekivane radnje.
U blog postu su predložene metode za zaobilaženje ranjivosti koje su ispravljene korišćenjem **crne liste karaktera**, iskorišćavanje **putanja prelaza** koristeći [karaktere mapirane na “/“ (0x2F)](https://worst.fit/mapping/#to%3A0x2f) i [karaktere mapirane na “\“ (0x5C)](https://worst.fit/mapping/#to%3A0x5c) ili čak zaobilaženje zaštita od shell escape-a kao što su PHP-ov `escapeshellarg` ili Python-ov `subprocess.run` koristeći listu, ovo je urađeno na primer korišćenjem **punih dvostrukih navodnika (U+FF02)** umesto dvostrukih navodnika tako da je na kraju ono što je izgledalo kao 1 argument transformisano u 2 argumenta.
**Napomena da aplikacija bude ranjiva, mora koristiti "W" Windows API-je ali završiti pozivajući "A" Windows API tako da se kreira "Best-fit" unicode stringa.**
**Nekoliko otkrivenih ranjivosti neće biti ispravljeno jer se ljudi ne slažu ko bi trebao da reši ovaj problem.**
{{#include ../../banners/hacktricks-training.md}}