OAuth per il takeover dellâaccount
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Informazioni di base
OAuth offre varie versioni, con informazioni fondamentali accessibili nella documentazione OAuth 2.0. Questa discussione si concentra principalmente sul tipo di concessione del codice di autorizzazione OAuth 2.0, fornendo un framework di autorizzazione che consente a unâapplicazione di accedere o eseguire azioni sullâaccount di un utente in unâaltra applicazione (il server di autorizzazione).
Considera un sito web ipotetico https://example.com, progettato per mostrare tutti i tuoi post sui social media, inclusi quelli privati. Per raggiungere questo obiettivo, viene impiegato OAuth 2.0. https://example.com richiederĂ il tuo permesso per accedere ai tuoi post sui social media. Di conseguenza, apparirĂ una schermata di consenso su https://socialmedia.com, delineando le autorizzazioni richieste e lo sviluppatore che effettua la richiesta. Una volta autorizzato, https://example.com ottiene la possibilitĂ di accedere ai tuoi post per tuo conto.
Ă essenziale comprendere i seguenti componenti allâinterno del framework OAuth 2.0:
- proprietario della risorsa: Tu, come utente/entitĂ , autorizzi lâaccesso alla tua risorsa, come i post del tuo account sui social media.
- server delle risorse: Il server che gestisce le richieste autenticate dopo che lâapplicazione ha ottenuto un
access tokenper conto delproprietario della risorsa, ad esempio, https://socialmedia.com. - applicazione client: Lâapplicazione che richiede autorizzazione dal
proprietario della risorsa, come https://example.com. - server di autorizzazione: Il server che emette
access tokensallâapplicazione clientdopo lâautenticazione riuscita delproprietario della risorsae lâottenimento dellâautorizzazione, ad esempio, https://socialmedia.com. - client_id: Un identificatore pubblico e unico per lâapplicazione.
- client_secret: Una chiave riservata, conosciuta solo dallâapplicazione e dal server di autorizzazione, utilizzata per generare
access_tokens. - response_type: Un valore che specifica il tipo di token richiesto, come
code. - scope: Il livello di accesso che lâ
applicazione clientsta richiedendo dalproprietario della risorsa. - redirect_uri: LâURL a cui lâutente viene reindirizzato dopo lâautorizzazione. Questo deve generalmente allinearsi con lâURL di reindirizzamento pre-registrato.
- state: Un parametro per mantenere i dati durante il reindirizzamento dellâutente verso e dal server di autorizzazione. La sua unicità è fondamentale per fungere da meccanismo di protezione CSRF.
- grant_type: Un parametro che indica il tipo di concessione e il tipo di token da restituire.
- code: Il codice di autorizzazione dal
server di autorizzazione, utilizzato insieme aclient_ideclient_secretdallâapplicazione client per acquisire unaccess_token. - access_token: Il token che lâapplicazione client utilizza per le richieste API per conto del
proprietario della risorsa. - refresh_token: Consente allâapplicazione di ottenere un nuovo
access_tokensenza richiedere nuovamente allâutente.
Flusso
Il flusso OAuth effettivo procede come segue:
- Naviga su https://example.com e seleziona il pulsante âIntegra con i social mediaâ.
- Il sito invia quindi una richiesta a https://socialmedia.com chiedendo la tua autorizzazione per consentire allâapplicazione di https://example.com di accedere ai tuoi post. La richiesta è strutturata come:
https://socialmedia.com/auth
?response_type=code
&client_id=example_clientId
&redirect_uri=https%3A%2F%2Fexample.com%2Fcallback
&scope=readPosts
&state=randomString123
- Ti viene quindi presentata una pagina di consenso.
- Dopo la tua approvazione, Social Media invia una risposta allâ
redirect_uricon i parametricodeestate:
https://example.com?code=uniqueCode123&state=randomString123
- https://example.com utilizza questo
code, insieme al suoclient_ideclient_secret, per effettuare una richiesta lato server per ottenere unaccess_tokenper tuo conto, abilitando lâaccesso alle autorizzazioni a cui hai acconsentito:
POST /oauth/access_token
Host: socialmedia.com
...{"client_id": "example_clientId", "client_secret": "example_clientSecret", "code": "uniqueCode123", "grant_type": "authorization_code"}
- Infine, il processo si conclude quando https://example.com utilizza il tuo
access_tokenper effettuare una chiamata API a Social Media per accedere
VulnerabilitĂ
Open redirect_uri
Il redirect_uri è cruciale per la sicurezza nelle implementazioni di OAuth e OpenID, poichĂŠ indica dove vengono inviati i dati sensibili, come i codici di autorizzazione, dopo lâautorizzazione. Se configurato in modo errato, potrebbe consentire agli attaccanti di reindirizzare queste richieste a server malevoli, abilitando il takeover dellâaccount.
Le tecniche di sfruttamento variano in base alla logica di convalida del server di autorizzazione. Possono variare da un abbinamento di percorso rigoroso allâaccettazione di qualsiasi URL allâinterno del dominio o sottodirectory specificati. I metodi di sfruttamento comuni includono reindirizzamenti aperti, traversata di percorso, sfruttamento di regex deboli e iniezione HTML per il furto di token.
Oltre al redirect_uri, altri parametri di OAuth e OpenID come client_uri, policy_uri, tos_uri e initiate_login_uri sono anchâessi suscettibili ad attacchi di reindirizzamento. Questi parametri sono facoltativi e il loro supporto varia tra i server.
Per coloro che mirano a un server OpenID, lâendpoint di discovery (**.well-known/openid-configuration**) elenca spesso dettagli di configurazione preziosi come registration_endpoint, request_uri_parameter_supported e ârequire_request_uri_registration. Questi dettagli possono aiutare a identificare lâendpoint di registrazione e altre specifiche di configurazione del server.
XSS nellâimplementazione del reindirizzamento
Come menzionato in questo rapporto di bug bounty https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html, potrebbe essere possibile che il URL di reindirizzamento venga riflesso nella risposta del server dopo che lâutente si autentica, risultando vulnerabile a XSS. Payload possibile da testare:
https://app.victim.com/login?redirectUrl=https://app.victim.com/dashboard</script><h1>test</h1>
CSRF - Gestione impropria del parametro di stato
Nelle implementazioni di OAuth, lâuso improprio o lâomissione del state parameter può aumentare significativamente il rischio di attacchi di Cross-Site Request Forgery (CSRF). Questa vulnerabilitĂ si verifica quando il parametro state è non utilizzato, utilizzato come valore statico, o non validato correttamente o associato alla sessione dellâutente durante il login, consentendo agli attaccanti di bypassare le protezioni CSRF.
Gli attaccanti possono sfruttare questo intercettando il processo di autorizzazione per collegare il proprio account a quello di una vittima, portando a potenziali account takeovers facendo in modo che un utente acceda con un flusso oauth quasi completato appartenente allâattaccante. Questo è particolarmente critico nelle applicazioni in cui OAuth è utilizzato per scopi di autenticazione.
Esempi reali di questa vulnerabilitĂ sono stati documentati in varie CTF challenges e hacking platforms, evidenziando le sue implicazioni pratiche. Il problema si estende anche alle integrazioni con servizi di terze parti come Slack, Stripe e PayPal, dove gli attaccanti possono reindirizzare notifiche o pagamenti ai propri account.
Una corretta gestione e validazione del state parameter sono cruciali per proteggere contro CSRF e garantire la sicurezza del flusso OAuth.
Pre Account Takeover
- Senza verifica dellâemail nella creazione dellâaccount: Gli attaccanti possono creare preventivamente un account utilizzando lâemail della vittima. Se la vittima successivamente utilizza un servizio di terze parti per il login, lâapplicazione potrebbe involontariamente collegare questo account di terze parti allâaccount pre-creato dallâattaccante, portando ad accessi non autorizzati.
- Sfruttare la verifica dellâemail OAuth poco rigorosa: Gli attaccanti possono sfruttare i servizi OAuth che non verificano le email registrandosi con il loro servizio e poi cambiando lâemail dellâaccount con quella della vittima. Questo metodo comporta un rischio simile di accesso non autorizzato allâaccount, simile al primo scenario ma attraverso un vettore di attacco diverso.
Divulgazione di segreti
Identificare e proteggere i parametri segreti di OAuth è cruciale. Mentre il client_id può essere divulgato in modo sicuro, rivelare il client_secret comporta rischi significativi. Se il client_secret viene compromesso, gli attaccanti possono sfruttare lâidentitĂ e la fiducia dellâapplicazione per rubare i access_tokens degli utenti e informazioni private.
Una vulnerabilitĂ comune si verifica quando le applicazioni gestiscono erroneamente lo scambio del code di autorizzazione per un access_token sul lato client anzichĂŠ sul lato server. Questo errore porta allâesposizione del client_secret, consentendo agli attaccanti di generare access_tokens sotto le spoglie dellâapplicazione. Inoltre, attraverso lâingegneria sociale, gli attaccanti potrebbero aumentare i privilegi aggiungendo ulteriori scope allâautorizzazione OAuth, sfruttando ulteriormente lo stato di fiducia dellâapplicazione.
Bruteforce del Client Secret
Puoi provare a bruteforce il client_secret di un fornitore di servizi con il provider di identitĂ per cercare di rubare account.
La richiesta per BF potrebbe apparire simile a:
POST /token HTTP/1.1
content-type: application/x-www-form-urlencoded
host: 10.10.10.10:3000
content-length: 135
Connection: close
code=77515&redirect_uri=http%3A%2F%2F10.10.10.10%3A3000%2Fcallback&grant_type=authorization_code&client_id=public_client_id&client_secret=[bruteforce]
Referer Header leaking Code + State
Una volta che il client ha il code and state, se è riflesso allâinterno dellâheader Referer quando naviga su unâaltra pagina, allora è vulnerabile.
Access Token Stored in Browser History
Vai alla cronologia del browser e controlla se lâaccess token è salvato lĂŹ.
Everlasting Authorization Code
Il authorization code dovrebbe vivere solo per un certo periodo per limitare la finestra temporale in cui un attaccante può rubarlo e usarlo.
Authorization/Refresh Token not bound to client
Se riesci a ottenere il authorization code e usarlo con un client diverso, allora puoi prendere il controllo di altri account.
Happy Paths, XSS, Iframes & Post Messages to leak code & state values
AWS Cognito
In questo rapporto di bug bounty: https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/ puoi vedere che il token che AWS Cognito restituisce allâutente potrebbe avere sufficienti permessi per sovrascrivere i dati dellâutente. Pertanto, se puoi cambiare lâemail dellâutente con unâaltra email, potresti essere in grado di prendere il controllo di altri account.
# Read info of the user
aws cognito-idp get-user --region us-east-1 --access-token eyJraWQiOiJPVj[...]
# Change email address
aws cognito-idp update-user-attributes --region us-east-1 --access-token eyJraWQ[...] --user-attributes Name=email,Value=imaginary@flickr.com
{
"CodeDeliveryDetailsList": [
{
"Destination": "i***@f***.com",
"DeliveryMedium": "EMAIL",
"AttributeName": "email"
}
]
}
Per ulteriori informazioni dettagliate su come abusare di AWS cognito controlla:
Page not found - HackTricks Cloud
Abusare di altri token delle app
Come menzionato in questo articolo, i flussi OAuth che si aspettano di ricevere il token (e non un codice) potrebbero essere vulnerabili se non controllano che il token appartenga allâapp.
Questo perchĂŠ un attaccante potrebbe creare un applicazione che supporta OAuth e accedere con Facebook (ad esempio) nella propria applicazione. Poi, una volta che una vittima accede con Facebook nellâapplicazione dellâattaccante, lâattaccante potrebbe ottenere il token OAuth dellâutente dato alla sua applicazione e usarlo per accedere allâapplicazione OAuth della vittima utilizzando il token utente della vittima.
Caution
Pertanto, se lâattaccante riesce a far accedere lâutente alla propria applicazione OAuth, sarĂ in grado di prendere il controllo dellâaccount della vittima in applicazioni che si aspettano un token e non controllano se il token è stato concesso al loro ID app.
Due link & cookie
Secondo questo articolo, era possibile far aprire a una vittima una pagina con un returnUrl che punta allâhost dellâattaccante. Queste informazioni sarebbero state memorizzate in un cookie (RU) e in un passaggio successivo il prompt chiederĂ allâutente se desidera concedere accesso a quellâhost dellâattaccante.
Per bypassare questo prompt, era possibile aprire una scheda per avviare il flusso Oauth che imposterebbe questo cookie RU utilizzando il returnUrl, chiudere la scheda prima che venga mostrato il prompt e aprire una nuova scheda senza quel valore. Quindi, il prompt non informerĂ riguardo allâhost dellâattaccante, ma il cookie sarebbe impostato su di esso, quindi il token sarĂ inviato allâhost dellâattaccante nella redirezione.
Bypass dellâinterazione del prompt
Come spiegato in questo video, alcune implementazioni OAuth consentono di indicare il parametro prompt GET come None (&prompt=none) per prevenire che gli utenti vengano chiesti di confermare lâaccesso dato in un prompt sul web se sono giĂ loggati sulla piattaforma.
response_mode
Come spiegato in questo video, potrebbe essere possibile indicare il parametro response_mode per indicare dove si desidera che il codice venga fornito nellâURL finale:
response_mode=query-> Il codice è fornito allâinterno di un parametro GET:?code=2397rf3gu93fresponse_mode=fragment-> Il codice è fornito allâinterno del parametro frammento dellâURL#code=2397rf3gu93fresponse_mode=form_post-> Il codice è fornito allâinterno di un modulo POST con un input chiamatocodee il valoreresponse_mode=web_message-> Il codice è inviato in un messaggio post:window.opener.postMessage({"code": "asdasdasd...
Flusso OAuth ROPC - bypass 2 FA
Secondo questo post del blog, questo è un flusso OAuth che consente di accedere a OAuth tramite nome utente e password. Se durante questo semplice flusso viene restituito un token con accesso a tutte le azioni che lâutente può eseguire, allora è possibile bypassare 2FA utilizzando quel token.
ATO su pagina web che reindirizza in base a open redirect al referrer
Questo post del blog commenta come sia stato possibile abusare di un open redirect al valore del referrer per abusare di OAuth per ATO. Lâattacco è stato:
- La vittima accede alla pagina web dellâattaccante
- La vittima apre il link malevolo e un opener avvia il flusso OAuth di Google con
response_type=id_token,code&prompt=nonecome parametri aggiuntivi utilizzando come referrer il sito web dellâattaccante. - Nellâopener, dopo che il provider autorizza la vittima, la rimanda al valore del parametro
redirect_uri(web della vittima) con codice 30X che mantiene ancora il sito web dellâattaccante nel referer. - Il sito web della vittima attiva il reindirizzamento open basato sul referrer reindirizzando lâutente vittima al sito web dellâattaccante, poichĂŠ il
respose_typeeraid_token,code, il codice sarĂ inviato allâattaccante nel frammento dellâURL consentendogli di prendere il controllo dellâaccount dellâutente tramite Google nel sito della vittima.
Parametri SSRFs
Controlla questa ricerca Per ulteriori dettagli su questa tecnica.
La registrazione dinamica dei client in OAuth funge da vettore meno ovvio ma critico per le vulnerabilitĂ di sicurezza, specificamente per gli attacchi di Server-Side Request Forgery (SSRF). Questo endpoint consente ai server OAuth di ricevere dettagli sulle applicazioni client, inclusi URL sensibili che potrebbero essere sfruttati.
Punti chiave:
- La registrazione dinamica dei client è spesso mappata su
/registere accetta dettagli comeclient_name,client_secret,redirect_urise URL per loghi o JSON Web Key Sets (JWKs) tramite richieste POST. - Questa funzionalitĂ aderisce alle specifiche stabilite in RFC7591 e OpenID Connect Registration 1.0, che includono parametri potenzialmente vulnerabili a SSRF.
- Il processo di registrazione può involontariamente esporre i server a SSRF in diversi modi:
logo_uri: Un URL per il logo dellâapplicazione client che potrebbe essere recuperato dal server, attivando SSRF o portando a XSS se lâURL è gestito in modo errato.jwks_uri: Un URL al documento JWK del client, che se creato in modo malevolo, può causare al server di effettuare richieste outbound a un server controllato dallâattaccante.sector_identifier_uri: Riferisce a un array JSON diredirect_uris, che il server potrebbe recuperare, creando unâopportunitĂ SSRF.request_uris: Elenca gli URI di richiesta consentiti per il client, che possono essere sfruttati se il server recupera questi URI allâinizio del processo di autorizzazione.
Strategia di sfruttamento:
- SSRF può essere attivato registrando un nuovo client con URL malevoli in parametri come
logo_uri,jwks_uriosector_identifier_uri. - Sebbene lo sfruttamento diretto tramite
request_urispossa essere mitigato da controlli di whitelist, fornire unrequest_uripre-registrato e controllato dallâattaccante può facilitare SSRF durante la fase di autorizzazione.
Condizioni di gara dei fornitori OAuth
Se la piattaforma che stai testando è un fornitore OAuth leggi questo per testare possibili condizioni di gara.
Attacco ai reclami mutabili
In OAuth, il campo sub identifica univocamente un utente, ma il suo formato varia a seconda del server di autorizzazione. Per standardizzare lâidentificazione degli utenti, alcuni client utilizzano email o handle utente. Tuttavia, questo è rischioso perchĂŠ:
- Alcuni server di autorizzazione non garantiscono che queste proprietĂ (come lâemail) rimangano immutabili.
- In alcune implementazioniâcome âAccedi con Microsoftââil client si basa sul campo email, che è controllato dallâutente in Entra ID e non verificato.
- Un attaccante può sfruttare questo creando la propria organizzazione Azure AD (ad esempio, doyensectestorg) e utilizzandola per eseguire un accesso Microsoft.
- Anche se lâObject ID (memorizzato in sub) è immutabile e sicuro, la dipendenza da un campo email mutabile può consentire un takeover dellâaccount (ad esempio, dirottare un account come victim@gmail.com).
Attacco di confusione del client
In un Attacco di confusione del client, unâapplicazione che utilizza il flusso implicito OAuth non verifica che il token di accesso finale sia specificamente generato per il proprio Client ID. Un attaccante imposta un sito web pubblico che utilizza il flusso implicito OAuth di Google, ingannando migliaia di utenti a effettuare il login e raccogliendo cosĂŹ i token di accesso destinati al sito dellâattaccante. Se questi utenti hanno anche account su un altro sito vulnerabile che non convalida il Client ID del token, lâattaccante può riutilizzare i token raccolti per impersonare le vittime e prendere il controllo dei loro account.
Attacco di aggiornamento dello scope
Il tipo Authorization Code Grant implica comunicazione sicura server-server per trasmettere i dati degli utenti. Tuttavia, se il Server di Autorizzazione si fida implicitamente di un parametro scope nella richiesta del token di accesso (un parametro non definito nel RFC), unâapplicazione malevola potrebbe aggiornare i privilegi di un codice di autorizzazione richiedendo uno scope piĂš elevato. Dopo che il Token di Accesso è generato, il Server delle Risorse deve verificarlo: per i token JWT, questo comporta il controllo della firma JWT ed estrarre dati come client_id e scope, mentre per i token a stringa casuale, il server deve interrogare il Server di Autorizzazione per recuperare i dettagli del token.
Hijacking dello schema di reindirizzamento
Nelle implementazioni OAuth mobili, le app utilizzano schemi URI personalizzati per ricevere reindirizzamenti con codici di autorizzazione. Tuttavia, poichĂŠ piĂš app possono registrare lo stesso schema su un dispositivo, lâassunzione che solo il client legittimo controlli lâURI di reindirizzamento viene violata. Su Android, ad esempio, un URI Intent come com.example.app:// oauth viene catturato in base allo schema e ai filtri opzionali definiti nel filtro dellâintento di unâapp. PoichĂŠ la risoluzione degli intent di Android può essere ampiaâsoprattutto se viene specificato solo lo schemaâun attaccante può registrare unâapp malevola con un filtro di intento accuratamente progettato per dirottare il codice di autorizzazione. Questo può abilitare un takeover dellâaccount sia attraverso lâinterazione dellâutente (quando piĂš app sono idonee a gestire lâintento) sia tramite tecniche di bypass che sfruttano filtri eccessivamente specifici, come dettagliato dal diagramma di flusso di valutazione di Ostorlab.
Riferimenti
- https://medium.com/a-bugz-life/the-wondeful-world-of-oauth-bug-bounty-edition-af3073b354c1
- https://portswigger.net/research/hidden-oauth-attack-vectors
- https://blog.doyensec.com/2025/01/30/oauth-common-vulnerabilities.html
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
HackTricks

