
Joomla 6.1.3 - Alta - Remota - ACL - restos de la API de elementos de menú
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-menu-items-api
Análisis: https://abraxaslabs.tech/research/joomla-menu-items-api
Clase: Privilegio residual Alcance: Remoto
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
La interfaz de administración para elementos de menú comprueba com_menus.menu.{id} y rechaza menutype == main. api/components/com_menus/src/Controller/ItemsController.php no tiene allowAdd / allowEdit, por lo que ApiController solo solicita core.manage más core.create / core.edit sobre com_menus.
Un usuario con token que puede gestionar un menú puede hacer POST a /api/index.php/v1/menus/administrator/items sobre un menú al que se le deniega el acceso en la interfaz, incluido el menú protegido main del administrador.
| ID | aún sin CVE |
| Clase | Privilegio residual / omisión de autorización |
| Alcance | Remoto (token de API con core.login.api) |
| CWE | CWE-863 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Producto | Joomla CMS |
| Afectado | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2) |
| Autenticación | Usuario remoto de API con core.login.api + core.manage + core.create/core.edit sobre com_menus, no Super User. Por defecto core.login.api es solo para Super User. |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
Usuario con token que puede crear elementos solo en el menú A. Aún no puede instalar extensiones a menos que ya tenga ese permiso. No se convierte en Super User a partir de este residuo.
| Privilegio | Método / ruta | Tipo | Probado en laboratorio o inferido |
|---|---|---|---|
| Crear un elemento en un menú al que se le deniega el acceso | POST /api/index.php/v1/menus/administrator/items con menutype de B | integridad | Probado en laboratorio. HTTP 200, elemento 102 en staffmenu, título poc-JOOMLA-MENU-ITEMS-API-WITNESS |
Insertar una URL en el menú protegido main del administrador | Mismo POST con menutype=main | integridad | Probado en laboratorio HTTP 200. La interfaz allowEdit devuelve false para main |
| Dirigir al personal a un inicio de sesión similar o ocultar un elemento de administración real | Elemento de URL publicado en un menú de administración | integridad / reconocimiento | Inferido a partir de la escritura. El laboratorio insertó https://example.invalid/ |
| Editar o eliminar elementos en menús que no poseen | PATCH / DELETE de la API usan la misma ausencia de allow* | integridad | Inferido. El laboratorio ejercitó la creación |
| Instalar extensiones o convertirse en Super User | Requiere otra ACL | n/a | Cerrado. El Manager no es Super User |
Cerrado en esta versión fijada: añadir/guardar en la interfaz sobre staffmenu para el mismo usuario (not permitted). Añadir en la interfaz sobre labmenu sigue funcionando. La comprobación core.admin de la API de grupos de 6.1.1 no se ve afectada.
Fijé la versión 6.1.3 tras la oleada de JSST de 2026. El ItemController del administrador ya hace lo correcto:
return $user->authorise('core.create', 'com_menus.menu.' . $menutypeID);
if ($item->menutype == 'main') {
return false;
}
return $user->authorise('core.edit', 'com_menus.menu.' . (int) $menutypeID);
El controlador de elementos de la API no sobrescribe allowAdd / allowEdit. El ApiController predeterminado solo verifica el componente core.manage más core.create / core.edit. La ruta canSave del modelo solo verifica el componente core.edit. La copia/movimiento por lotes ya verifica el recurso del menú.
Pistas falsas ya registradas: interpretar un HTTP 200 de la UI como permiso (el cuerpo es "not permitted"); considerar que core.manage sobre com_menus es suficiente en la UI (la UI sigue dependiendo de com_menus.menu.{id}); un Manager estándar sin core.login.api. Teatro: una reverse shell. El oráculo es API 200 en staffmenu y main más denegación en la UI sobre B.
Restos del mismo pin: levels API, media override, articles catid.
python3 joomla-menu-items-api-Abraxas-Labs.py
o
cd lab
./run.sh
Dirígete solo a http://127.0.0.1:19530. Imagen joomla:6.1.3-php8.3-apache.
SUCCESS joomla-menu-items-api api-b-http=200 item-id=102 menutype=staffmenu api-main-http=200 ui-add-b=200 ui-save-b=200 JOOMLA-MENU-ITEMS-API-WITNESS
ui-add-b / ui-save-b devuelven HTTP 200; la denegación de B es el cuerpo "not permitted" de la UI, no un estado 403.
Copiar ItemController::allowAdd / allowEdit (y delete) en el controlador de la API, incluyendo el bloque main. Comprobar el asset de tipo menú en canSave de la misma forma.
0f2d4de4729eb951e0878fec98c7990da07915b2)ItemsController.phpItemController.phpGNU Affero GPL v3.0. Ver LICENSE. Solo para laboratorio en loopback. Sin garantía.