Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-66917 — IDOR + XSS almacenado mediante Broken Object-Level Authorization en JoomGallery | Kitploit
Herramientas/GitHubGitHub/toanln-cov/cve-2026-66917
Autenticación y AutorizaciónAnálisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebSeguridad Web
GitHubtoanln-cov/cve-2026-66917

CVE-2026-66917

IDOR + XSS almacenado mediante Broken Object-Level Authorization en JoomGallery

Ver Repositorio
hace 1 díaAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

IDOR + XSS almacenado mediante autorización rota a nivel de objeto en JoomGallery

JoomGallery ≤ 4.3.0 — Un usuario con rol Editor secuestra cualquier imagen de la galería y almacena una carga XSS, lo que permite tomar el control de la sesión del administrador

CVE CVSS v4.0 CWE-639 CWE-79 Affected Researcher


RESUMEN

UserimageController::save() en JoomGallery comprueba checkACL('edit', ...) en lugar de checkACL('edit.own', ...). Un usuario con rol Editor puede hacer POST a task=userimage.save&id=N para cualquier imagen, sin importar la propiedad (IDOR — CWE-639). Debido a que el rol Editor posee core.edit globalmente, la comprobación de autorización se supera para cada ID de imagen del sitio, incluidas las imágenes propiedad de administradores.

Combinado con la ausencia de la llamada a $this->escape() en la plantilla de imagen del frontend, un Editor puede almacenar una carga XSS en el título de cualquier imagen — incluidas las imágenes propiedad de administradores — provocando la ejecución de JavaScript en el navegador de cada visitante. Esto permite el secuestro total de la sesión del administrador y el compromiso de todo el sitio.


VERSIONES AFECTADAS

COMPONENTEVULNERABLEPROBADO ENCORREGIDO
JoomGallery (com_joomgallery)4.0.0 – 4.3.0Joomla 5.4.7 + JoomGallery 4.3.0-stable (PHP 8.2 / Apache)4.4.0

DETALLES DE LA VULNERABILIDAD

Tipo: Autorización rota a nivel de objeto / IDOR (CWE-639) encadenada con Cross-Site Scripting Almacenado (CWE-79) Autenticación requerida: Cuenta de Editor con privilegios bajos

Causa raíz 1 — IDOR (CWE-639)

Archivo: components/com_joomgallery/src/Controller/UserimageController.php

La acción save() realiza una comprobación ACL usando el permiso edit en lugar de edit.own. El permiso edit se otorga globalmente a todos los usuarios con rol Editor, por lo que la comprobación se supera para cualquier ID de imagen, independientemente de quién la haya creado.

USERIMAGECONTROLLER.PHP — CÓDIGO VULNERABLE (LÍNEA 145)

root@kitploit:~
// Vulnerable
if (!$this->checkACL('edit', 'image', $recordId, $parent_id, true)) { ... }

Debido a que core.edit lo posee globalmente el grupo Editor, la condición se evalúa como false para cualquier ID de imagen, otorgando acceso de escritura sin restricciones. En un guardado exitoso, el modelo además actualiza created_by al ID de usuario del atacante, transfiriendo silenciosamente la propiedad de la imagen al atacante.

Causa raíz 2 — XSS almacenado (CWE-79)

Archivo: components/com_joomgallery/tmpl/image/default.php

La plantilla de imagen del frontend imprime $this->item->title sin codificarlo en HTML en el contexto del atributo alt. El filtro STRING de JInput de Joomla no elimina las comillas dobles, por lo que una carga que contenga " sale del atributo e inyecta controladores de eventos arbitrarios.

DEFAULT.PHP — CÓDIGO VULNERABLE (LÍNEAS 64, 78)

root@kitploit:~
// Vulnerable
item->title; ?>" ...>

La carga abc" onmouseover="alert(document.domain);" x=" se almacena en jos_joomgallery.title y se inyecta sin procesar en el atributo HTML en cada renderizado de la página. No se produce ninguna sanitización en la capa de almacenamiento ni en la de presentación.


PRUEBA DE CONCEPTO

Resumen de la cadena de ataque

  1. El administrador crea una imagen de la galería (ID=3). Propietario = Administrador. Publicada y Aprobada.
  2. El atacante inicia sesión como Editor. Extrae la cookie de sesión y el token CSRF de la página de inicio de sesión.
  3. El atacante obtiene un token CSRF nuevo del componente JoomGallery.
  4. IDOR: El Editor hace POST a task=userimage.save&id=3 con la carga XSS en jform[title]. La comprobación ACL se supera (core.edit, no edit.own). El servidor devuelve HTTP 303 — no 403.
  5. El título se actualiza con la carga sin escapar. created_by se transfiere al ID de usuario del atacante.
  6. La carga XSS se almacena sin escapar en jos_joomgallery.title.
  7. Cualquier visitante (o administrador) navega por el frontend de la galería. La plantilla renderiza alt="abc" onmouseover="alert(document.domain);". El XSS se ejecuta. La sesión del administrador queda capturada → compromiso total del sitio.

1. El administrador crea una imagen de la galería — Propietario: Administrador, ID = 3

El administrador crea admin_image mediante el backend de JoomGallery (Joomla 5.4.7). La imagen está Publicada, Aprobada y es propiedad de Administrador

Paso 1


2. El Editor extrae el token CSRF de la página de inicio de sesión

GET /index.php/component/users/login — la respuesta JSON contiene "csrf.token":"a68c2b3a...". El token se captura para el POST de inicio de sesión posterior.

Paso 2


3. El Editor inicia sesión — HTTP 303, joomla_user_state=logged_in

POST /index.php/component/users/login con el token CSRF y las credenciales del Editor. Respuesta: HTTP 303 y Set-Cookie: joomla_user_state=logged_in. La cookie de sesión queda capturada.

Paso 3


4. El Editor extrae un nuevo token CSRF de JoomGallery

GET /index.php?option=com_joomgallery con la cookie de sesión. La respuesta contiene un nuevo "csrf.token":"2d96934b..." para usar en la solicitud de guardado.

Paso 4


5. Inyección IDOR + XSS — el servidor acepta con HTTP 303

El Editor hace POST a option=com_joomgallery&task=userimage.save&id=3 con jform[title] establecido en:

root@kitploit:~
abc" onmouseover="alert(document.domain);" x="

El servidor devuelve HTTP 303 (no 403), confirmando el IDOR. La cabecera Location muestra la carga XSS en la URL de redirección, confirmando que el título se aceptó y guardó.

Paso 5


6. Transferencia de propiedad — el propietario cambia al usuario Editor

El backend de JoomGallery muestra que la imagen ID=3 ahora tiene como Propietario: Editor User. El campo created_by se actualizó silenciosamente en la base de datos durante el guardado no autorizado.

Paso 6


7. La base de datos confirma que la carga se almacenó sin escapar

La consulta SQL sobre jos_joomgallery confirma que la carga XSS está almacenada — " se almacena como una comilla doble cruda, no como ". No se produjo ninguna sanitización en la capa de almacenamiento.

Paso 7


8. El XSS se ejecuta en el frontend de la galería

Cualquier usuario que visite /index.php/component/joomgallery/gallery activa la carga. El diálogo alert() del navegador confirma la ejecución de JavaScript en el origen de la víctima (document.domain).

Paso 8


IMPACTO

  1. Modificación no autorizada de imágenes (IDOR): Un usuario con rol Editor puede modificar cualquier imagen de la galería del sitio, incluidas las imágenes propiedad de administradores, sin validación de propiedad.
  2. Transferencia silenciosa de propiedad: Cada guardado no autorizado reasigna silenciosamente created_by al atacante, alterando permanentemente la pista de auditoría.
  3. XSS almacenado — Ejecución persistente: La carga JavaScript inyectada se ejecuta en el navegador de cada visitante en cada carga de la página de la galería, afectando tanto a visitantes no autenticados como a administradores.
  4. Secuestro de sesión del administrador → Compromiso total del sitio: Un script malicioso en el atributo alt puede exfiltrar la cookie de sesión del administrador, otorgando al atacante acceso total al backend y control sobre toda la instalación de Joomla.
  5. Cambio de alcance: El XSS se ejecuta en el origen del navegador de la víctima (CVSS S:C), cruzando el límite de confianza entre la sesión de privilegios bajos del atacante y la sesión de privilegios altos de la víctima.

REFERENCIAS

  • CVE: https://www.cve.org/CVERecord?id=CVE-2026-66917
  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-66917
  • Aviso de GitHub: https://github.com/advisories/GHSA-8vxv-gf52-gm5h
  • Repositorio del proveedor: https://github.com/JoomGalleryfriends/JoomGallery
  • Nota de la nueva versión del proveedor: https://www.joomgalleryfriends.net/en/blog/joomgallery-4-en/joomgallery-4-4-0.html
Descargar herramienta