Wie der Angriff funktioniert
Browser senden bei Cross-Origin-Zugriffen einen Origin-Header mit. Der Server entscheidet über die Antwort-Header Access-Control-Allow-Origin (ACAO) und Access-Control-Allow-Credentials (ACAC), welche fremde Herkunft die Antwort lesen darf und ob dabei Cookies/Anmeldedaten mitgeschickt werden dürfen.
Standardmäßig senden Browser bei Cross-Origin-Anfragen keine Credentials (MDN). Fehlkonfigurationen entstehen, wenn der Server eine der folgenden Schwächen aufweist:
- Ungeprüftes Zurückspiegeln: Der Server spiegelt die vom Client gelieferte Origin ungeprüft in ACAO zurück.
- Fehlerhafte Whitelist-Prüfung: Whitelist-Prüfungen werden fehlerhaft per Präfix/Suffix/Regex umgesetzt (z. B. erlaubt "endet auf normal-website.com" auch die vom Angreifer registrierte Domain hackersnormal-website.com, "beginnt mit normal-website.com" auch normal-website.com.evil-user.net).
- Whitelisting von null: Der Server whitelistet den Sonderwert null, den ein Angreifer über eine sandboxed iframe erzeugen kann.
Setzt der Server zusätzlich ACAC: true, kann die Angreifer-Seite via fetch/XMLHttpRequest mit withCredentials=true authentifizierte Anfragen stellen und die Antwort des Opfers auslesen.
Wichtig laut MDN: Bei Anfragen mit Credentials muss der Server eine konkrete Origin statt des Wildcards * angeben. Zudem kann der Origin-Header von Nicht-Browser-Clients wie curl frei gefälscht werden, weshalb er laut OWASP nicht zur Authentifizierung dienen darf.
Zu großzügiges CORS lässt fremde Seiten authentifizierte Daten lesen.
Beispiel
GET /sensitive-victim-data HTTP/1.1
Host: vulnerable-website.com
Origin: https://malicious-website.com
Cookie: sessionid=...HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://malicious-website.com
Access-Control-Allow-Credentials: true
...Auswirkung
Eine fremde, vom Angreifer kontrollierte Website kann im Namen eines eingeloggten Opfers authentifizierte Antworten der API auslesen und so sensible Daten stehlen, etwa API-Keys, CSRF-Tokens oder personenbezogene Daten.
Laut PortSwigger lässt sich dies weiter eskalieren:
- Vertrauensbeziehungen: über Vertrauensbeziehungen zu einer XSS-anfälligen Subdomain.
- Aufbrechen von TLS: über das Aufbrechen von TLS, wenn eine HTTP-Subdomain als vertrauenswürdig gilt.
- Zugriff auf Intranet: bei ACAO: * ohne Credentials als Zugriff auf interne Intranet-Ressourcen, indem der Browser des Opfers als Proxy missbraucht wird.
So schützt man sich
- Origins niemals ungeprüft aus dem Origin-Header zurückspiegeln; in Access-Control-Allow-Origin nur tatsächlich vertrauenswürdige Origins eintragen (PortSwigger).
- Whitelist-Prüfung exakt auf den vollständigen Origin-String durchführen, nicht über Präfix/Suffix-Matching oder fehleranfällige Regex, um Bypass-Domains wie hackersnormal-website.com oder normal-website.com.evil-user.net auszuschließen (PortSwigger).
- Den Wert null nicht whitelisten; Access-Control-Allow-Origin: null vermeiden, da sandboxed/serialisierte Anfragen ihn erzeugen können (PortSwigger).
- Wildcard * nicht zusammen mit Anmeldedaten verwenden - laut MDN muss der Server bei Anfragen mit Credentials eine konkrete Origin angeben; im Internet keine Wildcards für sensible/interne Ressourcen einsetzen (MDN, PortSwigger).
- Den Origin-Header nicht zur Authentifizierung nutzen, da er von Nicht-Browser-Clients (curl/Wget/Burp) frei gefälscht werden kann (OWASP).
- CORS ist kein Ersatz für serverseitige Sicherheit: Authentifizierung auf den zugegriffenen Ressourcen erzwingen und Session-Management sowie Schutz sensibler Daten serverseitig durchsetzen (PortSwigger, OWASP).
Quellen
- Cross-origin resource sharing (CORS) - Web Security Academy PortSwigger, 2026
- Cross-Origin Resource Sharing (CORS) - HTTP | MDN MDN Web Docs (Mozilla), 2026
- Access-Control-Allow-Origin header MDN Web Docs (Mozilla), 2026
- Access-Control-Allow-Credentials header MDN Web Docs (Mozilla), 2026
- CORS OriginHeaderScrutiny OWASP Foundation, 2026