
Automatisierter CORS-Fehlkonfigurationsscanner, der Origin-Header-Injection, Wildcard-Reflexion und Credential-Leakage in Webanwendungen und APIs testet.

Corsair_scan ist ein Sicherheitstool zum Testen von Fehlkonfigurationen beim Cross-Origin Resource Sharing (CORS). CORS ist ein Mechanismus, der es erlaubt, eingeschränkte Ressourcen auf einer Webseite von einer anderen Domain anzufragen, die nicht die Domain ist, von der die erste Ressource ausgeliefert wurde. Ist dies nicht ordnungsgemäß konfiguriert, können nicht autorisierte Domains auf diese Ressourcen zugreifen.
CORS ist ein auf HTTP-Headern basierender Mechanismus, der es einem Server erlaubt, andere Ursprünge (Domain, Schema oder Port) als den eigenen anzugeben, von denen ein Browser das Laden von Ressourcen erlauben soll. Dies geschieht durch das Hinzufügen neuer HTTP-Header, mit denen Server beschreiben können, welche Ursprünge berechtigt sind, diese Informationen aus einem Webbrowser zu lesen.
CORS stützt sich auch auf einen Mechanismus, bei dem Browser eine "Preflight"-Anfrage an den Server senden, der die Cross-Origin-Ressource hostet, um zu prüfen, ob der Server die eigentliche Anfrage zulassen wird. In diesem Preflight sendet der Browser Header, die die HTTP-Methode und die Header angeben, die in der eigentlichen Anfrage verwendet werden.
Das häufigste und problematischste Sicherheitsproblem bei der Implementierung von CORS ist die fehlende Validierung/Whitelistung von Anfragestellern. Allzu oft sehen wir den Wert für Access-Control-Allow-Origin auf '*' gesetzt.
Leider ist dies der Standardwert und erlaubt daher jeder Domain im Web, auf die Ressourcen dieser Site zuzugreifen.
Gemäß dem OWASP Application Security Verification Standard (ASVS) fordert die Anforderung 14.5.3:
"Verifizieren Sie, dass der Cross-Origin Resource Sharing (CORS) Access-Control-Allow-Origin-Header eine strenge Allow-Liste von vertrauenswürdigen Domains und Subdomains verwendet, um abzugleichen, und den Ursprung 'null' nicht unterstützt."
Corsair_scan funktioniert, indem es eine Anfrage (oder eine Liste von Anfragen), die als Parameter empfangen wird, erneut sendet und dann einen Wert in den Origin-Header injiziert. Abhängig vom Inhalt des Access-Control-Allow-Origin-Headers in der Antwort auf diese Anfrage können wir feststellen, ob die CORS-Konfiguration korrekt ist oder nicht. Es gibt drei Szenarien, die auf eine Fehlkonfiguration von CORS hinweisen:
Wenn CORS als fehlkonfiguriert erkannt wird, prüfen wir, ob die Antwort den Header Access-Control-Allow-Credentials enthält, was bedeutet, dass der Server erlaubt, Credentials in Cross-Origin-Anfragen zu übermitteln.
Häufig verwenden CORS-Konfigurationen Platzhalter, z. B. wird alles unter *.example.com akzeptiert. Das bedeutet, dass die Ursprungsdomain domain.com.evil.com akzeptiert wird, da sie dem angegebenen Regex entspricht. Um dem entgegenzuwirken, testet corsair_scan vier Szenarien:
Dieses Projekt wurde mit Python 3.9 entwickelt, sollte aber mit jeder Python 3.x-Version funktionieren. Die beste Methode zur Installation ist die Verwendung von pip.
pip3 install corsair_scan --user
Corsair kann sowohl als Python-Modul als auch als CLI verwendet werden.
Die Methode, die den CORS-Scan durchführt, ist corsair_scan. Hier ist ihre Definition:
Empfängt eine Liste von Anfragen und einen Parameter, um die Zertifikatsprüfung in der Anfrage zu aktivieren/deaktivieren.
Eingabe:
data [List]: Eine Liste von Anfragen. Jede Anfrage ist ein Dictionary, das die relevanten Daten für die Anfrage enthält:
verify [Boolean] [Default: True]: Sendet diesen Wert für jede Anfrage an corsair_scan_single_url.
Ausgabe:
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))
Antwort:
{'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'}]}}
Im Rahmen der pip-Paketinstallation wird eine CLI installiert. Die Syntax zur Ausführung lautet wie folgt:
corsair FILE [-nv/--noverify][-r/--report]
Die CLI benötigt eine JSON-Datei mit einer Liste von Anfragen, um den Scan durchzuführen. Eine Beispieldatei wird als Teil der Tests bereitgestellt:
[{
"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"
}
}]
Es gibt auch zwei optionale Parameter:
Corsair_scan wurde vom Santander UK Security Engineering Team entwickelt, das sich zusammensetzt aus: