Skip to content

CORS Misconfiguration

OWASP A05 difficulty: kolay-orta

CORS Misconfiguration, Access-Control-Allow-Origin (ACAO) ve Access-Control-Allow-Credentials (ACAC) başlıklarının gevşek ayarlanmasıyla oluşur. Yanlış yapılandırılmış bir API, saldırgan sitesinin kurbanın oturumu ile kimliğe bağlı veriyi okumasına izin verebilir. CSRF’den farkı: CORS zafiyeti yanıt gövdesini okumayı mümkün kılar.

# 1) Origin'i körü körüne yansıtma + credential
Access-Control-Allow-Origin: https://attacker.example
Access-Control-Allow-Credentials: true
# 2) null origin'e güvenme
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true
# 3) Zayıf regex / string kontrolü
# victim.com → victim.com.attacker.com / evilvictim.com

ACAO: * ile ACAC: true tarayıcı tarafından reddedilir; asıl risk dinamik origin yansıtma + credentials’tır. * credentialsız yalnızca public veriyi okutur (düşük etki).

# Simple: GET/POST form-urlencoded — preflight yok
# Non-simple: JSON + custom header → OPTIONS
Access-Control-Allow-Headers: Authorization, Content-Type
Access-Control-Allow-Methods: GET, POST, PUT

Preflight gevşekse bile asıl GET/POST yanıtında da aynı yansıma olmalı.

null origin (sandboxed iframe):

<iframe sandbox="allow-scripts allow-top-navigation allow-forms"
srcdoc=""></iframe>
  1. Origin değiştir — Origin: https://attacker.example ; ACAO yansıyor mu?

  2. Credential doğrula — ACAC: true ? Cookie ile hassas JSON dönüyor mu?

  3. Kenar durumları :

    Origin: null
    Origin: https://victim.com.attacker.example
    Origin: https://attacker.victim.com
    Origin: https://victim.com%60.attacker.example
    Origin: http://victim.com
    Origin: https://victim.com:evil
    Origin: https://victim.com.
  4. Trust listesi — partner subdomain; XSS’li trusted origin → CORS zinciri.

  5. Varyant path’ler — /api/me , /graphql , dosya indirme uçları.

SameSite=Strict/Lax → cross-site cookie kısıtlanabilir
SameSite=None; Secure → CSWSH/CORS riski sürer
Bearer Authorization header JS'te → CORS cookie çalmaz; XSS ayrı
Terminal window
curl -i https://api.victim.com/me \
-H 'Origin: https://evil.example' \
-H 'Cookie: session=...' | grep -i access-control
Terminal window
curl -i -X OPTIONS https://api.victim.com/me \
-H 'Origin: https://evil.example' \
-H 'Access-Control-Request-Method: PUT' | grep -i access-control
ACAO yalnızca https://app.victim.com yansıtıyor
→ app'te XSS bul
→ XSS ile fetch api.victim.com credentials:include
→ veri exfil
□ ACAO reflection + ACAC true
□ null origin
□ suffix/prefix bypass
□ OPTIONS vs GET tutarlılığı
□ Hassas endpoint (/me, /tokens, /export)
□ PoC HTML ile kanıt
Origin reflection + ACAC
→ PoC fetch /me
→ PII / token dump