--- name: testing-cors-misconfiguration description: Identifying and exploiting Cross-Origin Resource Sharing misconfigurations that allow unauthorized cross-domain data access and credential theft during security assessments. domain: cybersecurity subdomain: web-application-security tags: - penetration-testing - cors - web-security - owasp - same-origin-policy - burpsuite version: '1.0' author: mahipal license: Apache-2.0 nist_csf: - PR.PS-01 - ID.RA-01 - PR.DS-10 - DE.CM-01 --- # Testing CORS Misconfiguration ## When to Use - During authorized penetration tests when assessing API endpoints for cross-origin access controls - When testing single-page applications that make cross-origin API requests - For evaluating whether sensitive data can be exfiltrated from a victim's browser session - When assessing microservice architectures with multiple domains sharing data - During security audits of applications using CORS headers for cross-domain communication ## Prerequisites - **Authorization**: Written penetration testing agreement for the target - **Burp Suite Professional**: For intercepting and modifying Origin headers - **Browser with DevTools**: For observing CORS behavior in real browser context - **Attacker web server**: For hosting CORS exploitation PoC pages - **curl**: For manual CORS header testing - **Python HTTP server**: For hosting exploit pages locally ## Workflow ### Step 1: Identify CORS Configuration on Target Endpoints Check all API endpoints for CORS response headers. ```bash # Test with a foreign Origin header curl -s -I \ -H "Origin: https://evil.example.com" \ "https://api.target.example.com/api/user/profile" # Check for CORS headers in response: # Access-Control-Allow-Origin: https://evil.example.com (BAD: reflects any origin) # Access-Control-Allow-Origin: * (BAD if with credentials) # Access-Control-Allow-Credentials: true (allows cookies) # Access-Control-Allow-Methods: GET, POST, PUT, DELETE # Access-Control-Allow-Headers: Authorization, Content-Type # Access-Control-Expose-Headers: X-Custom-Header # Test multiple endpoints for endpoint in /api/user/profile /api/user/settings /api/transactions \ /api/admin/users /api/account/balance; do echo "=== $endpoint ===" curl -s -I \ -H "Origin: https://evil.example.com" \ "https://api.target.example.com$endpoint" | \ grep -i "access-control" echo done ``` ### Step 2: Test Origin Reflection and Validation Bypass Determine how the server validates the Origin header. ```bash # Test 1: Arbitrary origin reflection curl -s -I -H "Origin: https://evil.com" \ "https://api.target.example.com/api/user/profile" | grep -i "access-control-allow-origin" # Test 2: Null origin curl -s -I -H "Origin: null" \ "https://api.target.example.com/api/user/profile" | grep -i "access-control-allow-origin" # Test 3: Subdomain matching bypass curl -s -I -H "Origin: https://evil.target.example.com" \ "https://api.target.example.com/api/user/profile" | grep -i "access-control-allow-origin" # Test 4: Prefix/suffix matching bypass curl -s -I -H "Origin: https://target.example.com.evil.com" \ "https://api.target.example.com/api/user/profile" | grep -i "access-control-allow-origin" curl -s -I -H "Origin: https://eviltarget.example.com" \ "https://api.target.example.com/api/user/profile" | grep -i "access-control-allow-origin" # Test 5: Protocol downgrade curl -s -I -H "Origin: http://target.example.com" \ "https://api.target.example.com/api/user/profile" | grep -i "access-control-allow-origin" # Test 6: Special characters in origin curl -s -I -H "Origin: https://target.example.com%60.evil.com" \ "https://api.target.example.com/api/user/profile" | grep -i "access-control-allow-origin" # Test 7: Wildcard with credentials check curl -s -I -H "Origin: https://evil.com" \ "https://api.target.example.com/api/public" | grep -iE "access-control-allow-(origin|credentials)" # Wildcard (*) + credentials (true) is invalid per spec but some servers misconfigure ``` ### Step 3: Test Preflight Request Handling Assess how the server handles OPTIONS preflight requests. ```bash # Send preflight request curl -s -I -X OPTIONS \ -H "Origin: https://evil.example.com" \ -H "Access-Control-Request-Method: PUT" \ -H "Access-Control-Request-Headers: Authorization, Content-Type" \ "https://api.target.example.com/api/user/profile" # Check: # Access-Control-Allow-Methods: should only list needed methods # Access-Control-Allow-Headers: should only list needed headers # Access-Control-Max-Age: preflight cache duration (long = risky) # Test if dangerous methods are allowed curl -s -I -X OPTIONS \ -H "Origin: https://evil.example.com" \ -H "Access-Control-Request-Method: DELETE" \ "https://api.target.example.com/api/user/profile" | \ grep -i "access-control-allow-methods" # Test if preflight is cached too long curl -s -I -X OPTIONS \ -H "Origin: https://evil.example.com" \ -H "Access-Control-Request-Method: GET" \ "https://api.target.example.com/api/user/profile" | \ grep -i "access-control-max-age" # max-age > 86400 (1 day) allows prolonged abuse after policy change ``` ### Step 4: Craft CORS Exploitation Proof of Concept Build an HTML page that exploits the CORS misconfiguration to steal data. ```html