• Defender
  • Script
  • PHP2Shell : vos postes Windows sont-ils vulnérables ?

    MICROSOFT DEFENDER XDR · KQL · CYBERSÉCURITÉ

    6 requêtes KQL pour enquêter avec Microsoft Defender XDR.

    Deux vulnérabilités critiques dans PHP, un risque d’exécution de code à distance et des correctifs à appliquer rapidement.

    Lorsqu’une faille touche PHP, nous pensons immédiatement aux serveurs web.

    Mais les postes de travail peuvent aussi héberger des environnements PHP potentiellement vulnérables.

    De « this is fine » à « this is not fine », l'histoire d'un « meme » qui a  du chien

    🔎 Notre objectif

    Identifier les installations PHP, rechercher les CVE, observer les processus et examiner l’exposition réseau, sans confondre vulnérabilité et compromission.

    Confidentialité des exemples : les illustrations de résultats utilisent exclusivement des données fictives et ne représentent aucun environnement de production.
    2
    CVE critiques étudiées
    6
    Requêtes KQL
    9,2
    Score CVSS v4.0 / 10
    ALERTE SÉCURITÉ

    1. PHP2Shell : que s’est-il passé ?

    Le 21 octobre 2026, l’équipe PHP a publié des correctifs de sécurité concernant deux vulnérabilités critiques.

    CVE-2026-109618

    Une corruption mémoire liée à la gestion d’une situation de mémoire
    insuffisante.

    CVE-2026-109619

    Une utilisation d’un état interne
    devenu invalide entre plusieurs
    requêtes PHP.

    Dans certaines configurations, ces vulnérabilités peuvent permettre l’exécution de code à distance, sans authentification.

    Le CERT-FR a également signalé des tentatives d’exploitation visant des déploiements PHP spécifiques.

    ⚠️ Tous les environnements PHP ne présentent pas le même niveau d’exposition

    PHP considère particulièrement à risque les installations traitant des requêtes web, notamment avec Apache mod_php.

    Une installation utilisée uniquement en ligne de commande ne doit pas être automatiquement assimilée à un service web accessible à distance.

    Quelles versions sont corrigées ?

    Branche PHP Version corrigée
    PHP 8.5 8.5.12
    PHP 8.4 8.4.27
    PHP 8.3 8.3.36
    PHP 8.2 8.2.35
    PHP 8.1 et antérieures Migration ou correctif fournisseur adapté
    💡 Une précision pour Windows

    Le 26 octobre, PHP a republié certains binaires Windows avec le suffixe -1, notamment 8.3.36-1.

    Ces paquets embarquent une correction de dépendance Brotli supplémentaire
    (CVE-2026-111497). Il s’agit d’un sujet distinct des deux vulnérabilités PHP2Shell.

    MODERN WORKPLACE

    2. Pourquoi vérifier les postes de travail ?

    Lorsqu’une faille concerne PHP, les premières investigations portent généralement sur les serveurs web.

    Pourtant, les postes Windows peuvent aussi disposer de PHP : développement logiciel, tests locaux, outils portables ou environnements installés par les utilisateurs.

    💻 PHP en ligne de commande

    Scripts et outils de développement.
    Le risque RCE web n’est pas
    automatiquement applicable.

    🛠️ XAMPP, WAMP, Laragon

    Environnements locaux pouvant
    embarquer un moteur PHP
    et un serveur web.

    🌐 Serveur web local

    Nginx ou Apache peut servir
    des applications depuis un poste.
    L’accessibilité doit être vérifiée.

    📦 Conteneurs et WSL

    PHP peut se trouver dans un conteneur
    ou une distribution Linux et ne pas
    apparaître dans l’inventaire classique.

    ✅ Notre démarche

    Nous allons rechercher successivement les installations PHP, leurs vulnérabilités, leur activité et les éléments techniques permettant de qualifier l’exposition.

    PRÉREQUIS

    3. Préparer l’investigation dans Defender XDR

    Pour reproduire les recherches, vous devez disposer de Microsoft Defender
    for Endpoint, d’un accès adapté à Advanced Hunting et des données nécessaires de Defender Vulnerability Management.

    Microsoft Defender XDR
    → Hunting / Repérage
    → Advanced Hunting
    Table KQL Objectif
    DeviceTvmSoftwareInventory Inventaire logiciel
    DeviceTvmSoftwareVulnerabilities CVE détectées sur les appareils
    DeviceProcessEvents Démarrages de processus
    DeviceNetworkEvents Activité réseau enregistrée

    ⚠️ Une requête vide n’est pas une garantie de sécurité

    La visibilité dépend notamment de l’onboarding des appareils, des fonctionnalités disponibles, de la fraîcheur de l’inventaire, de la rétention des événements et de la couverture des logiciels.

    KQL 01 — INVENTAIRE

    4. Identifier les postes qui possèdent PHP

    Commençons par le plus simple : quelles machines possèdent PHP ou un environnement de développement associé ?

    Pour cela, nous allons interroger l’inventaire logiciel de Defender.

    KQL 01 · Inventaire PHP
    DeviceTvmSoftwareInventory
    | where SoftwareName contains « php »
        or SoftwareName contains « xampp »
        or SoftwareName contains « wamp »
        or SoftwareName contains « laragon »
    | project DeviceName, OSPlatform, SoftwareVendor,
              SoftwareName, SoftwareVersion, EndOfSupportStatus
    | order by DeviceName asc

    Cette requête identifie notamment les logiciels dont le nom contient PHP, XAMPP, WAMP ou Laragon.

    💡 Comment interpréter le résultat ?

    Une version PHP identifiée indique une installation inventoriée, pas nécessairement un service actif.

    De même, un outil tel que PhpStorm peut apparaître dans les résultats sans prouver qu’un moteur PHP vulnérable est installé avec cet outil.

    Inventaire PHP

    Simulation pédagogique — données entièrement fictives.

    ✅ Première étape validée

    Nous savons comment identifier les installations connues de Defender.
    Il faut maintenant vérifier les vulnérabilités associées.

    KQL 02 — VULNÉRABILITÉS

    5. Rechercher les deux CVE PHP2Shell

    PHP est installé, mais quelles machines sont réellement associées aux vulnérabilités dans Defender ?

    Nous allons utiliser DeviceTvmSoftwareVulnerabilities.

    KQL 02 · Vulnérabilités PHP2Shell
    DeviceTvmSoftwareVulnerabilities
    | where CveId in (
        « CVE-2026-109618 »,
        « CVE-2026-109619 »
    )
    | project DeviceName, OSPlatform, SoftwareName,
              SoftwareVersion, CveId,
              VulnerabilitySeverityLevel,
              RecommendedSecurityUpdate
    | order by DeviceName asc

    Cette recherche retourne les correspondances connues de Defender entre les logiciels installés et les deux CVE.

    🔎 Une vulnérabilité détectée n’est pas une compromission

    Un résultat confirme que Defender associe une vulnérabilité à un logiciel présent sur l’appareil.

    Cela ne signifie pas qu’un attaquant a exploité le poste.

    Correspondances CVE

    Simulation pédagogique — données entièrement fictives.


    ⚠️ Ne confondez pas les tables KQL

    DeviceTvmSoftwareVulnerabilitiesKB décrit la base de connaissances des vulnérabilités évaluées par Microsoft.

    Elle ne représente pas directement le nombre de postes vulnérables dans votre organisation.

    KQL 03 — ACTIVITÉ

    6. PHP est-il réellement exécuté sur les postes ?

    Une application vulnérable peut rester installée sans être exécutée.

    Nous allons donc examiner les événements de création de processus enregistrés par Defender sur les 14 derniers jours.

    KQL 03 · Exécutions PHP et Nginx
    DeviceProcessEvents
    | where Timestamp > ago(14d)
    | where FileName in~ (
        « php.exe », « php-cgi.exe », « php-win.exe »,
        « httpd.exe », « nginx.exe »
    )
    | summarize Executions=count(),
                DerniereExecution=max(Timestamp)
        by DeviceName, FileName
    | order by Executions desc

    Cette requête regroupe les événements par poste et par exécutable.

    💡 Pourquoi regrouper les résultats ?

    Une ligne de DeviceProcessEvents représente un événement de processus, et non un ordinateur distinct.

    Un même poste peut donc générer de nombreuses lignes pour PHP ou Nginx, sans qu’il s’agisse de plusieurs installations ou attaques.

    Exécutions PHP / Nginx

    Simulation pédagogique — données entièrement fictives.

    ✅ Ce que nous apprenons

    Nous pouvons identifier les processus réellement démarrés durant la période.
    Cela ne prouve pas qu’ils sont encore actifs au moment de l’analyse.

    KQL 04 — EXPOSITION RÉSEAU

    7. Rechercher les ports en écoute de PHP et Nginx

    C’est une étape importante.

    Un poste de développement peut exécuter PHP et Nginx sans nécessairement être accessible depuis le réseau.

    Nous allons examiner les événements de création de sockets en écoute enregistrés par Defender.

    KQL 04 · Ports en écoute
    DeviceNetworkEvents
    | where Timestamp > ago(14d)
    | where ActionType == « ListeningConnectionCreated »
    | where InitiatingProcessFileName in~ (
        « nginx.exe », « php.exe »,
        « php-cgi.exe », « httpd.exe »
    )
    | project Timestamp, DeviceName,
              InitiatingProcessFileName,
              LocalIP, LocalPort, ActionType
    | order by Timestamp desc

    Comment interpréter LocalIP ?

    Adresse d’écoute Signification
    127.0.0.1 Interface locale IPv4
    ::1 Interface locale IPv6
    0.0.0.0 Toutes les interfaces IPv4
    :: Écoute IPv6 non limitée au bouclage
    Ports d’écoute

    Simulation pédagogique — données entièrement fictives.


    ⚠️ 0.0.0.0 ne signifie pas « exposé à Internet »

    Un processus qui écoute sur toutes les interfaces IPv4 n’est pas nécessairement joignable depuis le réseau.

    Les règles du pare-feu, les routes, la segmentation et les éventuelles traductions d’adresse doivent être vérifiées.

    Il faut également confirmer que le serveur web transmet des requêtes à une installation PHP vulnérable.

    KQL 05 — RÉSEAU

    8. Examiner les communications associées à PHP et Nginx

    Après les ports d’écoute, nous pouvons examiner les événements réseau associés aux processus PHP et aux serveurs web.

    KQL 05 · Communications réseau
    DeviceNetworkEvents
    | where Timestamp > ago(14d)
    | where InitiatingProcessFileName in~ (
        « php.exe », « php-cgi.exe »,
        « php-win.exe », « nginx.exe », « httpd.exe »
    )
    | summarize Evenements=count()
        by DeviceName, InitiatingProcessFileName,
           ActionType, LocalPort, RemoteIPType
    | order by Evenements desc

    Cette recherche permet de distinguer plusieurs catégories de communications.

    🔁 Loopback

    Communication impliquant
    l’interface locale de l’appareil.

    🏢 Private

    Adresse distante relevant
    d’un espace réseau privé.

    🌍 Public

    Adresse distante publique, à interpréter selon le contexte de la connexion.

    Activité réseau

    Simulation pédagogique — données entièrement fictives.


    ⚠️ Une limite importante

    DeviceNetworkEvents ne remplace pas les journaux HTTP du serveur web.

    Une absence de résultat ne prouve pas qu’aucune connexion entrante n’a atteint l’application.

    Pour rechercher des tentatives d’exploitation précises, les journaux Nginx, Apache, reverse proxy et WAF constituent des sources complémentaires.

    KQL 06 — THREAT HUNTING

    9. Rechercher les processus suspects lancés par PHP ou Nginx

    Dernière étape : examiner les processus enfants déclenchés par PHP ou par le serveur web.

    Dans certaines situations, une application compromise peut être à l’origine d’un lancement inattendu de commandes système.

    KQL 06 · Processus enfants
    DeviceProcessEvents
    | where Timestamp > ago(14d)
    | where InitiatingProcessFileName in~ (
        « php.exe », « php-cgi.exe »,
        « nginx.exe », « httpd.exe »
    )
    | summarize Evenements=count(),
                DerniereExecution=max(Timestamp)
        by DeviceName,
           InitiatingProcessFileName, FileName
    | order by Evenements desc

    Cette recherche permet d’obtenir une vue regroupée des processus enfants, sans parcourir des dizaines de lignes répétitives.

    Quels événements méritent une investigation ?

    Fonctionnement potentiellement légitime

    Nginx lançant d’autres processus
    Nginx ou des processus console
    attendus dans son environnement.

    Comportements à examiner

    Lancement inattendu de PowerShell,
    CMD ou d’outils de téléchargement
    depuis PHP ou un serveur web.

    Processus enfants

    Simulation pédagogique — données entièrement fictives.

    🔐 Un résultat rassurant n’est pas un certificat d’absence de compromission

    Un processus enfant inhabituel peut être parfaitement légitime.
    À l’inverse, une exploitation ne produit pas nécessairement un processus enfant visible.

    Cette méthode constitue un contrôle comportemental complémentaire, pas une signature de détection exhaustive des vulnérabilités PHP2Shell.

    REMÉDIATION

    10. Que faire lorsqu’un poste est concerné ?

    Les requêtes précédentes servent à qualifier l’exposition.

    Mais la priorité reste l’application des correctifs.


    01 — Identifier l’installation

    Vérifier la version de PHP, sa finalité et le responsable de l’application.


    02 — Qualifier l’exposition

    Déterminer si PHP sert uniquement à exécuter des scripts ou s’il traite des requêtes web.


    03 — Réduire la surface d’attaque

    Limiter temporairement l’accessibilité des services concernés si nécessaire, avec l’équipe sécurité.


    04 — Mettre à jour PHP

    Installer une version corrigée ou un paquet fournisseur intégrant les correctifs.


    05 — Redémarrer les services

    Vérifier que les processus utilisent bien les binaires corrigés après mise à jour.


    06 — Contrôler la remédiation

    Réexaminer la version et les vulnérabilités dans Defender Vulnerability Management.

    Vérifier localement les ports ouverts

    Sur Windows, cette commande PowerShell en lecture seule permet de vérifier les ports HTTP et HTTPS actuellement en écoute.

    POWERSHELL · Vérification locale
    Get-NetTCPConnection -State Listen -ErrorAction SilentlyContinue |
        Where-Object { $_.LocalPort -in @(80, 443) } |
        Select-Object LocalAddress, LocalPort, OwningProcess

    Cette commande complète les événements historiques observés dans Defender.

    Elle ne démontre pas, à elle seule, qu’une connexion est possible depuis un réseau extérieur.

    ⚠️ Et si une mise à jour n’est pas immédiatement possible ?

    PHP documente des mesures temporaires permettant de réduire certains chemins d’exploitation.

    Ces mesures ne constituent pas une protection complète.
    La mise à jour reste la remédiation de référence.

    BILAN

    11. Peut-on vraiment affirmer que les postes sont sécurisés ?

    Après ces six requêtes, nous disposons d’une méthodologie pour mieux comprendre la surface d’exposition PHP de nos postes Windows.

    Mais il faut distinguer les éléments que Defender peut observer des conclusions qu’une investigation complète permettrait d’établir.

    Vérification Ce qu’elle permet d’établir
    Inventaire PHP Logiciel détecté
    Recherche CVE Association appareil / vulnérabilité
    Processus PHP Démarrage observé
    Événements d’écoute Écoute historique, exposition à qualifier
    Communications réseau Activité réseau partiellement visible
    Processus enfants Indices comportementaux à interpréter
    Absence de compromission Non démontrable avec ces seules requêtes
    💜 Ce qu’il faut retenir

    Un logiciel installé n’est pas nécessairement exécuté.

    Un logiciel vulnérable n’est pas automatiquement exploitable depuis le réseau.

    Un serveur web actif n’est pas nécessairement accessible depuis Internet.

    Et surtout, l’absence d’alerte ne constitue pas une preuve d’absence de compromission.

    Conclusion : ne vous limitez pas aux serveurs !

    PHP2Shell rappelle que les environnements de développement présents sur nos postes de travail peuvent eux aussi faire partie de la surface d’attaque.

    Avec Microsoft Defender XDR et Advanced Hunting, nous pouvons identifier les installations PHP, rechercher les vulnérabilités et examiner les activités susceptibles de nécessiter une investigation.

    Mais ces recherches ne remplacent ni la correction des logiciels, ni la vérification des configurations réseau, ni l’analyse des journaux web.

    L’objectif n’est pas de conclure « tout va bien » après six requêtes KQL, mais de savoir où chercher, comment interpréter les résultats et quelles actions engager pour réduire le risque.

    📚 Sources officielles

    Article rédigé le 29 octobre 2026.

    Les visuels sont des reconstitutions fictives.
    Les requêtes KQL sont fournies à titre de méthode d’investigation défensive.

    Les résultats et la couverture peuvent varier selon les environnements.

    Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

    12 mins