Auditoría de vulnerabilidades web para el sitio y el panel de tu servidor de MU Online
Realiza una auditoría completa de seguridad web en el sitio, el panel de control y la tienda de tu servidor de MU Online: SQL Injection, XSS, fallas de autenticación, exposición de datos y una lista de verificación de corrección priorizada.
El sitio y el panel de control son, en la mayoría de los servidores privados de MU Online, la superficie de ataque más expuesta y menos protegida — mucho más que el propio GameServer, que generalmente ya recibió atención de seguridad del emulador. Un panel vulnerable permite el robo de cuentas, la m
El sitio y el panel de control son, en la mayoría de los servidores privados de MU Online, la superficie de ataque más expuesta y menos protegida — mucho más que el propio GameServer, que generalmente ya recibió atención de seguridad del emulador. Un panel vulnerable permite el robo de cuentas, la manipulación de Zen/Cash, la filtración de datos de jugadores y, en casos graves, el acceso al servidor de base de datos entero. Este tutorial recorre una auditoría de vulnerabilidades web completa, cubriendo las fallas más comunes encontradas en sitios y paneles de este nicho, con pasos prácticos de identificación y corrección.
Por qué el sitio es el blanco más común
A diferencia del cliente del juego, que corre en la computadora del jugador y exige ingeniería inversa para ser atacado, el sitio permanece accesible públicamente las 24 horas, generalmente construido sobre PHP con frameworks anticuados, plugins de terceros nunca actualizados y, con frecuencia, scripts de panel de control (CMS de MU) copiados de foros sin revisión de código. Esta combinación de exposición pública y código poco auditado convierte al sitio en el punto de entrada preferido de los atacantes.
Alcance de la auditoría
Antes de empezar, define qué se va a probar: sitio institucional, panel de control de cuenta (registro, creación de personaje, votación), tienda de Cash/VIP con pago, área administrativa (panel de GM web), y cualquier API expuesta. Cada superficie tiene riesgos distintos — la tienda de pago, por ejemplo, exige atención redoblada por manejar datos financieros.
SQL Injection: la vulnerabilidad más común en el nicho
Los sitios de MU heredados frecuentemente arman queries por concatenación directa de strings provenientes del usuario:
// Código vulnerable — NUNCA hagas esto
$query = "SELECT * FROM accounts WHERE username = '" . $_POST['user'] . "'";
Un atacante puede enviar ' OR '1'='1 en el campo de usuario y evadir la autenticación, o peor, extraer toda la tabla de cuentas. La corrección es usar prepared statements en todas las consultas que reciben entrada del usuario:
// Código correcto
$stmt = $pdo->prepare("SELECT * FROM accounts WHERE username = ?");
$stmt->execute([$_POST['user']]);
$result = $stmt->fetch();
Audita todos los archivos PHP del sitio en busca de concatenación directa en queries SQL — herramientas como grep -r "SELECT.*\$_" . ayudan a localizar candidatos rápidamente para la revisión manual.
XSS (Cross-Site Scripting)
Campos como nombre de personaje, mensaje de foro, comentario de noticia o incluso nombre de guild, cuando se muestran sin escape en el HTML, permiten la inyección de scripts maliciosos que corren en el navegador de otros usuarios (robo de sesión, redirección maliciosa). Escapa siempre la salida con funciones como htmlspecialchars() en PHP antes de imprimir cualquier dato proveniente del usuario:
echo htmlspecialchars($personagem['nome'], ENT_QUOTES, 'UTF-8');
Prueba insertando <script>alert(1)</script> en todos los campos de entrada del sitio y observa si la alerta se ejecuta al visualizar la página — si se ejecuta, el campo es vulnerable.
Fallas de autenticación y sesión
| Falla común | Riesgo | Corrección |
|---|---|---|
| Contraseña almacenada en MD5/SHA1 sin salt | Quiebre rápido por rainbow table en una filtración | Usa password_hash() con bcrypt/argon2 |
| Sesión sin expiración ni regeneración de ID | Secuestro de sesión (session fixation) | Regenera el ID de sesión tras el login y define una expiración |
| Ausencia de límite de intentos de login | Fuerza bruta viable contra cuentas | Implementa rate limiting y bloqueo temporal tras N intentos |
| Token de "recordar contraseña" predecible | Secuestro de cuenta sin saber la contraseña | Usa tokens aleatorios largos, almacenados con hash, con expiración |
| Reseteo de contraseña sin verificación real de correo | Cualquiera puede resetear la contraseña de terceros | Exige confirmación por enlace único enviado al correo registrado |
Exposición de datos sensibles
Verifica si el sitio expone, incluso sin querer, información que no debería ser pública: mensajes de error de PHP con la ruta completa del servidor (display_errors activado en producción), archivos de configuración (config.php) accesibles directamente por la URL, backups de base de datos dejados en la carpeta pública, y logs con datos de cuenta accesibles sin autenticación.
; php.ini en producción — nunca dejes esto así
display_errors = On
En producción, define siempre display_errors = Off y registra los errores en un log privado, sin mostrarlos nunca en la pantalla del visitante.
CSRF (Cross-Site Request Forgery)
Las acciones sensibles del panel (cambiar contraseña, canjear código de recompensa, comprar ítem en la tienda) deben exigir un token CSRF único por sesión/formulario, validado en el servidor antes de procesar la acción. Sin esto, un atacante puede inducir al jugador ya conectado a ejecutar una acción sin saberlo, a través de un enlace o página maliciosa.
Subida de archivos maliciosos
Si el panel permite subir archivos (avatar de foro, imagen de guild, adjunto de soporte), valida rigurosamente el tipo real del archivo (no confíes solo en la extensión), limita el tamaño, renombra el archivo guardado con un nombre generado por el servidor (nunca uses el nombre original) y almacénalo fuera de la carpeta pública ejecutable, o al menos impide la ejecución de scripts en la carpeta de subida mediante la configuración del servidor web.
Probando con herramientas automatizadas
Herramientas gratuitas ayudan a cubrir lo básico antes de la revisión manual:
- OWASP ZAP: scanner de vulnerabilidades web gratuito, bueno para XSS, headers de seguridad ausentes y configuraciones débiles de TLS.
- sqlmap: identifica y explota SQL Injection automáticamente — úsalo solo en tu propio entorno, nunca contra sitios de terceros sin autorización.
- Mozilla Observatory: analiza los headers de seguridad (CSP, HSTS, X-Frame-Options) del sitio publicado.
Headers de seguridad HTTP
Configura los headers de seguridad en el servidor web (Nginx/Apache), reforzando la protección del navegador incluso si una falla pasa desapercibida en el código:
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header Content-Security-Policy "default-src 'self'";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
Estos headers mitigan el clickjacking, el MIME sniffing malicioso y fuerzan las conexiones HTTPS.
Priorizando las correcciones
Con la lista de vulnerabilidades encontradas, prioriza por impacto × facilidad de explotación: SQL Injection y fallas de autenticación van primero (pueden comprometer cuentas y la base de datos entera), seguidas de XSS y CSRF (comprometen sesiones individuales), y por último los headers ausentes y la exposición de información (aumentan la superficie pero exigen pasos adicionales del atacante).
Errores comunes y soluciones
| Síntoma | Causa probable | Solución |
|---|---|---|
| El login se burla con comillas simples en el campo de usuario | Query armada por concatenación de strings | Migra a prepared statements en toda la base de código |
| Cuentas siendo secuestradas sin que se filtre la contraseña | Token de sesión predecible o sin expiración | Regenera la sesión al iniciar sesión y define una expiración adecuada |
| Mensajes de error de PHP visibles al público | display_errors activado en producción | Desactívalo y registra los errores en un log privado |
| Script malicioso ejecutándose al abrir el perfil de otro jugador | Campo de nombre/bio sin escape de salida | Aplica htmlspecialchars() en toda la salida de datos de usuario |
| Acción sensible ejecutada sin que el jugador se dé cuenta | Ausencia de token CSRF en los formularios | Implementa un token CSRF único por sesión/formulario |
Lista de verificación de auditoría de vulnerabilidades web
- Todas las queries SQL revisadas y migradas a prepared statements.
- Salida de datos de usuario escapada contra XSS en todo el sitio.
- Contraseñas almacenadas con hash fuerte (bcrypt/argon2) y salt automático.
- Sesiones con expiración y regeneración de ID tras el login.
- Tokens CSRF implementados en formularios de acciones sensibles.
display_errorsdesactivado en producción, logs privados configurados.- Subida de archivos validada, renombrada y aislada de ejecución.
- Headers de seguridad HTTP configurados en el servidor web.
- Escaneo automatizado (OWASP ZAP) ejecutado y vulnerabilidades tratadas.
Después de cerrar las brechas del sitio, mantén la seguridad viva en el tiempo: programa revisiones recurrentes y conecta este proceso con la disciplina de gestión del servidor descrita en la guía de creación de servidor de MU Online, ya que la seguridad web es solo una capa de un proyecto que necesita mantenimiento continuo.
Preguntas frecuentes
Mi sitio es solo un panel simple, ¿aun así necesito una auditoría?
Sí. Los paneles simples de servidores de MU suelen ser los blancos más fáciles precisamente porque reciben menos atención de seguridad — muchos son scripts PHP antiguos, reaprovechados de foros, sin actualización desde hace años. El tamaño del sitio no reduce el riesgo; en la práctica, los sitios pequeños y antiguos tienden a ser más vulnerables, no menos.
¿Las herramientas automatizadas de escaneo sustituyen una auditoría manual?
No del todo. Los scanners automatizados (como OWASP ZAP o Nikto) encuentran buena parte de las vulnerabilidades obvias, pero las fallas de lógica de negocio (por ejemplo, un endpoint que permite cambiar el Zen de otra cuenta manipulando un parámetro) solo aparecen en una revisión manual guiada por el conocimiento del sistema.
¿Con qué frecuencia debo repetir la auditoría?
Lo ideal es una auditoría completa en cada lanzamiento de una funcionalidad nueva en el sitio/panel, y una revisión general cada 3-6 meses aunque no haya cambios, ya que constantemente se descubren nuevas vulnerabilidades en bibliotecas de terceros (frameworks, plugins).
¿El SQL Injection sigue siendo un riesgo real en 2026?
Sí, principalmente en sitios de MU Online que usan código heredado con queries armadas por concatenación de strings en vez de prepared statements. Es sistemáticamente una de las vulnerabilidades más explotadas en este nicho, porque muchos scripts de panel circulan desde hace años sin revisión de seguridad.
¿Necesito contratar una empresa especializada para esta auditoría?
Para un servidor pequeño/mediano, una auditoría interna siguiendo una lista de verificación estructurada (como la de este tutorial) y herramientas gratuitas ya cubre la mayor parte del riesgo. Para servidores grandes, con movimiento financiero relevante (tienda con pago real), vale la pena invertir en un pentest profesional al menos una vez al año.