
Non authentifié, téléversement arbitraire de fichier -> RCE dans WPLP Cookie Consent (gdpr-cookie-consent) <= 4.4.1 - analyse technique et PoC
Preuve de concept et analyse technique pour CVE-2026-75865, un téléversement de fichier arbitraire non authentifié conduisant à une exécution de code à distance dans le plugin WPLP Cookie Consent – Cookie Banner & Consent Management for GDPR, CCPA & Google Consent Mode pour WordPress (slug gdpr-cookie-consent), affectant toutes les versions jusqu'à la 4.4.1 incluse.
| Informations clés |
|---|
| CVE | CVE-2026-75865 |
| Sévérité | Critique — CVSS 3.1 9.8 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Faiblesses | CWE-862 (Absence d'autorisation) + CWE-434 (Téléversement sans restriction de fichier de type dangereux) |
| Versions affectées | gdpr-cookie-consent ≤ 4.4.1 |
| Corrigé dans | 4.4.2 |
| Assignateur CVE | Wordfence |
| Publié | 2026-09-01 |
| Découvert par | Supakiad S. (m3ez) |
Les points de terminaison REST du « connecteur » SaaS du plugin authentifient les requêtes en déléguant à l'application SaaS du fournisseur, qui valide un JWT Bearer — mais le plugin vérifie uniquement que le point de terminaison de validation répond avec un code HTTP 200. Il n'existe aucun lien de propriété entre le JWT et le site cible, de sorte que tout jeton valide émis par le SaaS (par exemple, issu d'un compte gratuit) est accepté.
La fonction saas_upload_logo() écrit ensuite un blob base64 fourni par l'attaquant dans le répertoire public wp-content/uploads/ sous un nom de fichier fourni par l'attaquant, sans aucune validation du contenu ou de l'extension. Le jeton API stocké (master_key) qui protège également le point de terminaison n'est en réalité pas secret : la propre route /store-auth du plugin l'écrase à partir des paramètres de la requête après la même vérification JWT, de sorte que la chaîne complète — de la requête non authentifiée à l'exécution d'une charge utile dans la racine web — ne nécessite qu'une URL cible et un compte SaaS gratuit.
La vulnérabilité a été corrigée dans la version 4.4.2 en supprimant entièrement le point de terminaison de téléversement et en repensant le modèle de confiance du connecteur (liaison de propriété JWT, hash_equals(), signature HMAC des requêtes).
Analyse technique complète : REPORT.md
| Fichier | Description |
|---|---|
REPORT.md | Analyse technique détaillée : analyse de la cause racine avec code référencé par lignes, comparaison du correctif 4.4.1 → 4.4.2, chaîne d'exploitation, détection et atténuation |
cve_2026_75865.py | Script PoC — analyse une liste de cibles, détecte les sites vulnérables et exécute la chaîne complète (énumération admin → écrasement de la clé maîtresse → téléversement de la charge utile → vérification) avec sortie en direct |
payload.php | Charge utile bénigne minimale utilisée par défaut : affiche une chaîne de marquage et prend en charge l'auto-suppression (?delete=1) |
git clone https://github.com/ghostpels/CVE-2026-75865.git
cd CVE-2026-75865
pip install requests # colorama est optionnel (journaux colorés)
# 1. Enregistrez un JWT SaaS valide (n'importe quel compte sur app.wplegalpages.com) dans jwt.txt
# 2. Créez une liste de cibles et exécutez uniquement contre les systèmes que vous êtes autorisé à tester :
python cve_2026_75865.py -l targets.txt -o vuln.txt -t 40 --marker CVE-2026-75865-POC
Les URL de charge utile vérifiées sont ajoutées à vuln.txt en direct, une par ligne, dès que chaque cible est vérifiée.
| Option | Défaut | Description |
|---|---|---|
-l, --list | (requis) | Liste des cibles, une URL par ligne |
-o, --output | vuln.txt | URL de charge utile vérifiées, ajoutées en direct |
-t, --threads | 40 | Workers simultanés |
--shell | payload.php | Fichier de charge utile à côté du script ; nom téléversé = son nom de base |
--filename | — | Nom de fichier téléversé personnalisé (son extension est essayée en premier, puis --exts) |
--exts | php,phtml,php5,php74,php7,php3,php4,phar | Extensions de repli lorsque l'extension principale est bloquée |
--jwt-file | jwt.txt | JWT SaaS, première ligne non vide |
--marker | — | Chaîne qui doit apparaître dans la réponse de la charge utile pour être considérée comme valide |
--timeout | 15 | Délai d'expiration par requête (secondes) |
-k, --insecure | désactivé | Désactiver la vérification TLS |
-v, --verbose | désactivé | Afficher les détails des erreurs de connexion |
Ce dépôt est publié uniquement à des fins de recherche éducative et de sécurité défensive. Utilisez l'outil exclusivement contre des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite de test. L'auteur n'est pas responsable de toute utilisation abusive ou de tout dommage causé par ce matériel.