
Scanner automatizzato per la configurazione errata CORS che testa l'iniezione dell'header Origin, la riflessione del wildcard e la perdita di credenziali attraverso applicazioni web e API.

Corsair_scan è uno strumento di sicurezza per testare configurazioni errate di Cross-Origin Resource Sharing (CORS). CORS è un meccanismo che consente di richiedere risorse limitate su una pagina web da un dominio diverso da quello in cui è stata servita la prima risorsa. Se non è configurato correttamente, domini non autorizzati possono accedere a tali risorse.
CORS è un meccanismo basato su intestazioni HTTP che permette a un server di indicare eventuali altre origini (dominio, schema o porta) diverse dalla propria da cui un browser dovrebbe consentire il caricamento di risorse. Funziona aggiungendo nuove intestazioni HTTP che consentono ai server di descrivere quali origini sono autorizzate a leggere tali informazioni da un browser web.
CORS si basa anche su un meccanismo mediante il quale i browser effettuano una richiesta "preflight" al server che ospita la risorsa cross-origin, per verificare che il server consentirà la richiesta effettiva. In tale preflight, il browser invia intestazioni che indicano il metodo HTTP e le intestazioni che verranno utilizzate nella richiesta effettiva.
Il problema di sicurezza più comune e problematico nell'implementazione di CORS è la mancata validazione/whitelist dei richiedenti. Troppo spesso vediamo il valore di Access-Control-Allow-Origin impostato a '*'.
Purtroppo, questo è il valore predefinito e quindi consente a qualsiasi dominio sul web di accedere alle risorse del sito.
Secondo lo standard di verifica della sicurezza delle applicazioni OWASP (ASVS), il requisito 14.5.3 afferma
Verificare che l'intestazione Access-Control-Allow-Origin del Cross-Origin Resource Sharing (CORS) utilizzi una lista di autorizzazione rigorosa di domini e sottodomini attendibili per la corrispondenza e non supporti l'origine "null".
Corsair_scan funziona reinviando una richiesta (o un elenco di richieste) ricevuta come parametro e quindi iniettando un valore nell'intestazione Origin. A seconda del contenuto dell'intestazione Access-Control-Allow-Origin nella risposta a questa richiesta, possiamo stabilire se la configurazione CORS è corretta o meno. Ci sono tre scenari che indicano che CORS è configurato in modo errato:
Se si scopre che CORS è configurato in modo errato, controlliamo se la risposta contiene l'intestazione Access-Control-Allow-Credentials, il che significa che il server consente di includere le credenziali nelle richieste cross-origin.
Spesso, le configurazioni CORS utilizzano caratteri jolly, ad esempio accettando qualsiasi cosa sotto example.com. Ciò significa che l'origine domain.com.evil.com verrà accettata poiché corrisponde all'espressione regolare data. Per cercare di contrastare ciò, corsair_scan testa quattro scenari:
Questo progetto è stato sviluppato con Python 3.9, ma dovrebbe funzionare con qualsiasi versione di Python 3.x. Il modo migliore per installarlo è tramite pip.
pip3 install corsair_scan --user
Corsair può essere utilizzato sia come modulo python che come CLI.
Il metodo che esegue la scansione CORS è corsair_scan. Ecco la sua definizione:
Riceve una lista di richieste e un parametro per abilitare/disabilitare il controllo del certificato nella richiesta
Input:
Output:
import corsair_scan.corsair_scan as corsair
url_data = {}
data = []
verb = 'GET'
url = 'https://example.com/'
params = 'user=user1&password=1234'
headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'en-GB,en;q=0.5', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1',
'Origin': 'https://example.com',
'Host': 'example.com'}
url_data['verb'] = verb
url_data['url'] = url
url_data['params'] = params
url_data['headers'] = headers
data.append(url_data)
print (corsair.corsair_scan(data, verify=True))
Risposta: