CORS - Cross-Origin Resource Sharing
Cross-origin resource sharing (CORS) is a browser mechanism that
controls how content running on other domains can perform two-way
interactions with the domain that publishes the policy. If another
domain is allowed by the policy, then that domain can potentially
attack users of the application. If a user is logged in to the
application, and visits a domain allowed by the policy, then any
malicious content running on that domain can potentially retrieve
content from the application, and sometimes carry out actions within
the security context of the logged in user. These are the steps I
usually follow to try and find a CORS vulnerability:
-
Check if responses have the
Access-Control-Allow-Credentials
header set to true. - If they do, note down which one of those responses might have relevant information to be forwarded to an external domain.
-
Add an external domain to
Origin
and check if it gets reflected back in theAccess-Control-Allow-Origin
header. If it does, it means that the server accepts cross domain requests. -
Do the same test with
Origin: null
to see if it gets reflected back. If it does, a request from within an iframe can be made to exploit it. - Try to understand which domains are whitelisted.
- If a vulnerability from any whitelisted domain can be leveraged (XSS or Open Redirect), use it to do a request from it.
-
Test without the
Origin
header to see if the requests still get blocked. In 'no-cors' mode, the browser does not include the Origin header in the request and the server's response is opaque, meaning that its contents cannot be accessed by JavaScript code. This mode is intended for cases where the response from the server is not needed, such as when making a request to a third-party analytics service. It can be used to exploit CORS when requests without theOrigin
header are allowed.