术语表

路径遍历是什么 — 用 ../ 读取服务器上「本不该交出的文件」的漏洞

路径遍历(目录遍历)是一种在文件名输入中混入 ../ 等字符,从而读写到本不该公开的位置(.env、配置、密钥、/etc)的漏洞。本文用图解讲解其原理,并从防御视角解说主要防御手段(不把输入直接用作路径、将其限制在基准目录内)。

发布于 2026-06-10 更新于 2026-10-06 3 分钟阅读
本页目录

路径遍历是指在文件名的地方混入 ../,结果连服务器深处的 .env 都能读到。本文讲解其原理与可靠的防范方法(不会写出攻击步骤)。

会出现在哪里

凡是「用用户输入来选择文件」的地方都是候选。

功能危险的用法
下载/预览把 ?file= 中的文件名原样使用
图片/附件的显示用 URL 参数拼出路径的一部分
上传在保存目标路径中使用用户指定的名字(写入型·最危险)
模板/语言文件读取用 ?lang= 等动态选择文件

为什么会成立(原理)

../ 表示「向上一级目录」。当应用把 公开文件夹 + 用户输入 原样拼接起来打开文件时,用叠加了 ../ 的输入就能访问到公开文件夹之外的文件。

设想:/var/www/files/ + 用户输入
在输入中叠加「向上一级」(../ ../ ../ …)
↓ 应用未规范化就拼接并 open()
到达基准文件夹之外(.env·配置·密钥·/etc)=读取/写入
把用户输入原样拼接到基准文件夹上,叠加 ../ 就会到达外部的文件。

读取会导致信息泄露,写入(上传)则会被在任意位置放置文件,有时还会发展为 RCE。

防御:不把输入用作路径 + 限制在基准内

1

不把用户输入用作生文件路径(最重要)

要公开的文件用 ID→实际文件的对应表(白名单)来查。用户传入的只是「第 3 号」「invoice」等标识符,实际路径由服务器决定。

2

规范化之后,务必确认「是否在基准目录的内侧」

用语言标准的路径规范化(相当于 resolve/realpath)转换为绝对路径,并校验它是否以所允许的基准目录开头。在外面就拒绝。../ 的简单字符串删除存在编码绕过,因此不可取。

3

以最小权限运行应用

把应用运行用户能读取的文件收窄到业务所需的范围。即便万一被逃出,只要本来就读不到,就不会产生危害。

4

把「不该交出的东西」放到公开根目录之外

.env·.git·密钥·备份,本来就不要放在 Web 根目录或上传文件夹里。仅靠放置位置就能消除可被攻击的对象。

本站的视角:它与放置位置的失误属于同一类问题,要按正确的顺序修复

路径遍历与 .env 公开的事故属于同一类问题。两者都是「本不该经由 Web 送达的东西,却经由 Web 送达了」。临时措施(响应头或简单过滤)只能掩盖表面,只要代码和放置位置没修好,就会从别的路径泄露。顺序是①不把输入用作路径的代码 ②基准目录内的检查 ③根本上把秘密挪到公开根目录之外。再配合阅读 在共享租用服务器上的安全配置,就能了解根本对策是怎样起作用的。

与类似问题的区别

结果看起来可能一样,都是「本应保密的文件能从外部读到」,但原因决定了该在哪里修复。

问题原因修复位置
路径遍历指向文件的输入能逃出允许的范围应用代码(不把输入用作路径)
本地文件包含(LFI)由输入选择程序要加载并执行的文件应用代码(固定可加载的文件)
文件遗留在公开目录中.env 或 .git 放在了 Web 可见的位置(→ 遗留在公开目录中的机密)文件放置位置与 Web 服务器设置
IDOR文件 ID 格式正确,却能指向别人的文件应用的权限检查

实例:Web 服务器本身的缺陷

路径遍历不仅出现在自研应用中,也出现在被广泛使用的产品里。

  • Apache HTTP Server 2.4.49(2021 年):存在路径遍历缺陷(CVE-2021-41773),Apache 项目表示已知该缺陷在实际环境中被利用。2.4.50 对其进行了修复,但修复并不完整(CVE-2021-42013),于是在 2.4.51 中再次修复。视配置而定,它不仅会导致文件被读取,还会导致 RCE。
  • WordPress 核心(2026 年):解析页面模板的代码中存在路径遍历,由此导致的文件包含缺陷(CVE-2026-87902)在特定条件下可达 RCE(→ CVE-2026-87902 解说)。

2024 年 5 月,美国 CISA 与 FBI 发布警示,要求厂商消除这类缺陷。据其所述,当时 CISA 的 KEV(已确认被利用的漏洞列表)中收录了 55 个目录遍历漏洞。在 MITRE 于 2025 年 12 月公布的「CWE Top 25」中,路径遍历(CWE-22)排在第 6 位。

检查自己网站的方法

1

找出接收输入的文件操作

在代码中搜索打开或发送文件的函数(open、readFile、sendFile、include 等)以及拼接路径的处理(path.join 等),确认请求中的值是否会流入其中。

2

确认检查的顺序

在使用输入的地方,确认是先规范化路径(path.resolve 或 realpath),然后才检查它是否在基准目录内。如果代码只在规范化之前检查字符串,就要修正顺序。

3

确认 Web 服务器和产品的版本

确保没有在运行存在已知路径遍历的版本,例如 Apache 2.4.49 或 2.4.50。CVE / KEV 查询可以查看你所用产品的已知漏洞。

4

检查不该被看到的文件

用网站检测确认 .env、.git 和数据库转储无法从外部读取。如果能读到,就把修正放置位置作为与路径遍历不同的另一项工作来处理。

参考资料(一手来源)

  • CISA and FBI, "Secure by Design Alert: Eliminating Directory Traversal Vulnerabilities in Software"(2024 年 5 月 2 日)— cisa.gov(KEV 中的 55 个条目、使用随机标识符)
  • Apache HTTP Server, "Apache HTTP Server 2.4 vulnerabilities" — httpd.apache.org(CVE-2021-41773、CVE-2021-42013)
  • MITRE, "2025 CWE Top 25 Most Dangerous Software Weaknesses"(2025 年 12 月)— cwe.mitre.org(CWE-22 排名第 6)
  • OWASP, "Path Traversal" — owasp.org
  • IPA「安全なウェブサイトの作り方」— ipa.go.jp(日语;未检查的路径参数/目录遍历)

接下来阅读

分类编号

CWE 对导致漏洞的弱点类型进行分类,MITRE ATT&CK 对攻击者的技术进行分类。两者均由 MITRE 维护,广泛用于标注漏洞信息和检测规则。

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

Q路径遍历会泄露什么?
A

本来这个应用不应让人接触到的文件。典型例子有 .env(数据库凭据、API 密钥)、配置文件、私钥、源代码、操作系统的 /etc 目录下的文件等。不仅是读取,一旦被滥用于指定上传目标路径,还会被写入到任意位置,进而可能发展为 RCE(任意代码执行)。

Q最主要的防御是什么?
A

就是「不把用户的输入原样用作文件路径」。如果实在要用,就把它转换为白名单(ID 或固定的文件名集合),并用库对路径进行规范化后,务必确认「它是否落在基准目录的内侧」。仅靠扩展名校验或简单地删除 ../ 是会被绕过的。

Q用 .htaccess 或响应头堵上就行了吗?
A

那只是针对「本不该交出的文件被放在了公开目录」这一另一个问题的临时措施。根本在于纠正配置「把应用本体、.env、.git 放到公开根目录之外」,以及编写不把输入用作路径的代码。临时措施和根本对策是两项不同的工作。

Q目录遍历和路径遍历是同一回事吗?
A

是的。日本 IPA 的指南称之为目录遍历(directory traversal),MITRE 的分类(CWE-22)称之为 Path Traversal。两者都指「指向文件的输入能够触及允许范围之外的文件」。

Q给文件分配随机 ID 能防住吗?
A

这是一种有效的做法。美国 CISA 与 FBI 在 2024 年 5 月的警示中,建议为每个文件生成随机标识符,并把原始文件名等相关信息另行保存。这样用户输入就不会成为路径的一部分,这类缺陷也就无从发生。

Q它和本地文件包含(LFI)有什么区别?
A

路径遍历是指能够读写允许范围之外的文件。LFI(Local File Inclusion)是指由输入来选择程序要加载并执行的文件,而路径遍历常被用来让它指向外部的文件。由于 LFI 不只是读取,而是把文件当作代码执行,因此更容易发展为 RCE。