Détecteur de vulnérabilités PHP2Shell

Saisissez une URL que vous possédez ou êtes autorisé à tester. Examinez les indices PHP, les versions et les réponses aux formulaires pour évaluer l’exposition à PHP2Shell et orienter la correction.

2

Vulnérabilités du cœur de PHP

9.2

Score CVSS v4.0 (critique)

4

Branches amont corrigées de 8.2 à 8.5

Aperçu des vulnérabilités

Qu’est-ce que PHP2Shell et pourquoi faut-il agir rapidement ?

PHP2Shell désigne deux failles de sûreté mémoire du cœur de PHP, CVE-2026-109618 et CVE-2026-109619, toutes deux notées 9.2 selon CVSS v4.0. Elles peuvent permettre une exécution de code à distance sans authentification, selon la version, le déploiement et le vecteur d’attaque.

Lire l’avis officiel de PHP

Le problème touche PHP lui-même, pas seulement une application

Examinez PHP-FPM, Apache mod_php, php-cgi, FrankenPHP, LiteSpeed et les autres déploiements PHP traitant des requêtes web. PHP considère mod_php comme le cas le plus risqué, avec une exploitation démontrée avant l’exécution du code applicatif. Une page simple ou un code sûr n’excluent pas l’exposition.

Vérifiez aussi l’environnement PHP sous le site

Mettre à jour WordPress, Drupal, un framework ou une extension ne met pas forcément à jour PHP. Vérifiez la version affectée à chaque site, les pools FPM, images de conteneurs, nœuds et PHP intégré aux panneaux ou équipements. Les versions officielles corrigées sont sorties le 21 octobre 2026.

Ce que le détecteur examine

Examinez les indices PHP, les réponses et les correctifs

Comment les sept requêtes facilitent-elles l’analyse ?

Commencez par un GET de référence, puis envoyez un formulaire URL-encoded et un formulaire multipart pour chacune des trois méthodes. Examinez chaque réponse avant de continuer. Ces requêtes ordinaires comparent les comportements sans charge d’exécution de code ni d’épuisement mémoire.

Sept requêtes HTTP pour examiner PHP2Shell
Ordre Méthode Contenu de la requête Points à observer
01GETSans corps de requêteAccessibilité, redirections, versions PHP publiques et en-têtes de réponse.
02POSTapplication/x-www-form-urlencodedUn champ texte ordinaire comme témoin POST.
03POSTmultipart/form-dataUn champ texte comparé au POST témoin, sans fichier ni champ de progression d’envoi.
04PUTapplication/x-www-form-urlencodedUn champ texte ordinaire pour observer le traitement de PUT sur ce chemin.
05PUTmultipart/form-dataComparez avec le PUT URL-encoded pour repérer les différences liées au type de contenu.
06PATCHapplication/x-www-form-urlencodedUn champ texte ordinaire comme témoin PATCH.
07PATCHmultipart/form-dataComparez avec le PATCH témoin sans déduire le comportement des autres méthodes du seul POST.

Les mentions PHP dans X-Powered-By ou Server et les cookies tels que PHPSESSID sont de simples indices. Ils peuvent être masqués, modifiés ou personnalisés. Un cookie ne prouve pas non plus que PHP a analysé le corps de la requête.

Ces vérifications concernent uniquement l’URL et le chemin saisis. D’autres routes, règles CDN et serveurs d’origine directement accessibles peuvent réagir autrement. Ne généralisez pas un résultat de la page d’accueil à tout le site. Vérifiez uniquement des chemins autorisés adaptés aux formulaires.

Comment interpréter les résultats

Distinguez les indices d’exposition des correctifs vérifiés

Les réponses publiques ne fournissent qu’une partie des éléments. Les versions peuvent être masquées ou modifiées, et les anciennes versions peuvent inclure des rétroportages. Vérifiez l’environnement réel sans assimiler absence de preuve et sécurité.

Évitez les erreurs d’interprétation courantes

Un indice de version corrigée est observé

Une version publique atteignant le seuil corrigé de sa branche est un indice utile, mais un proxy peut la modifier. Confirmez sur le serveur que chaque instance a chargé le code corrigé.

Un risque lié à une ancienne version est observé

Vérifiez en priorité les versions sous le seuil amont, en recherchant les rétroportages de la distribution ou du fournisseur LTS. Si leur état est inconnu, notez une vérification nécessaire sans annoncer une exécution de code confirmée.

Requêtes rejetées ou réponses différentes

Un témoin réussi et un multipart en 4xx peuvent refléter une restriction de type de contenu. Deux réponses 405 peuvent simplement indiquer une méthode non prise en charge. Les codes seuls ne distinguent pas un rejet par le CDN, le serveur web ou l’application.

Aucun indice PHP ou aucune réponse exploitable

Versions masquées, caches de proxy, cookies personnalisés, échecs de connexion et délais dépassés limitent l’analyse. Indiquez des éléments insuffisants ou une évaluation impossible plutôt qu’un verdict de sécurité en vert.

Déroulement de la vérification

Commencez par une URL et examinez les éléments

1

Saisissez l’URL cible

Indiquez l’adresse d’un site que vous possédez ou êtes autorisé à tester, avec le chemin à vérifier.

2

Examinez chaque résultat dès sa réception

Commencez par le GET de référence, puis comparez les réponses URL-encoded et multipart pour POST, PUT et PATCH, requête par requête.

3

Consultez les résultats et les recommandations

Interprétez les codes de statut et les indices de version, puis vérifiez les correctifs selon l’environnement PHP réel et les avis du fournisseur.

Vérification côté serveur

Comment confirmer que le site utilise un PHP corrigé ?

Les vérifications externes révèlent des indices, mais les correctifs doivent être confirmés sur l’hôte, dans les conteneurs ou via le panneau d’hébergement. Consignez l’environnement, la source du paquet, la version corrigée et l’état des processus après mise à jour.

1. Identifiez le PHP qui traite les requêtes

Vérifiez le PHP affecté au site, le module web ou le pool FPM. Inventoriez versions coexistantes, sites, conteneurs et nœuds répartis. php -v indique uniquement la version CLI actuelle, pas forcément celle du web. N’exposez pas de page phpinfo publique pour cette vérification.

php -v

2. Vérifiez la version complète du paquet et l’avis

Interrogez le paquet installé et comparez sa version complète à l’avis de la distribution. Le paquet Ubuntu 24.04 8.3.6-0ubuntu0.24.04.13 inclut déjà le correctif ; PHP 8.3.6 seul masque ce rétroportage. Choisissez l’exemple adapté et ajustez le nom du paquet.

dpkg-query -W php8.3-fpm
rpm -q php-fpm
Consulter la liste officielle des paquets Ubuntu

3. Installez une version corrigée de la branche concernée

Utilisez une version amont corrigée, une version de sécurité ultérieure de la même branche ou un rétroportage confirmé. Mettez à jour le PHP des panneaux, équipements et conteneurs via leurs fournisseurs. PHP 8.1 et antérieurs n’ont plus de support amont régulier : confirmez les correctifs LTS ou migrez. PHP a aussi fourni des rétroportages source minimaux pour 7.4, 8.0 et 8.1.

4. Redémarrez et vérifiez chaque instance

Confirmez le redémarrage de PHP-FPM, Apache ou des autres workers et remplacez conteneurs et nœuds si nécessaire. Des fichiers à jour sur disque ne garantissent pas le remplacement des anciens processus. Requêtes inhabituelles, manque de mémoire et plantages aident l’enquête, mais leur absence ne prouve pas que le système était épargné.

Faites le test vous-même : sept vérifications avec curl

Le script envoie successivement un GET, puis des formulaires URL-encoded et multipart avec POST, PUT et PATCH. Il utilise uniquement des champs texte, sans fichier ni champ de suivi d’envoi. Exécutez-le seulement sur des chemins autorisés adaptés aux tests ; même une requête ordinaire peut déclencher une action.

Bash / curl
#!/usr/bin/env bash
# PHP2Shell HTTP observations: 7 sequential requests, no exploit payload.
set -u

URL="${1:-https://example.com/}"
case "$URL" in
  http://*|https://*) ;;
  *) printf 'ERROR=HTTP(S)_URL_REQUIRED\n' >&2; exit 2 ;;
esac

if ! command -v curl >/dev/null 2>&1 || ! command -v awk >/dev/null 2>&1; then
  printf 'ERROR=CURL_AND_AWK_REQUIRED\n' >&2
  exit 127
fi

probe() {
  printf '\n[%s/7] %s %s\n' "$1" "$2" "$3"
  local method="$2"
  shift 3
  curl -q --globoff --proto '=http,https' --silent --show-error \
    --connect-timeout 5 --max-time 15 --request "$method" \
    --dump-header - --output /dev/null \
    --write-out '\nHTTP_CODE=%{http_code} TOTAL_SECONDS=%{time_total}\n' \
    "$@" --url "$URL" |
  awk '{
    sub(/\r$/, "")
    line = tolower($0)
    if ($0 ~ /^HTTP\// || line ~ /^(server|x-powered-by|content-type):/ || $0 ~ /^HTTP_CODE=/) {
      print
    } else if (line ~ /^set-cookie:[ \t]*phpsessid[ \t]*=/) {
      print "PHPSESSID=present; value hidden"
    }
  }'
  local curl_status="${PIPESTATUS[0]}"
  if [ "$curl_status" -ne 0 ]; then
    printf 'CURL_EXIT=%s\n' "$curl_status"
    FAILED=1
  fi
}

FAILED=0
probe 1 GET baseline
probe 2 POST urlencoded --data-raw 'php2shell_check=1'
probe 3 POST multipart --form-string 'php2shell_check=1'
probe 4 PUT urlencoded --data-raw 'php2shell_check=1'
probe 5 PUT multipart --form-string 'php2shell_check=1'
probe 6 PATCH urlencoded --data-raw 'php2shell_check=1'
probe 7 PATCH multipart --form-string 'php2shell_check=1'
exit "$FAILED"

Utilisez Bash sous Linux/macOS, ou WSL ou Git Bash sous Windows. Enregistrez le fichier php2shell-self-check.sh et lancez la commande ci-dessous avec une URL de test autorisée. Ne collez pas le script Bash directement dans PowerShell.

bash php2shell-self-check.sh https://example.com/test.php

La connexion est limitée à 5 secondes et chaque requête à 15 secondes. Le script ignore la configuration personnelle de curl, vérifie TLS et ne suit pas les redirections ni ne réessaie. Après un 3xx, confirmez que l’URL finale est autorisée avant de la tester. PHPSESSID est seulement signalé comme présent ; les valeurs des cookies et les corps des réponses sont omis.

HTTP_CODE indique le statut et TOTAL_SECONDS la durée totale. Un CURL_EXIT non nul signale un échec de transfert ; les autres vérifications continuent. Un code de sortie non nul indique un problème de saisie, de dépendance ou de transfert. Les HTTP 4xx/5xx sont consignés normalement ; ce code ne juge ni les failles ni les correctifs.

Comment interpréter les résultats du terminal

Les en-têtes de version sont des indices

Server ou X-Powered-By peuvent être masqués ou obsolètes. Vérifiez le PHP qui sert réellement le site : les premières versions officielles corrigées des branches respectives sont 8.2.35, 8.3.36, 8.4.27 et 8.5.12. Confirmez les rétroportages du fournisseur avec la version complète du paquet et son avis de sécurité.

Comparez les deux encodages pour la même méthode

Si, pour la même méthode, urlencoded renvoie 2xx ou 3xx et multipart renvoie 403 ou 406, cela montre seulement une différence de réponse. Cela ne confirme ni un blocage par le WAF ni un rejet avant le passage à PHP.

Une réponse réussie ne prouve pas une analyse par PHP

Un code 2xx ou 3xx pour multipart signifie seulement qu’une réponse de succès ou de redirection a été reçue. Il ne prouve pas que PHP a reçu et analysé le corps, ni ne permet de déterminer si la vulnérabilité est présente.

405 et les indices PHP ne suffisent pas à conclure

Des réponses 405 pour tous les tests ne prouvent pas une correction. Aucun indice PHP ne signifie pas forcément que PHP est absent. Un cookie PHPSESSID ne permet pas non plus de savoir si multipart a été analysé ni quelle couche a produit la réponse.

Voir les versions officielles corrigées et les conseils de mise à jour
Que peuvent faire les mesures temporaires en attendant la mise à jour ?

PHP précise que seule une mise à jour corrige entièrement le problème. Les réglages suivants réduisent certains chemins connus sans sécuriser un environnement non corrigé. Évaluez les besoins applicatifs et les recommandations officielles avant toute modification.

  • Désactivez session.upload_progress.enabled et redémarrez tous les workers. Appliquez ce réglage avant l’analyse des requêtes via php.ini, le pool FPM ou le serveur, sans dépendre de ini_set() ou de .user.ini sous FPM. Seuls les chemins de session confirmés sont bloqués.
  • Pour PHP 8.5, les recommandations officielles incluent la désactivation de fatal_error_backtraces et le redémarrage des workers. Cela couvre uniquement le chemin confirmé des traces d’erreurs fatales, pas les autres variantes.
  • Examinez les limites de taille, de champs et de parties multipart au niveau du serveur web ou du proxy, ainsi que l’accès direct à l’origine sans CDN. Masquer les erreurs, bloquer une seule méthode ou vérifier un seul chemin ne remplace pas un correctif.

Versions officielles corrigées

Vérifiez les seuils corrigés de PHP 8.2 à 8.5

Comparez les versions au sein de chaque branche : le seuil de 8.3 ne détermine pas l’état de 8.4. Ne supposez pas les préversions ou branches inconnues corrigées. Vérifiez rétroportages et compilations personnalisées via les versions complètes, les journaux de compilation et les avis du fournisseur.

Lire les recommandations officielles de mise à jour

Vous utilisez BaoTa Panel ? Mettez PHP à jour depuis la boutique de logiciels

Selon l’annonce de BaoTa du 2026-10-21, certaines versions de sécurité de PHP sont disponibles dans le panneau. Consultez sa boutique de logiciels pour connaître les versions proposées.

Lire l’annonce de mise à jour de BaoTa

Avant la mise à jour, sauvegardez le site, les bases de données et la configuration concernée, puis choisissez un créneau de maintenance adapté.

  1. Repérez le PHP utilisé par votre site

    Connectez-vous à BaoTa Panel, ouvrez Boutique de logiciels → Installés, repérez la version PHP réellement utilisée par votre site et ouvrez sa page de gestion.

  2. Installez la version de sécurité de cette branche

    Vérifiez les mises à jour sur cette page de gestion PHP et suivez les instructions pour installer la version corrigée indiquée ci-dessus pour la même branche, ou une version de sécurité ultérieure de cette branche.

  3. Redémarrez PHP et vérifiez votre site

    Après la mise à jour, redémarrez le service PHP concerné et confirmez le rechargement de tous les workers. Vérifiez la version qui sert réellement le site, puis testez les accès, les téléversements, les connexions aux bases de données et les autres fonctions.

Si plusieurs versions PHP sont installées, vérifiez chacune de celles encore utilisées. Si vous installez une autre version, confirmez aussi que le site utilise désormais l’environnement PHP corrigé.

Questions fréquentes

Questions sur la détection et la correction de PHP2Shell

Distinguez indices de version, codes de statut et rétroportages pour éviter de surinterpréter les résultats.

Qu’est-ce que PHP2Shell et quels sites faut-il vérifier ?

PHP2Shell désigne les failles du cœur PHP CVE-2026-109618 et CVE-2026-109619, pouvant permettre une exécution de code à distance sans authentification. Vérifiez tous les environnements PHP web non corrigés, même si le code applicatif est sûr.

Une réponse 403, 405 ou 413 prouve-t-elle une protection ?

Non. Authentification, méthodes non prises en charge, limites de taille ou proxys peuvent produire ces codes. Un multipart rejeté décrit seulement le chemin actuel, sans prouver que PHP est corrigé ni que tous les vecteurs sont bloqués.

L’absence d’en-têtes PHP signifie-t-elle que le site est épargné ?

Pas forcément. La divulgation de version peut être désactivée et un CDN, proxy inverse ou accueil statique peut masquer le backend. L’absence d’indices signifie que les informations sont insuffisantes : vérifiez l’environnement réel du serveur.

Quelles versions sont corrigées et les anciennes sont-elles toujours vulnérables ?

Les correctifs amont sont dans PHP 8.2.35, 8.3.36, 8.4.27 et 8.5.12. Utilisez une version corrigée ou de sécurité ultérieure de la même branche. Les anciennes peuvent inclure des rétroportages : vérifiez la version complète du paquet et l’avis du fournisseur. PHP 8.1 et antérieurs n’ont plus de support amont régulier. Redémarrez les workers après mise à jour.

Pourquoi examiner PUT et PATCH en plus de POST ?

Les méthodes peuvent emprunter des routes et filtres différents. Depuis PHP 8.4, les applications peuvent utiliser request_parse_body() pour analyser multipart avec des méthodes autres que POST. Toutes ne traitent donc pas PUT ou PATCH automatiquement. Le comportement de POST ne prouve pas la protection des autres méthodes ou chemins.

Comment interpréter POST 200, PUT/PATCH 405 sans indice PHP ?

Notez l’environnement PHP et les correctifs comme non confirmés. POST 200 indique seulement une réponse, 405 un rejet de méthode à une couche donnée. Pages statiques, autres environnements ou PHP masqué peuvent produire ce schéma. Vérifiez l’environnement sur l’hôte sans conclure à la sécurité ni à une faille confirmée.

Les références sur les vulnérabilités et correctifs ont été vérifiées le 2026-10-22. Les observations externes ont leurs limites ; suivez les avis actuels de PHP et du fournisseur pour agir.

Comprenez mieux votre exposition à PHP2Shell

Examinez les réponses publiques une par une, interprétez les éléments et vérifiez les correctifs selon l’environnement réel du serveur.

Découvrir les vérifications