
J2Store CVE-2026-67358–67362 PoC (J2Commerce 2026년 8월 보안 권고)
com_j2store(J2Commerce J2Store)에서 Murrez가 발견한 네 가지 취약점에 대한 개념 증명(PoC) 자료로, 다음 버전에서 수정되었습니다:
| 브랜치 | 패치 버전 |
|---|---|
| J2Store 3.x | 3.3.21 |
| J2Store 4.0.x | 4.0.21 |
| J2Store 4.1.x | 4.1.6 |
공식 권고: J2Commerce 보안 공지 (2026-08-20)
테스트 버전: Joomla 5.x (로컬 랩)의 J2Store Pro 4.1.5
승인된 보안 연구 및 패치 검증 용도로만 사용하십시오. 소유하지 않았거나 테스트에 대한 명시적 허가가 없는 시스템에는 사용하지 마십시오.
pip install -r requirements.txt
Python 3.10+
기본 랩 베이스 URL: 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
최소한의 Burp/curl 재현 요청: replay/
expressconfirm 주문 정보 노출엔드포인트: GET /index.php?option=com_j2store&view=checkout&task=expressconfirm&order_id=…
활성 체크아웃 세션이 없으면 인증 없이도 임의의 order_id에 대해 익스프레스 체크아웃 확인 페이지(주문 품목, 수량, 가격, 합계)가 렌더링됩니다.
근본 원인: components/com_j2store/controllers/checkouts.php — expressconfirm()이(가) 소유권 확인 없이 요청에 포함된 order_id를 사용합니다.
reOrder IDOR엔드포인트: GET /index.php?option=com_j2store&view=myprofile&task=reOrder&order_id=…&{csrf}=1
인증된 사용자가 피해자의 order_id를 알고 있으면 재주문을 트리거할 수 있습니다: 피해자의 주문 품목이 공격자의 장바구니에 복사되고, 피해자의 청구/배송 주소 ID가 공격자의 세션에 저장됩니다.
근본 원인: components/com_j2store/controllers/myprofile.php — reOrder()은(는) CSRF와 로그인을 검증하지만 $order->user_id는 검증하지 않습니다.
updateHitCount 할당량 조작엔드포인트: POST /index.php?option=com_j2store&view=myprofile&task=updateHitCount
게스트 또는 고객은 자신의 유효한 (order_id, token) 쌍을 사용하여 다른 주문의 orderdownload_id에 대해 limit_count를 증가시킬 수 있습니다. CSRF 토큰이 필요 없습니다.
근본 원인: components/com_j2store/controllers/myprofile.php — 토큰은 호출자의 주문에 대해서만 검사되며, orderdownload_id는 해당 주문에 바인딩되어 있지 않습니다.
작업: carts.setcurrency, carts.addItem, carts.applyCoupon, carts.applyVoucher
Base64로 인코딩된 redirect / return 매개변수가 디코딩된 후 호스트 허용 목록 없이 $app->redirect()로 전달됩니다. JRoute::_()는 절대 경로의 외부 URL을 차단하지 않습니다.
근본 원인: components/com_j2store/controllers/carts.php
공급업체 권고문의 이슈 1, 2, 3, 5 — Murrez ([email protected]).
J2Commerce 및 Joomla Security Strike Team을 통한 조정된 공개입니다.
MIT — LICENSE 참조.
| CVE | 이슈 | 인증 | CVSS 4.0 | 심각도 |
|---|
| CVE-2026-67359 | expressconfirm를 통한 비인증 주문 품목 및 합계 노출 | 없음 | 8.7 | 높음 |
| CVE-2026-67360 | 타 고객 reOrder IDOR (공격자 세션에 피해자의 장바구니/주소가 담김) | 낮음 (로그인 상태) | 8.7 | 높음 |
| CVE-2026-67358 | updateHitCount로 다른 고객의 다운로드 할당량 소진 | 낮음 (게스트 주문 토큰) | 5.3 | 중간 |
| CVE-2026-67362 | 장바구니 작업에서의 오픈 리다이렉트 (setcurrency, addItem, applyCoupon, applyVoucher) | 없음 | 5.1 | 중간 |