姓名: CYBER-SEC
联系方式: [email protected]
Matomo 允许经过认证的站点管理员将站点的 main_url 配置为内部地址。任何具有查看权限的认证用户之后都可以触发 getTrackingMethodsForSite,导致服务器向配置的 URL 发起盲 HTTP 请求。
目标地址仅通过基于主机名的防护进行验证,并且在解析后未能正确拒绝环回地址、RFC1918 地址或链路本地地址。因此,该应用程序可能被滥用,以对内部服务执行盲服务器端请求。
产品: Matomo
受影响版本: 已验证 5.11.2
组件: SiteContentDetector / SitesManager
向量: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:N/A:N
基础评分: 5.8 中等
enable_internet_features。main_url。该问题涉及以下流程:
来源:
SitesManager.updateSite 在基本 URL 验证后存储 main_url。
触发:
GET /index.php?module=SitesManager&action=getTrackingMethodsForSite&idSite=<id>
汇聚点:
SiteContentDetector::requestSiteResponse()
-> Http::sendHttpRequestBy()
该实现未能正确拒绝内部目标地址,例如:
127.0.0.0/8
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
169.254.0.0/16
::1
fc00::/7
fe80::/10
重定向目标也应重新验证,因为如果最初允许的主机名重定向到内部地址,基于主机名的过滤可能被绕过。
在授权的实验室环境中使用您控制的监听器:
python3 -m http.server 8088
作为经过认证的站点管理员,将站点的 main_url 配置为指向受控的内部监听器:
http://<受控内部监听器>:8088/ssrf-test
除非您拥有该环境并获授权进行测试,否则不要针对第三方系统或云元数据端点进行测试。
作为具有查看权限的认证用户,触发:
GET /index.php?module=SitesManager&action=getTrackingMethodsForSite&idSite=1
受控监听器会收到来自 Matomo 服务器的服务器端 HTTP 请求。
示例监听器输出:
GET /ssrf-test HTTP/1.1
Host: <受控内部监听器>:8088
User-Agent: Matomo
当触发 getTrackingMethodsForSite 时,Matomo 会向配置的 main_url 发起服务器端 GET 请求。
这是通过一个外部无法访问的内部环回/内部 HTTP 监听器验证的,确认了盲 SSRF 行为。
经过认证的攻击者可能滥用此行为进行:
由于 SSRF 是盲的,攻击者不会直接通过 Matomo 收到 HTTP 响应正文。然而,仅请求投递本身在内部网络和云环境中仍可能具有安全意义。
建议的修复措施:
在发起请求之前将主机名解析为 IP 地址。
在 DNS 解析后拒绝私有、环回、链路本地、组播以及其他不安全的 IP 范围。
在跟随重定向前重新验证每个重定向目标。
优先使用严格的允许出站域名白名单,而不是主机名黑名单。
在最终的 HTTP 请求汇聚点一致地应用 SSRF 防护,而不仅仅是在站点 URL 配置期间。
考虑将 getTrackingMethodsForSite 或 SiteContentDetector 的触发限制为更高权限的用户。
为由站点配置触发的出站服务器端请求添加审计日志。
已针对官方 Matomo 5.11.2 Docker 镜像进行验证,未修改源代码。
此问题由 CYBER-SEC 报告。