AMR TECH™ Security Audit
StreamingApps by AMR TECH
Revisión completa del panel de administración — autenticación, seguridad de sesiones, lógica TOTP 2FA, validaciones de entrada, monolito del dashboard y brechas operacionales en producción.
Score General
Veredicto
Componente más robusto del sistema
Listo para producción con correcciones críticas
1,485
Líneas admin-amrtech.php
1,634
Líneas dashboard-amrtech.php
2
Hallazgos Críticos
6
Hallazgos Medios
Este es el componente más sólido del sistema. La implementación de seguridad es excelente: bcrypt para contraseñas, rate limiting en login (5 intentos / 300s), TOTP 2FA, tokens de sesión con random_bytes(), hash_equals() para comparación resistente a timing-attack y prepared statements en toda la capa de datos. El panel admin es de calidad producción.
Las brechas son principalmente en observabilidad (sin audit log) y features operacionales faltantes (sin exportación, sin timeout de sesión, sin enforcement de 2FA). Los 2 hallazgos críticos están en la lógica de validación del SCRAPER_TOKEN.
SCRAPER_TOKEN vacío = bypass auth. Reset de password con el mismo token vulnerable.
Sin audit log, sin exportación, 2FA no forzado, sin timeout de sesión, monolito 1634 líneas.
bcrypt, rate limiting, random_bytes(), hash_equals(), TOTP 2FA, prepared statements — industria estándar.
admin-amrtech.php · Línea 243
Si SCRAPER_TOKEN no está definido en el .env, la condición cortocircuita y permite paso sin autenticación. El catálogo completo queda expuesto a reset no autorizado.
Código Vulnerable (actual)
Corrección Recomendada
.env incompleto, el endpoint queda abierto públicamente.
admin-amrtech.php · Líneas 257–280
El flujo de reset de contraseña reutiliza SCRAPER_TOKEN como mecanismo de verificación — el mismo token expuesto en C1. No hay OTP por email, no hay token de tiempo limitado (time-bounded), ni enlace firmado. Quien conozca SCRAPER_TOKEN puede resetear la contraseña de cualquier usuario admin.
Flujo Actual
token=SCRAPER_TOKEN + nuevo password
hash_equals (reutiliza mismo token)
Flujo Recomendado
random_bytes(32)
expires_at = NOW() + 15min
.env o que haya interceptado el token puede tomar control permanente del panel admin sin necesitar la contraseña original. El token es estático y nunca expira.
Ambos archivos — persistencia
Las acciones del admin (login, cambios de productos, modificaciones de usuarios) no tienen rastro forense persistido en base de datos. Si el sistema es comprometido, es imposible determinar qué cambió o cuándo.
admin_audit_log con campos: timestamp, admin_id, action, ip, data_before, data_after. Insertar en cada mutación.
dashboard-amrtech.php — ops
No hay manera de exportar datos de ventas, inventario o clientes a CSV/Excel desde el panel. Operacionalmente esto fuerza consultas directas a DB o trabajo manual, aumentando riesgo de errores.
fputcsv(), headers correctos de Content-Disposition y sanitización de datos.
dashboard-amrtech.php — maintainability
El dashboard mezcla queries a DB, lógica de negocio y HTML en un único archivo de 1,634 líneas. Esto dificulta el testing, genera mayor superficie de ataque y hace que cualquier refactor requiera cirugía completa del archivo.
admin-amrtech.php — access control
Los roles admin/super-admin existen ($_SESSION['admin_role']) pero no hay permisos granulares (leer sin editar, ver reportes sin modificar productos, etc.).
admin_role_permissions con bitmask o JSON de capacidades.
admin-amrtech.php · lógica TOTP
TOTP solo se activa si el usuario tiene totp_secret configurado. Un admin puede operar sin 2FA indefinidamente si no completó el onboarding de TOTP.
2fa_required en DB + redirect obligatorio a pantalla de setup TOTP si no está enrollado.
admin-amrtech.php — session management
Las sesiones persisten hasta logout explícito. Sin timeout por inactividad, una sesión abierta en un equipo desatendido permanece activa indefinidamente — riesgo físico real en accesos compartidos.
if (time() - $_SESSION['last_activity'] > 1800) { session_destroy(); redirect('/login'); }
Uso de password_verify() + password_hash($pwd, PASSWORD_BCRYPT). Estándar de industria — protege contra rainbow tables y fuerza bruta offline.
rateLimit('admin_login_' . $clientIp, 5, 300) — Previene ataques de fuerza bruta y credential stuffing. Implementación por IP correcta.
$sessionToken = bin2hex(random_bytes(16)) — CSPRNG de PHP. Imposible de predecir o clonar. Mucho mejor que uniqid().
hash_equals($storedToken, $providedToken) — Previene timing-attacks donde un atacante mide microsegundos de respuesta para inferir caracteres del token.
Implementación de autenticación de dos factores basada en tiempo. Compatible con Google Authenticator y Authy. Segundo factor real, no SMS (que es phisheable).
Patrón $pdo->prepare() + execute([$params]) consistente en todo el código. Elimina por diseño el vector de SQL Injection — cero concatenación de strings en queries.
Separación entre roles admin y super-admin almacenada en sesión. Verificación de rol en endpoints protegidos. Base sólida para extender a RBAC granular.
Si SCRAPER_TOKEN === '' → http_response_code(500); die(). Nunca permitir paso. Validar también en el endpoint de password reset que el token no puede ser la cadena vacía.
Generar token único en DB (random_bytes(32)), almacenar con expires_at a 15 minutos, enviar por email. Invalidar inmediatamente al usar.
Schema: id, timestamp, admin_id, action, entity_type, entity_id, ip_address, data_before JSON, data_after JSON. INSERT en cada mutación de productos, usuarios y órdenes.
Al inicio de cada request admin: if (time() - $_SESSION['last_activity'] > 1800) { session_destroy(); header('Location: /login'); exit; } + actualizar $_SESSION['last_activity'] = time();
Añadir campo totp_required TINYINT DEFAULT 1. Si admin no tiene totp_secret y totp_required=1, redirect obligatorio a pantalla de enrollment de TOTP antes de acceder al dashboard.
Endpoint protegido (solo super-admin) con Content-Type: text/csv y Content-Disposition: attachment. Usar fputcsv() con sanitización. Registrar descarga en audit log.
Extraer a clases: ProductService, OrderService, UserService, ReportService. El archivo HTML template solo llama a métodos, sin lógica inline. Mejora testabilidad y reduce superficie de ataque.
⚡ AMR TECH™ · Desarrollado / Auditado por Anderson Mares
Generado automáticamente por Claude Code Agent · StreamingApps Security Audit Suite v1.1.0