
مستودع لاصطياد التعرض لـ PHP2Shell والتحليل المرتبط به
صيد التعرّض في Defender XDR لـ PHP2Shell (CVE-2026-109618 / CVE-2026-109619).
v3.3 · 22 أكتوبر 2026
الغرض: العثور على الأجهزة المُضمَّنة (onboarded) التي تشغّل PHP فعليًا ويمكن أن تكون معرّضة لـ PHP2Shell.
النطاق: Defender XDR Advanced Hunting · نقاط نهاية Windows وLinux المُضمَّنة · نافذة بحث رجعي 30 يومًا افتراضيًا · PHP النشط فقط. غير مشمول: التثبيتات الخاملة والأجهزة غير المُدارة. غير قابل للتشغيل في Sentinel، لأن جدول البرمجيات المثبَّتة (TVM) لا يمكن الاستعلام عنه إلا في Defender XDR.
| الصيد | Windows | Linux | السؤال |
|---|---|---|---|
| 1 | windows/01-any-php.kql | linux/01-any-php.kql | هل توجد أي PHP؟ نعم/لا لكل جهاز. |
| 2 | windows/02-evidence-breakout.kql | linux/02-evidence-breakout.kql | تفصيل الأدلة مع الإصدارات. |
| 3 | windows/03-safety-net.kql | linux/03-safety-net.kql | شبكة الأمان: الأجهزة التي تقدّم الخدمة على منافذ الويب، والعملية المُستمِعة، وحالة PHP. |
تستخدم جميع فحوص الأحداث نافذة بحث رجعي واحدة، let Lookback = 30d; في أعلى كل عملية صيد. تأتي عناوين IP من أحدث تقرير لكل محوّل (adapter) خلال آخر 7 أيام. البرمجيات المثبَّتة هي لقطة TVM الحالية. تُفحص نقاط النهاية المُضمَّنة فقط (OnboardingStatus == "Onboarded"، DeviceCategory == "Endpoint").
يُحتسب الجهاز على أنه PHP مرئية إذا تحقّق أيٌّ من هذه الشروط.
كيف تُطابَق الأسماء:
^…$)، لذا يجب أن يطابق اسم الملف كاملًا، وليس جزءًا منه أبدًا.startswith "php"، بالإضافة إلى frankenphp على كلا النظامين وlsphp على Linux. ثم يُنفَّذ التعبير النمطي على ما تبقّى فقط.php9.dll مستقبلًا) تُطابَق تلقائيًا.patterns.test.js كل تعبير نمطي مقابل هذه الأمثلة. إذا غيّرت تعبيرًا نمطيًا، فحدّث الأمثلة هناك.Windows
| الفحص | الجدول | المطابقات | لماذا يهم |
|---|---|---|---|
| بدء تشغيل ملفات PHP التنفيذية | DeviceProcessEvents | التعبير النمطي ^(php(-cgi|-win)?|frankenphp)\.exe$، الذي يسمح بأربعة أسماء بالضبط: php.exe (CLI)، php-cgi.exe (عامل FastCGI)، php-win.exe (CLI، بلا نافذة أوامر)، frankenphp.exe (PHP مضمّنة في خادم ويب). لا تُطابَق phpstorm64.exe وأدوات php* الأخرى | يُثبت أن PHP قد عملت. يُظهر الصيد 2 الإصدار من معلومات إصدار الملف التنفيذي (ProcessVersionInfoProductVersion) |
| تحميل مكتبات محرك PHP (DLLs) | DeviceImageLoadEvents | التعبير النمطي ^php\d*(ts|isapi|apache[\w_]*)?\.dll$: php، أي رقم إصدار، لاحقة اختيارية ts / isapi / apache…، ثم .dll. الأمثلة في جدول DLL أدناه. لا تُطابَق مكتبات الإضافات (php_curl.dll وغيرها من php_*.dll)، لأن الشرطة السفلية غير مسموح بها مباشرة بعد php | الطريقة الوحيدة لرؤية PHP تعمل داخل عملية أخرى، مثل IIS أو Apache، حيث لا يبدأ أي php*.exe. يُظهر الصيد 2 مكتبة DLL والعملية التي حمّلتها |
| البرمجيات المثبَّتة | DeviceTvmSoftwareInventory | ليس تعبيرًا نمطيًا: SoftwareName has "php" (php ككلمة كاملة في الاسم) أو SoftwareVendor =~ "php" (مطابقة تامة، غير حسّاسة لحالة الأحرف) | يلتقط التثبيتات المسجّلة. تثبيتات Zip (الطريقة المعتادة على Windows) لا تُسجَّل عادةً |
أمثلة على مكتبات محرك PHP (DLLs) التي يطابقها نمط Windows
| DLL | ما هو | عملية المضيف النموذجية (تظهر في hunt 2) |
|---|---|---|
php8.dll، php7.dll | المحرك، بناء غير آمن للخيوط | php-cgi.exe (FastCGI تحت IIS أو nginx أو Apache mod_fcgid)، php.exe |
php8ts.dll، php7ts.dll، php5ts.dll | المحرك، بناء آمن للخيوط | httpd.exe (وحدة Apache)، php.exe |
php8apache2_4.dll، php7apache2_4.dll، php5apache2_2.dll | محمّل وحدة Apache | httpd.exe |
php5isapi.dll | وحدة IIS ISAPI القديمة (PHP 5.2 وما قبلها، غير مدعومة) | w3wp.exe |
يسرد الجدول الأسماء الشائعة، وليس قائمة سماح: أي اسم يطابق النمط يُعد مطابقة. يعطي اسم DLL رقم الإصدار الرئيسي فقط. يأتي الإصدار الدقيق من صف عملية php-cgi.exe أو php.exe، أو من البرامج المثبّتة، على الجهاز نفسه.
Linux
| الفحص | الجدول | المطابقات | لماذا يهم |
|---|---|---|---|
| بدء تشغيل ثنائيات PHP | DeviceProcessEvents | التعبير النمطي ^(php[\d.]*|php-(fpm|cgi)[\d.]*|lsphp[\d.]*|frankenphp)$: php أو php-fpm أو php-cgi أو lsphp (LiteSpeed)، كل منها مع إصدار اختياري مكوّن من أرقام ونقاط، بالإضافة إلى frankenphp. أمثلة: php، php8.3، php83، php-fpm8.3، php-cgi8.2، lsphp83. لا تطابق أدوات مثل phpunit وphpize وphp-config، لأنه لا يُسمح بأي شيء بعد الاسم الأساسي سوى الأرقام والنقاط | يثبت أن PHP قد عملت. يعرض hunt 2 تلميحًا للإصدار الرئيسي.الفرعي، مستخرجًا من الاسم أو المسار أو سطر الأوامر بواسطة تعبير نمطي ثانٍ، php-?(?:fpm|cgi)?/?(\d+\.\d+) (على سبيل المثال php-fpm8.3 أو /etc/php/8.3/ يعطي 8.3.x) |
| الحزم المثبّتة | DeviceTvmSoftwareInventory | ليس تعبيرًا نمطيًا: SoftwareName contains "php" (سلسلة فرعية، لذا تطابق الأسماء ذات الإصدارات مثل php8.3-fpm وlibapache2-mod-php8.3) أو SoftwareVendor =~ "php" | الفحص الوحيد لـ Apache mod_php ولـ php-fpm الذي يعمل منذ ما قبل النافذة: لا يوجد فحص لتحميل المكتبات هنا في Linux، وعمال php-fpm المتفرّعون لا ينشئون أحداث بدء عمليات |
| الفحص | الجدول | المطابقات | لماذا يهم |
|---|---|---|---|
| خدمة الويب النشطة | DeviceNetworkEvents | InboundConnectionAccepted على قائمة ثابتة من المنافذ: 80، 443، 8080، 8443. يُستبعد loopback (RemoteIPType != "Loopback"). يعرض مصادر مميزة وعامة، بالإضافة إلى العملية المستقبِلة (via <process>) | يثبت أن الجهاز يقدّم الخدمة، حتى لو بدأ خادم الويب الخاص به قبل نافذة البحث الرجعي. ntoskrnl.exe = HTTP.sys (IIS، ADFS، RD Gateway، Windows Admin Center، SSTP) |
| بدء تشغيل خادم الويب | DeviceProcessEvents | ليس تعبيرًا نمطيًا: قائمة ثابتة من الأسماء الدقيقة، غير حساسة لحالة الأحرف (in~). Windows: w3wp.exe، httpd.exe، nginx.exe، caddy.exe، lighttpd.exe، frankenphp.exe. Linux: httpd، apache2، nginx، lshttpd، litespeed، openlitespeed، caddy، lighttpd، frankenphp | خادم ويب بدأ في النافذة ولم يحمّل PHP يعطي "Not seen" بثقة عالية. يعرض Windows أيضًا أسماء تجمعات تطبيقات IIS، مستخرجة من سطر أوامر w3wp.exe بواسطة التعبير النمطي -ap\s+"?([^"\s]+) |
قيم عمود PHP في hunt 3
| القيمة | المعنى |
|---|---|
PHP seen (see hunt 2) | طابقت فحص كشف PHP واحد على الأقل. |
Not seen | لا يوجد دليل على PHP، وإما أن خادم ويب بدأ في النافذة (ثقة عالية) أو أن الجهاز لا يقدّم خدمة ويب. |
Not seen - no web server start in <N>d (N = Lookback) | يقدّم الخدمة على منافذ الويب، لكن لا يوجد بدء عملية خادم ويب لفحصه. هذه هي النقطة العمياء المتبقية: افحص عملية via على المضيف. |