最近不忙,就琢磨了些新出炉的漏洞。最近高危洞真不少,像 CVE-2025-1097、CVE-2025-1098、CVE-2025-24514、CVE-2025-1974 这些 Kubernetes Ingress-Nginx 的 RCE 漏洞,杀伤力巨大,内网渗透里能直接打穿整个 K8S 集群。
不过,我今天想聊的倒不是这些,而是另一个引起我注意的洞:CVE-2025-30208 —— Vite 开发服务器的任意文件读取漏洞。说实话,很多刚入门安全的朋友可能不太看得上任意文件读取,觉得它“鸡肋”,但这其实是一种偏见。CVE-2025-30208 利用简单,影响面又广,正好拿它当个例子,聊聊这种漏洞的“操作空间”到底有多大。
漏洞原理简述
CVE-2025-30208 的原理其实不复杂。Vite 开发服务器提供了 @fs 机制来限制访问白名单之外的文件。问题出在 URL 解析的正则处理上。攻击者可以通过在请求后附加 ?raw?? 或 ?import&raw?? 这类查询参数,绕过安全检查,从而读取服务器上的任意文件。
例如,常见的 Vite 配置会像这样限制可访问目录:
server: {
fs: {
allow: [path.resolve(__dirname, 'src')]
}
}
但由于 URL 解析时对查询参数的处理不当,构造如下请求就能绕过 server.fs.allow 的限制:
GET /etc/passwd?raw??
GET /etc/passwd?import&raw??
GET /@fs/etc/passwd?raw??
GET /@fs/etc/passwd?import&raw??
理论上,这个漏洞只影响那些明确将 Vite 开发服务器暴露到公网的应用(比如用了 --host 或 server.host 配置)。但公网资产测绘的结果显示,这类暴露的资产数量相当可观,实际测试成功率也不低,难怪各家厂商都给标了高危。相关的漏洞利用工具已在 GitHub 公开。
关键文件:.bash_history 是什么?
在深入利用前,得先明白一个关键文件:.bash_history。它是 Linux 系统下用户命令历史的持久化存储文件,默认位于用户的家目录下(root 用户在 /root/.bash_history,普通用户在 /home/用户名/.bash_history)。
当你启动一个 Shell,系统会从这个文件读取历史命令到内存缓冲区。你执行的命令会先记录在缓冲区,退出 Shell(比如按 Ctrl+D)时,缓冲区内容才会被写回 .bash_history 文件。这意味着,这个文件里很可能藏着之前执行过的、包含敏感信息的命令。
漏洞利用实战:从读取到突破
理论讲完,实践开始。以下是基于外网真实目标的利用过程(仅作技术研究探讨,请务必遵守法律法规)。
首先,通过漏洞读取 /etc/passwd,了解系统上有哪些用户。

接着,尝试读取 root 用户的命令历史:

看到 permission denied?这很正常,很多服务并非以 root 权限运行。这时就需要转向其他在 /etc/passwd 中发现的用户。尝试读取例如 /home/某用户/.bash_history。

看,发现了什么?SSH 相关的 authorized_keys 文件和 .ssh/ 目录路径!刚读出来的 .bash_history 内容可能很杂乱,可以用文本编辑器进行格式化查看,逻辑会更清晰。


接下来的事情就顺理成章了:利用同一个漏洞,直接读取 /home/用户名/.ssh/id_rsa 文件,成功拿到了 SSH 私钥。当然,你也可以直接“盲猜”常见的私钥路径进行批量尝试:
/root/.ssh/id_rsa?import&raw??
/root/.ssh/id_ed25519?import&raw??
/@fs/root/.ssh/id_rsa?raw??
/@fs/root/.ssh/id_ed25519?import&raw??
不光是 SSH 私钥,.bash_history 里还可能藏着数据库连接命令(包含账号密码)、API 密钥、甚至是其他服务的明文密码。

没想到吧?一个“小小”的任意文件读取,通过 .bash_history 这个跳板,竟能打开如此大的局面。
案例扩展:任意文件读取的组合技
为了进一步说明任意文件读取的危害,我再分享一个之前在授权测试中遇到的实战案例(漏洞已修复,仅作技术警示)。
在某高校平台的信息搜集过程中,发现一个图片读取接口 /system/common/getPic?path= 存在路径遍历,可无鉴权读取任意文件。
https://target.edu.cn/system/common/getPic?path=/../../../../../../../../../../../../../../../../../etc/passwd

成功读取系统用户列表后,自然想到去读 root 和关键管理用户的 .bash_history 文件。

在历史记录中,发现了 Apache Tomcat 的绝对安装路径。于是顺藤摸瓜,尝试读取 Tomcat 的日志文件。
https://target.edu.cn/system/common/getPic?path=/../../../../../../../../../../../../usr/local/apache-tomcat-8.5.50/logs/localhost_access_log.2023-10-25.txt

在日志里,赫然发现该平台用户登录时,竟然使用 GET 请求并以明文传输用户名和密码!接下来,编写一个简单的 Python 脚本,利用该漏洞批量下载了多日的日志文件。

再通过脚本对海量日志进行正则匹配提取,最终获得了大量平台用户的明文账号密码。凭借这些凭证登录系统后,结合其他漏洞,最终成功实现 Getshell。整个过程,任意文件读取漏洞成了撕开防线的最关键一环。
总结与思考
通过 CVE-2025-30208 和上述实战案例,我们可以看到,任意文件读取绝非“鸡肋”。它可能直接泄露敏感配置文件、源代码、密钥,更可以通过 .bash_history、日志文件等“跳板”,关联出数据库凭证、后台密码,甚至间接导致系统沦陷。
在安全评估中,我们不应轻视任何一类漏洞。防守方也需注意,不仅要修复漏洞本身,还应检查相关日志、历史记录是否已泄露敏感信息,并定期清理或保护这些文件。对于开发者而言,避免将开发服务器暴露于公网、对用户输入进行严格过滤和校验,都是基本的安全准则。
希望这篇从具体漏洞切入的杂谈,能让大家对任意文件读取的风险有更深的认识。安全是一个持续对抗的过程,细节往往决定成败。如果你有更多有趣的利用思路或防护见解,欢迎在 云栈社区 的安全技术论坛 与其他安全爱好者一起交流探讨。