
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 :
{'report': [{'fake_origin': {'Access-Control-Allow-Origin': 'https://scarymonster.com',
'Origin': 'https://scarymonster.com',
'credentials': True,
'error': False,
'misconfigured': True,
'status_code': 200},
'post-domain': {'Access-Control-Allow-Origin': 'https://example.com.scarymonster.com',
'Origin': 'https://example.com.scarymonster.com',
'credentials': True,
'error': False,
'misconfigured': True,
'status_code': 200},
'pre-domain': {'Access-Control-Allow-Origin': 'https://scarymonsterexample.com',
'Origin': ' https://scarymonsterexample.com',
'credentials': True,
'error': False,
'misconfigured': True,
'status_code': 200},
'sub-domain': {'Access-Control-Allow-Origin': 'https://scarymonster.example.com',
'Origin': 'https://scarymonster.example.com',
'credentials': True,
'error': False,
'misconfigured': True,
'status_code': 200},
'url': 'https://example.com/',
'verb': 'GET'}],
'summary': {'error': [], 'misconfigured': [{'credentials': True,
'misconfigured_test': ['fake_origin',
'sub-domain',
'pre-domain',
'post-domain'],
'status_code': 200,
'url': 'https://domain.com',
'verb': 'GET'}]}}
Dans le cadre de l'installation du paquet pip, une CLI est installée. La syntaxe d'exécution est la suivante :
corsair FILE [-nv/--noverify][-r/--report]
La CLI a besoin d'un fichier json avec une liste de requêtes pour effectuer le scan. Un exemple de fichier est fourni dans le cadre des tests :
[{
"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"
}
}]
Il existe également deux paramètres optionnels :
Corsair_scan a été développé par l'équipe de sécurité de Santander UK qui sont :