CVE-2026-9721CVE-2026-9721是WordPress Book a Room Event Calendar插件中存在的一个跨站请求伪造(CSRF)漏洞。该漏洞影响该插件所有1.9及以下版本,CVSS评分为4.3,属于中危级别。
Book a Room Event Calendar是一款用于WordPress的事件日历管理插件,允许管理员配置外部数据库连接来管理房间预订和事件信息。该插件提供了一个设置页面,管理员可以在该页面上配置外部数据库的主机名、用户名、密码、数据库名前缀、数据库名称、加密密钥以及注册页面URL等敏感信息。
该漏洞的核心问题在于插件的设置表单处理函数中完全缺失CSRF防护机制。具体来说,插件的options page handler通过POST参数中的'action'字段进行分发,当接收到特定action值时会调用update_settings()函数来持久化插件配置。然而,在整个插件代码中,既没有使用wp_nonce_field()生成nonce字段,也没有调用check_admin_referer()或wp_verify_nonce()来验证请求的合法性。这意味着任何能够诱使已登录的管理员点击恶意链接或访问恶意页面的攻击者,都可以利用CSRF攻击修改插件的关键配置信息。
由于该漏洞无需认证即可利用(PR:N),且仅需要用户交互(UI:R),攻击者可以通过社会工程学手段构造恶意页面,诱骗WordPress管理员在已登录状态下访问,从而在管理员不知情的情况下修改数据库连接设置,可能导致数据泄露、服务中断或进一步的攻击行为。
该漏洞的技术原理基于WordPress插件开发中常见的CSRF防护缺失问题。
**漏洞原理:**
WordPress使用nonce(number used once)机制来防止CSRF攻击。nonce是一个一次性令牌,由服务器生成并嵌入到表单中,提交表单时必须同时提交该令牌,服务器端通过wp_verify_nonce()或check_admin_referer()进行验证。如果令牌缺失或不匹配,请求将被拒绝。
在Book a Room Event Calendar插件中,bookaroom-events-settings.php文件的设置表单处理逻辑存在严重缺陷:
1. **设置表单(第15行附近)**:settings_form()函数负责渲染插件设置页面,但该函数没有调用wp_nonce_field()来生成nonce字段,因此提交的表单中不包含任何CSRF令牌。
2. **设置更新(第103行和第161行附近)**:update_settings()函数处理表单提交,通过update_option()函数将外部数据库的主机、用户名、密码、前缀、数据库名、加密密钥和注册页面URL等配置写入WordPress选项表。该函数没有调用check_admin_referer()或wp_verify_nonce()来验证请求来源的合法性。
3. **Action分发机制**:插件的options page handler通过$_POST['action']参数进行分发,攻击者只需构造包含正确action值的POST请求即可触发update_settings()的执行。
**利用方式:**
攻击者可以构造一个恶意HTML页面,其中包含一个自动提交的隐藏表单,表单的action指向目标WordPress站点的管理页面,action参数设置为触发update_settings()的值,表单字段包含攻击者控制的恶意数据库连接配置。当已登录的管理员在浏览器中访问该恶意页面时,浏览器会自动提交表单,由于缺少nonce验证,服务器会接受并处理该请求,将攻击者指定的数据库配置写入插件选项中。
**潜在危害:**
虽然CVSS评分仅为4.3(因为完整的影响需要管理员交互),但成功利用此漏洞后,攻击者可以:
- 将数据库连接指向攻击者控制的服务器,窃取所有事件和预订数据
- 修改加密密钥,影响数据的机密性
- 修改注册页面URL,进行钓鱼攻击
- 通过恶意数据库配置导致服务不可用