Respuesta rápida
SPAs modernas (React, Vue, Svelte) reciben flags como isAdmin: false desde el servidor y los usan para condicionar qué UI mostrar. El bug: si los flags también determinan si se permite ejecutar las acciones admin server-side (en lugar de chequear el rol real del JWT), basta con flipear el boolean en la response para desbloquear el panel admin entero. Quora pagó $3,500 (H1 #3567641) por exactamente esto — 30+ flags, UserAdminLogPaginationQuery ejecutable con sesión normal, GraphQL admin map completo. El patrón aparece en 80%+ de admin panels de SaaS Series A/B.
1. La clase de bug: client-side enforcement
CWE-602 "Client-Side Enforcement of Server-Side Security". La arquitectura vulnerable:
[Server] ──"isAdmin: false"──→ [Client React]
│
▼
if (isAdmin) <AdminPanel/>
│
▼ user clicks button
POST /admin/delete-user
│
▼
[Server] ✅ procesa sin chequear rol
El frontend gating es solo UX. Si el server no re-valida el rol antes de ejecutar acciones, el atacante:
- Manipula la response para que el frontend renderice los controles admin.
- Usa esos controles para invocar las acciones.
- El server las ejecuta porque "creía" que solo el frontend admin las podía llamar.
2. Detección — el script de 6 líneas
Cuando llegas a un target y haces login con cuenta normal, pega esto en DevTools Console:
// Detect client-side admin flags in initial state
const text = document.documentElement.innerHTML;
const matches = text.match(/"(is[A-Z]\w+|can[A-Z]\w+|enable\w+|allow\w+)":\s*(true|false)/g) || [];
const interesting = matches.filter(m => /admin|debug|internal|dev|super|test|moderat/i.test(m));
console.table(interesting.map(m => m.replace(/[":,\s]/g, " ").trim().split(" ")));
Si la tabla tiene 5+ flags con admin/debug/internal/moderat en el nombre y todos a false → vulnerable a este bypass con alta probabilidad. Si tiene 30+ → es el report del año.
Real-world output (Quora caso 2026)
isAdminMode false
isAdmin false
tribes_super_admin false
isAdminLogTab false
isDevCode false
isCanaryRevision false
debugToolsEnabled false
isMemberQuoraEmployee false
EnableSubscriptionsDebugMode false
... (30+ flags adicionales)
Sigue leyendo el chain completo
La parte que falta incluye el PoC paso a paso, código de explotación y la cadena completa que llevó al impacto. Disponible para suscriptores.
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.
Practica esto en un lab
Client Side Admin Bypass
Sigue aprendiendo · cuenta gratis
Guarda tu progreso, desbloquea payloads avanzados y rankea tus flags.
Artículos relacionados
DOM XSS — gadgets, postMessage handlers y CVE-2025-59840
DOM XSS no es solo innerHTML. Sources/sinks, gadget chains via toString(), postMessage handlers sin origin check, hash-based routing rotos.
Análisis JavaScript client-side — endpoints, secrets y source maps
Extracción de endpoints ocultos de JS bundles, detección de secrets, análisis de source maps y dynamic instrumentation con Frida para auditar lógica client-side.
IDOR y BAC — metodología manual para encontrar broken access control
Cómo identificar IDOR (Insecure Direct Object Reference) y BAC (Broken Access Control) manualmente: dual-account testing, parameter swap, role escalation, hidden parameters.
