
Scanner automatisé de mauvaises configurations CORS qui teste l'injection d'en-tête Origin, la réflexion de wildcard et la fuite d'identifiants à travers les applications web et les API.

Corsair_scan est un outil de sécurité pour tester les mauvaises configurations de Cross-Origin Resource Sharing (CORS). CORS est un mécanisme qui permet à des ressources restreintes d'une page web d'être demandées depuis un autre domaine que celui à partir duquel la première ressource a été servie. Si cela n'est pas correctement configuré, des domaines non autorisés peuvent accéder à ces ressources.
CORS est un mécanisme basé sur les en-têtes HTTP qui permet à un serveur d'indiquer d'autres origines (domaine, schéma ou port) que la sienne à partir desquelles un navigateur devrait autoriser le chargement de ressources. Il fonctionne en ajoutant de nouveaux en-têtes HTTP qui permettent aux serveurs de décrire quelles origines sont autorisées à lire ces informations depuis un navigateur web.
CORS repose également sur un mécanisme par lequel les navigateurs effectuent une requête « preflight » vers le serveur hébergeant la ressource cross-origin, afin de vérifier que le serveur autorisera la requête réelle. Dans cette pré-vérification, le navigateur envoie des en-têtes qui indiquent la méthode HTTP et les en-têtes qui seront utilisés dans la requête réelle.
Le problème de sécurité le plus courant et le plus problématique lors de l'implémentation de CORS est l'absence de validation/whitelisting des demandeurs. Trop souvent, nous voyons la valeur de Access-Control-Allow-Origin définie sur « * ». Malheureusement, c'est la valeur par défaut et permet ainsi à n'importe quel domaine sur le web d'accéder aux ressources de ce site.
Selon la norme de vérification de sécurité des applications OWASP (ASVS), l'exigence 14.5.3 stipule
Vérifiez que l'en-tête Cross-Origin Resource Sharing (CORS) Access-Control-Allow-Origin utilise une liste d'autorisation stricte de domaines et sous-domaines de confiance pour la correspondance et ne supporte pas l'origine « null ».
Corsair_scan fonctionne en renvoyant une requête (ou une liste de requêtes) reçue en paramètre, puis en injectant une valeur dans l'en-tête Origin. En fonction du contenu de l'en-tête Access-Control-Allow-Origin dans la réponse à cette requête, nous pouvons déterminer si la configuration CORS est correcte ou non. Trois scénarios indiquent que CORS est mal configuré :
Si CORS est mal configuré, nous vérifions si la réponse contient l'en-tête Access-Control-Allow-Credentials, ce qui signifie que le serveur autorise l'inclusion des identifiants dans les requêtes cross-origin.
Souvent, les configurations CORS utilisent des caractères génériques, par exemple en acceptant tout ce qui se trouve sous * example.com *. Cela signifie que le domaine domain.com.evil.com sera accepté car il correspond à l'expression régulière donnée. Pour tenter de contrer cela, corsair_scan teste quatre scénarios :
Ce projet a été développé avec Python 3.9, mais devrait fonctionner avec n'importe quelle version de Python 3.x. La meilleure façon de l'installer est d'utiliser pip.
pip3 install corsair_scan --user
Corsair peut être utilisé à la fois comme un module python ou comme une CLI.
La méthode qui effectue le scan CORS est corsair_scan. Voici sa définition :
Reçoit une liste de requêtes et un paramètre pour activer/désactiver la vérification du certificat dans la requête.
Entrée :
Sortie :
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))
Réponse :