什么是目录遍历漏洞?
目录遍历漏洞(Directory Traversal,也称为路径穿越漏洞,Path Traversal)是指 Web 应用在处理用户输入的文件路径时,未对路径参数进行严格限制和过滤,导致攻击者能够通过构造特殊路径(如 ../ 或 ..\\)访问应用服务器上的任意文件。攻击者可以借此绕过权限控制,获取敏感信息甚至进一步攻击系统。
目录遍历漏洞的危害
- 信息泄露
攻击者可读取服务器上的敏感文件,如应用配置文件、源码、用户数据、证书密钥、系统文件(如
/etc/passwd、C:\windows\system32\drivers\etc\hosts)。
- 助力进一步攻击
结合其它漏洞利用泄露的敏感数据进行提权、账号攻击等。
- 安全设置及凭据暴露
数据库连接配置、接口密钥等被泄露,系统安全边界被突破。
攻击原理举例
假设 Web 应用允许用户下载日志文件,通过如下 URL:
http://example.com/download?file=log2026.txt
如果程序直接将参数拼接到文件路径:
filepath = "/home/app/logs/" + file
with open(filepath) as f:
return f.read()
攻击者可传递如下参数:
file=../../../../etc/passwd
最终实际访问路径变为:
/home/app/logs/../../../../etc/passwd
文件系统会解析并返回 /etc/passwd 的内容。
常见目录遍历攻击手段
- 发送多个
../ 或 ..\\ 穿越多层目录
- 使用 URL 编码(如
%2e%2e%2f 代表 ../)或双编码绕过过滤
- 拼接合法文件类型骗过后端限制,例如
../../../../etc/passwd.txt
- 穿越到 Web 根目录或系统目录读取源代码、配置、密码等文件
常见受影响的场景
- 图片、文档、附件下载接口
- 日志查看、导出功能
- 静态文件访问、资源代理接口
- 任意接收文件名、文件路径参数的 API
防御目录遍历漏洞的措施
- 限制输入文件名
- 只允许选择白名单或数据库中的合法文件名,不允许用户直接输入路径。
- 禁止出现
../、\、/、%2e、%2f、%5c 等特殊字符。
- 使用固定、安全的目录进行文件操作
- 所有文件操作路径强制限定在受保护的目录,拒绝绝对路径及穿越路径。
- 路径归一化后校验
- 采用操作系统函数(如
os.path.normpath)规范化用户输入路径,再判断其是否位于允许的目录内。
- 最小化文件读取权限
- 程序用户只具备必须目录的访问权限,防止意外读取或写入系统重要文件。
- 输出和错误处理不能输出敏感文件内容
- 防止攻击者通过错误信息发现目录结构和敏感文件路径。
- 日志监控和告警
代码示例:路径校验防护
import os
BASE_DIR = "/home/app/logs/"
def safe_join(base, path):
# 路径归一化 + 检查防止越权
final_path = os.path.normpath(os.path.join(base, path))
if not final_path.startswith(base):
raise Exception("路径越权!")
return final_path
# 示例用法
try:
user_input = "../../etc/passwd"
fpath = safe_join(BASE_DIR, user_input)
with open(fpath) as f:
content = f.read()
except Exception as e:
print("非法访问!", e)