路径遍历漏洞与防护
字数 1038 2025-11-05 08:31:58
路径遍历漏洞与防护
1. 漏洞描述
路径遍历(Path Traversal,也称目录遍历)是一种利用文件操作接口对非授权目录进行访问的安全漏洞。攻击者通过构造特殊路径(如../)绕过系统限制,读取或写入任意文件(如系统配置文件、日志、源代码等)。常见于文件下载、上传、展示等功能模块。
2. 漏洞原理
关键问题:用户输入未正确过滤
例如,文件下载功能根据用户传入的文件名直接拼接路径:
http://example.com/download?file=report.pdf
实际路径:/var/www/files/report.pdf
但如果用户输入file=../../../etc/passwd,拼接后可能变为:
/var/www/files/../../../etc/passwd
等效路径:/etc/passwd
系统未对../进行过滤,导致越权访问。
3. 攻击场景示例
场景1:文件下载功能
假设代码逻辑如下:
$filename = $_GET['file'];
$filepath = "/var/www/files/" . $filename;
readfile($filepath);
攻击者请求:
download?file=../../etc/passwd
服务器可能返回敏感文件内容。
场景2:压缩包解压
若服务端解压用户上传的压缩包,且压缩包内包含恶意路径(如../../script.sh),可能覆盖系统文件。
4. 漏洞挖掘方法
- 手工测试:在文件参数中尝试输入以下 payload:
../../../etc/passwd....//....//etc/passwd(双重编码或特殊绕过)- 绝对路径(如
/etc/passwd)
- 工具辅助:使用 Burp Suite 的 Scanner 模块或专门路径遍历工具(如 dotdotpwn)。
5. 防护方案
方案1:输入验证与标准化
- 白名单校验:只允许特定字符或文件扩展名(如
[a-zA-Z0-9]\.pdf)。 - 路径规范化:使用
realpath()或Path.GetFullPath()解析完整路径,并检查是否在允许目录内:$basePath = "/var/www/files/"; $userPath = realpath($basePath . $filename); if (strpos($userPath, $basePath) !== 0) { die("非法路径!"); }
方案2:文件索引映射
- 不直接使用用户输入的文件名,而是通过数字ID映射到实际文件:
download?id=123 → 实际文件:safe_name_xyz.pdf
方案3:Web服务器配置
- 限制访问目录(如Nginx的
root指令配置为最小权限路径)。 - 禁用敏感目录的HTTP访问(如
/etc/)。
方案4:安全编码实践
- 避免直接拼接路径,使用语言内置的安全函数(如Python的
os.path.join)。 - 对压缩包解压行为进行路径检查,拒绝包含
../的文件。
6. 漏洞案例
- Apache Tomcat CVE-2020-1938:通过特定请求读取Web应用外任意文件。
- 某网盘应用路径遍历:通过修改URL参数下载其他用户私有文件。
总结
路径遍历漏洞的核心在于对用户输入过度信任。防护需结合输入验证、路径标准化、最小权限原则等多层措施,确保文件操作严格限制在预期范围内。