eWPT · Authentication & Authorization
CSRF Attacks
Difficoltà: Intermediate Time to Master: 2h Prerequisiti: 02-Session-Hijacking.md Lab: PortSwigger Academy, modulo CSRF
Obiettivo
Il CSRF gioca sporco con una caratteristica innocua del browser: allega sempre i cookie di sessione, indipendentemente da chi ha originato la richiesta. Qui vedi come costruire richieste malevole che sfruttano l’autenticazione già attiva della vittima nel suo browser, forzando azioni indesiderate (cambio password, trasferimento fondi, modifica email) senza che se ne accorga.
Concetti chiave
Perché funziona
Il browser allega automaticamente i cookie di sessione ad ogni richiesta verso il dominio corrispondente, indipendentemente dal sito che ha originato la richiesta: se l’app non verifica un token anti-CSRF o l’origine della richiesta, non distingue una richiesta legittima da una forzata.
Dal 2020 i browser moderni impostano SameSite=Lax di default sui cookie che non specificano l’attributo, il che blocca già molte richieste cross-site via POST/fetch/XHR. Un token anti-CSRF (o un controllo Origin) resta comunque necessario perché Lax non protegge gli endpoint GET che cambiano stato (navigazione top-level, vedi Evasion), non protegge da richieste provenienti da un subdomain dello stesso “site”, e molte API impostano deliberatamente SameSite=None per supportare integrazioni cross-site legittime, perdendo così la protezione di default.
Difese comuni e come verificarle
| Difesa | Come verificarne l’assenza/debolezza |
|---|---|
| CSRF token | rimuovi il parametro token, o riusa un token di un’altra sessione |
Controllo header Referer/Origin |
rimuovi l’header o testa se il controllo è bypassabile |
SameSite=Strict/Lax sul cookie |
verifica il flag nel Set-Cookie |
Strumenti
| Tool | Comando base | Output | Note |
|---|---|---|---|
| Burp: Generate CSRF PoC | click destro su richiesta > Engagement tools | HTML pronto | genera il form automaticamente |
| Browser | apertura HTML PoC | esecuzione reale | verifica finale |
Payload / Esempi
Esempio 1: form CSRF per cambio password
<html>
<body>
<form action="http://target.com/admin/change_password" method="POST">
<input type="hidden" name="new_password" value="hacker123">
<input type="hidden" name="confirm_password" value="hacker123">
<input type="submit" value="Click here to win a prize">
</form>
<script>document.forms[0].submit()</script>
</body>
</html>
Spiegazione: l’auto-submit via JS elimina la necessità che la vittima clicchi manualmente; basta che visiti la pagina mentre è loggata sul target.
Esempio 2: CSRF via GET (più semplice, se l’endpoint accetta GET per azioni sensibili)
<img src="http://target.com/api/transfer?to=attacker&amount=1000" style="display:none">
Spiegazione: un endpoint che modifica stato accettando GET è vulnerabile anche solo caricando un’immagine, senza bisogno di form/JS.
Esempio 3: bypass token CSRF presente ma non legato alla sessione
1. Ottieni un CSRF token valido dalla TUA sessione (login come te stesso)
2. Riusa quel token nel form malevolo inviato alla vittima
3. Se il server valida solo "il token esiste ed è valido" senza legarlo alla sessione specifica, l'attacco funziona comunque
Esempio 4: bypass controllo Referer con meta tag
<meta name="referrer" content="no-referrer">
<form action="http://target.com/admin/change_password" method="POST">
...
</form>
Spiegazione: se il server rifiuta solo richieste CON un Referer sbagliato ma accetta quelle senza Referer, sopprimere l’header bypassa il controllo.
Evasion / Bypass Techniques
Bypass SameSite=Lax con navigazione top-level
SameSite=Lax (default in molti browser moderni) blocca richieste cross-site fatte via fetch/form in iframe, ma permette navigazione diretta top-level (click su link, redirect GET). Un endpoint GET sensibile resta sfruttabile anche con SameSite=Lax.
Bypass basato su subdomain (cookie scoping ampio)
Se il cookie è impostato con Domain=.target.com (non ristretto al subdomain esatto), un XSS o controllo debole su QUALSIASI subdomain può condurre CSRF sul dominio principale.
Lab Hands-On
Lab 1: PortSwigger, CSRF where token validation depends on request method
Obiettivo: bypassare validazione token cambiando metodo HTTP Difficulty: Medio Time: 30 min
Walkthrough breve:
- Osserva che il token è validato solo su POST
- Ripeti la stessa azione via GET
- Conferma che l’azione avviene senza validazione token
Common Mistakes
- Testare solo endpoint POST -> molti endpoint GET modificano stato senza che gli sviluppatori se ne accorgano, e sono ancora più facili da sfruttare
- Non verificare se il token è legato alla sessione specifica -> un token “valido ma non legato” ti sembra una protezione solida finché non scopri che non lo è
Link Utili
Connessioni
- Prerequisito: 02-Session-Hijacking.md
- Prossimo Step: 04-IDOR.md
Checklist di padronanza
- So costruire un PoC CSRF con auto-submit
- So testare se un token è legato alla sessione specifica
- So verificare il flag SameSite e le sue reali limitazioni
- So usare il generatore CSRF PoC di Burp