路径遍历漏洞与防护
字数 1399 2025-11-28 06:07:39
路径遍历漏洞与防护
1. 漏洞描述
路径遍历(Path Traversal)是一种通过构造特殊输入绕过系统对文件路径的合法校验,从而访问或操作本应受限的文件或目录的安全漏洞。攻击者利用此漏洞可读取敏感文件(如系统配置文件、日志、密码文件),甚至写入恶意文件。常见于文件下载、上传、预览等功能模块。
2. 漏洞原理与攻击场景
2.1 核心问题
应用程序未对用户输入的文件路径进行规范化或严格校验,直接将其拼接至基础路径中。例如:
$file = $_GET['file']; // 用户输入"../../../etc/passwd"
$base_path = "/var/www/uploads/";
$full_path = $base_path . $file; // 最终路径:/var/www/uploads/../../../etc/passwd
系统解析路径时,../会向上跳转目录,导致访问/etc/passwd。
2.2 常见攻击向量
- 文件下载功能:
download.php?file=../../config/database.yml - 日志查看功能:
log_viewer.php?log=../../../var/log/auth.log - 模板加载功能:
template.php?name=../../../tmp/malicious.php
3. 漏洞验证与利用步骤
3.1 探测潜在入口
- 识别文件操作参数:观察URL中如
file、path、filename等参数。 - 测试基础Payload:
- 使用
../尝试跳转目录:file=../../../etc/passwd - 编码绕过:URL编码(
..%2F)、双重编码(..%252F)、Unicode编码(..%c0%af)。
- 使用
3.2 绕过常见防护
- 过滤
../:尝试....//(过滤后变为../)或..././。 - 绝对路径拼接:若基础路径为
/var/www/,输入/etc/passwd可能直接访问系统根目录。 - 操作系统差异:
- Windows下使用
..\或....\,路径分隔符可为/或\。 - 空字节截断(PHP 5.3.4前):
file=../../../etc/passwd%00.jpg。
- Windows下使用
4. 防护方案
4.1 输入校验与规范化
- 白名单校验:仅允许预期内的文件名或字符(如字母、数字、短横线)。
import os allowed_files = ["report.pdf", "data.csv"] if file_input not in allowed_files: raise InvalidInputError("非法文件名") - 路径规范化后校验:
Path basePath = Paths.get("/var/www/uploads"); Path userPath = Paths.get(userInput).normalize(); // 解析"../" if (!userPath.startsWith(basePath)) { throw new SecurityException("路径越界"); }
4.2 安全存储与映射
- 文件重命名:存储文件时使用随机名称(如UUID),避免用户控制文件名。
- 虚拟文件系统:通过文件ID映射实际路径,用户仅能访问ID对应的文件。
4.3 最小权限原则
- Web服务器进程以低权限运行,限制其对系统文件的读写能力。
- 使用chroot或容器隔离文件访问范围。
5. 进阶绕过与防护对抗
5.1 罕见绕过技巧
- 路径截断:利用系统路径长度限制(如Windows的260字符)或特殊字符(如
/./、//)。 - 符号链接攻击:若允许上传软链接,可能指向敏感文件(需结合上传漏洞)。
5.2 深度防护策略
- 动态检测:监控文件操作日志,识别异常路径访问模式。
- WAF规则:拦截包含
../、etc/passwd等敏感模式的请求。
6. 实战案例
某云盘服务曾存在路径遍历漏洞:
- 漏洞点:
/download?file=user_upload/{user_id}/{文件名}。 - 攻击:将
文件名改为../../其他用户ID/私密文件,越权下载他人文件。 - 修复:引入文件ID映射机制,彻底解耦用户输入与物理路径。
通过以上步骤,可系统掌握路径遍历漏洞的成因、利用手法及防护要点。