tags: CORS CORS_Vulnerability CORS_Test_Manuale
Per prima cosa dobbiamo trovare una pagina con dei dati che ci potrebbero interessare come API keys o credenziali di un’eventuale vittima. Le pagine più comuni sono /me, /account, /api/settings o /messages.
Una volta scelta la pagina possiamo inziare a testarla, mettiamo caso che la richiesta sia:
GET /accountDetails HTTP/2
Host: 0a3d005b0447278c8001038900930016.web-security-academy.net
Cookie: session=rAf4usgwVq9cz5rpXQ2ep8LUBYXOG1Ie
Sec-Ch-Ua-Platform: "Linux"
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
Sec-Ch-Ua: "Not(A:Brand";v="8", "Chromium";v="144"
Sec-Ch-Ua-Mobile: ?0
Accept: */*
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://0a3d005b0447278c8001038900930016.web-security-academy.net/my-account?id=wiener
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Priority: u=1, iAggiungiamo un header come:
Origin: https://pippo.comNon è necessario che esista veramente il sito.
Se nella risposta troviamo i seguenti header:
Access-Control-Allow-Origin: https://pippo.com
Access-Control-Allow-Credentials: trueSignifica che la vulnerabilità esiste e che possiamo rubare i dati che ci interessano tramite uno script ed un attacco di phishing.
La riflessione deve essere esatta
Se tu invii Origin: https://pippo.com, il server deve rispondere esattamente con Access-Control-Allow-Origin: https://pippo.com. Se risponde con un dominio diverso (es. quello che avevi scritto tu: https://sito-malevolo.com), significa che il server ha una whitelist fissa. In quel caso non è “riflessione arbitraria”, ma il server si fida solo di quel dominio specifico. La vulnerabilità esiste solo se il server “pappagalla” qualsiasi cosa tu gli mandi.
Riassunto della “Ricetta” per il test
Per confermare la vulnerabilità, la risposta deve soddisfare contemporaneamente queste tre condizioni:
-
Riflessione: L’header
Originche hai inventato viene restituito identico inAccess-Control-Allow-Origin. -
Credenziali: È presente l’header
Access-Control-Allow-Credentials: true. -
Contenuto: La pagina contiene dati privati (API key, CSRF token, email, dati personali).
Cosa succede se manca uno dei due?
-
C’è la riflessione ma manca
Credentials: true: Il browser della vittima non invierà i cookie di sessione. Lo script riceverà una risposta “vuota” o un errore di permessi, rendendo inutile l’attacco per rubare dati privati. -
C’è
Credentials: truema l’ACAO è*(asterisco): Molti pensano che l’asterisco sia il massimo della vulnerabilità, ma i browser moderni bloccano le richieste con credenziali se l’origine è un jolly (*). Il server è costretto a specificare un dominio reale affinché il browser permetta la lettura dei dati sensibili.