Securing API Servers
Cross Origin Resource Sharing (CORS)
A grosso modo, CORS (Cross-Origin Resource Sharing) es una política de seguridad de los navegadores que:
❌ Evita que una web cargada desde un dominio (ej: evil.com) haga peticiones a otro dominio (ej: api.victima.com) sin permiso.
💥 ¿Por qué existe?
Para proteger a los usuarios del robo de datos o ejecución de acciones no autorizadas desde scripts maliciosos.
¿Cómo se permite?
El servidor (api.victima.com
) debe responder con headers especiales como:
Con eso le dice al navegador:
"Sí, permito que este origen me consulte."
CORS PERMITE bloquear que un sitio no permitido en la API no pueda compartir recursos maliciosos a otros dominios victimas.
¿Qué hace Cross-Origin-Resource-Policy
?
Cross-Origin-Resource-Policy
?Evita que otros sitios (otros orígenes) incrusten o carguen recursos desde tu servidor si tú no lo permites.
Piensa en esto como una muralla contra ataques tipo CSRF a imágenes, side-channel y data leaks a través de recursos compartidos.
🧱 Valores permitidos y su explicación
same-origin
🔒 Solo el mismo origen puede cargar el recurso.
same-site
🟡 Orígenes del mismo sitio (subdominios incluidos, ej. a.evil.com
, b.evil.com
) pueden cargarlo.
cross-origin
(o *
)
🌐 Cualquier origen puede cargar el recurso.
null
❌ No válido aquí. No es un valor permitido para este header. Si lo pones, se ignora o puede lanzar error.
Quiz:
Error Disclosure:
Error generico, exista o no exista el recurso un 404 en github es retornando y es un buen ejemplo de buena practica.
Quiz:
Information Leak
Google dork: “Uvicorn CVE”
Otro ejemplo:
Quiz:
Insecure Cookies:
Cookies are storing data on a customer's computer, and secure cookies are ones that are created that don't restrict the access to anybody who might want to read that data.
When a cookie is created, it has certain security settings that can be created, such as the Secure option, the HTTP Only option, and then restricting what sites are allowed to read the cookie.
Quiz
Path Traversal:
Quiz:
Rate Limit:
HTTP Status: 429
too many requests
try captCHA that will make the difference.
Bloquear luego de muchas requests per second.
4 digits es apura fuerza bruta viendo cual posible combinacion retorne un 200 o un 302
user enumeration es tirar lo mismo en busca de diferencias en la response received, length de las respuestas con el fin de poder ver si hay diferencias y de esta manera ir identificando users existentes, etc.
scrapping
Resumen de los Tech Tips contra Rate Limits:
Evita operaciones SQL para manejar throttling
🔒 Pro: Son lentas y pueden ser explotadas (DoS, SQLi).
🧠 Idea: Usa almacenamiento en memoria (como Redis o Memcached), mucho más rápido.
Evita operaciones en disco
🔒 Pro: Leer/escribir en disco es lento y escalable solo hasta cierto punto.
🧠 Idea: Guarda el conteo de peticiones en memoria, no en archivos.
Incluye la IP junto con el usuario
🔒 Pro: Previene que varios atacantes usen un solo user/token desde múltiples IPs.
🛠️ Contra para atacante: Cambiar de IP ya no basta, también necesita cuentas nuevas.
Usa caché para respuestas repetidas (misma query)
🔒 Pro: Si muchos usuarios hacen la misma query, mejor devuelve una respuesta cacheada.
🛠️ Contra para atacante: Puede dificultar fuzzing si siempre se recibe la misma respuesta cacheada.