路径遍历是指在文件名的地方混入 ../,结果连服务器深处的 .env 都能读到。本文讲解其原理与可靠的防范方法(不会写出攻击步骤)。
会出现在哪里
凡是「用用户输入来选择文件」的地方都是候选。
| 功能 | 危险的用法 |
|---|---|
| 下载/预览 | 把 ?file= 中的文件名原样使用 |
| 图片/附件的显示 | 用 URL 参数拼出路径的一部分 |
| 上传 | 在保存目标路径中使用用户指定的名字(写入型·最危险) |
| 模板/语言文件读取 | 用 ?lang= 等动态选择文件 |
为什么会成立(原理)
../ 表示「向上一级目录」。当应用把 公开文件夹 + 用户输入 原样拼接起来打开文件时,用叠加了 ../ 的输入就能访问到公开文件夹之外的文件。
读取会导致信息泄露,写入(上传)则会被在任意位置放置文件,有时还会发展为 RCE。
防御:不把输入用作路径 + 限制在基准内
不把用户输入用作生文件路径(最重要)
要公开的文件用 ID→实际文件的对应表(白名单)来查。用户传入的只是「第 3 号」「invoice」等标识符,实际路径由服务器决定。
规范化之后,务必确认「是否在基准目录的内侧」
用语言标准的路径规范化(相当于 resolve/realpath)转换为绝对路径,并校验它是否以所允许的基准目录开头。在外面就拒绝。../ 的简单字符串删除存在编码绕过,因此不可取。
以最小权限运行应用
把应用运行用户能读取的文件收窄到业务所需的范围。即便万一被逃出,只要本来就读不到,就不会产生危害。
把「不该交出的东西」放到公开根目录之外
.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 位。
检查自己网站的方法
找出接收输入的文件操作
在代码中搜索打开或发送文件的函数(open、readFile、sendFile、include 等)以及拼接路径的处理(path.join 等),确认请求中的值是否会流入其中。
确认检查的顺序
在使用输入的地方,确认是先规范化路径(path.resolve 或 realpath),然后才检查它是否在基准目录内。如果代码只在规范化之前检查字符串,就要修正顺序。
确认 Web 服务器和产品的版本
确保没有在运行存在已知路径遍历的版本,例如 Apache 2.4.49 或 2.4.50。CVE / KEV 查询可以查看你所用产品的已知漏洞。
检查不该被看到的文件
用网站检测确认 .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(日语;未检查的路径参数/目录遍历)
接下来阅读
- 事故:把 .env 整个公开出去的事故
- 对策:租用服务器上的 .env 保护 / 术语:RCE 是什么