
ماسح عالي الدقة لـ php2shell (CVE-2026-109618 وCVE-2026-109619)
أداة سطر أوامر لاكتشاف CVE-2026-109618 وCVE-2026-109619 في تطبيقات PHP.
يرسل الماسح طلب تحكم متعدد الأجزاء (multipart) بسيطًا يتبعه ما يصل إلى ثلاثة فحوصات multipart مصممة خصيصًا. تستخدم الفحوصات مفاتيح مصفوفات PHP متداخلة بعمق 62 مستوى وتزداد من 1 MiB إلى 20 MiB، بما يطابق منطق الاكتشاف المستخدم في الماسح الداخلي الخاص بـ Assetnote.
يُبلَّغ عن الهدف بأنه معرّض للثغرة عندما يُنتج الفحص خطأ استنفاد ذاكرة PHP، أو استجابة HTTP 500 فارغة تفاضلية، أو فشل عامل PHP-FPM، أو إصدار PHP معلن معروف بأنه غير مُرقَّع. لا تُعامَل استجابات 5xx الأولية، وحالات رفض الطلب الشائعة، واستجابات HTTP 500 غير الفارغة التي تفتقر إلى بصمة الخطأ الفادح في PHP، كإشارات انهيار.
يختبر الماسح /index.php افتراضيًا. يُحتفظ بالمسار المقدَّم في عنوان URL، ويمكن اختبار مسارات مخصصة عبر --path أو --path-file. تُعاد أهداف phpMyAdmin اختبارها تلقائيًا على /show_config_errors.php. لا تُتبَع عمليات إعادة التوجيه.
يطبّق الوضع الافتراضي --sapi auto قواعد الحكم الخاصة بكل من mod_php وPHP-FPM، بما يطابق السلوك المُجمَّع لوحدات postmodules الخاصة بـ Assetnote. استخدم --sapi mod_php أو --sapi fpm لتقييد الاكتشاف على SAPI معروف.
قد يتلقى كل مسار مُختبَر طلب تحكم بحجم 42 بايت وثلاثة فحوصات يبلغ مجموعها نحو 29 MiB. يتوقف الفحص بمجرد حسم الحكم، وتُفحص عناوين URL المدخلة المكررة مرة واحدة فقط.
pip install -r requirements.txt
فحص مضيف واحد:
python3 scanner.py -u https://example.com
افحص قائمة من المضيفين:
python3 scanner.py -l hosts.txt
افحص باستخدام عدة خيوط (threads) واحفظ النتائج:
python3 scanner.py -l hosts.txt -t 20 -o results.json
الفحص باستخدام ترويسات مخصصة:
python3 scanner.py -u https://example.com -H "Authorization: Bearer token" -H "Cookie: session=abc"
افحص مسارًا مخصصًا:
python3 scanner.py -u https://example.com --path /phpinfo.php
python3 scanner.py -u https://example.com --path /index.php --path /admin.php
python3 scanner.py -u https://example.com --path-file paths.txt
استخدم قواعد حكم PHP-FPM فقط:
python3 scanner.py -u https://example.com --sapi fpm
-u, --url Single URL to check
-l, --list File containing hosts (one per line)
-t, --threads Number of concurrent threads (default: 10)
--timeout Request timeout in seconds (default: 60)
-o, --output Output file for results (JSON)
--all-results Save all results, not just vulnerable hosts
-k, --insecure Disable TLS certificate verification
-H, --header Custom header (can be used multiple times)
-v, --verbose Show verdict reasons and response snippets
-q, --quiet Only output vulnerable hosts
--no-color Disable colored output
--sapi Verdict rules: auto, mod_php, or fpm (default: auto)
--path Custom path to test (can be used multiple times)
--path-file File containing paths to test (one per line)
يُنسب الاكتشاف الأول والأصلي لـ php2shell إلى فريق Calif. يمكنك قراءة تقريرهم هنا: https://calif.io/php2shell/.
تم بناء الماسح الضوئي بواسطة فريق Assetnote لأبحاث الأمن باستخدام منطق مبني لـ منصة Exposure من Searchlight.
تُطبع النتائج إلى الطرفية. عند استخدام -o، تُحفظ المضيفات المعرضة للخطر في ملف JSON مع سبب الحكم وأدلة طلب/استجابة HTTP المنقّحة.
في تكوينات PHP محددة، قد يُبلغ الماسح الضوئي عن نتيجة إيجابية خاطئة عندما يتجاوز فحصه متعدد الأجزاء قيمة memory_limit في PHP. عندها قد تُرجع الإصدارات المُرقّعة والمعرضة للخطر نفس استجابة HTTP 500 الفارغة.
أُعيد إنتاج ذلك على PHP 8.4.27 المُرقّع بقيم memory_limit من 2M إلى 32M، وعلى PHP 8.3.36 عند 128M عندما تكون max_multipart_body_parts مضبوطة على 2785 أو أعلى. قد تختلف العتبة الدقيقة بين عمليات البناء المختلفة.
عندما لا يُفصح PHP عن إصداره، لا يستطيع الماسح الضوئي التمييز بين هذا النفاد الآمن للذاكرة (OOM) بعد الترقيع والسلوك المعرض للخطر قبل الترقيع. لذلك ينبغي التحقق من النتائج مقابل إصدار PHP المثبّت وأي ترقيعات خلفية من المورّد.