路径遍历漏洞:原理、危害与防御实践

一、路径遍历漏洞的本质解析

路径遍历漏洞(Path Traversal)的本质是输入验证缺失导致的文件系统访问控制失效。当Web应用将用户输入的路径参数直接拼接至系统文件操作时,攻击者可通过构造../等特殊字符实现目录跳转,突破应用预设的访问边界。

1.1 漏洞触发条件

  • 用户可控的路径参数:如文件下载接口的filename参数、图片上传的save_path参数
  • 动态文件操作:使用fopen()File.read()等函数直接操作用户指定路径
  • 权限配置不当:Web服务进程对目标目录具有读取/写入权限

典型攻击场景示例:

  1. 正常请求:/download?file=report.pdf
  2. 恶意请求:/download?file=../../etc/passwd

攻击者通过4个../成功跳转至系统根目录,读取敏感配置文件。

1.2 漏洞危害等级

根据OWASP Top 10分类,路径遍历属于A5-2021安全配置错误类别,其危害程度取决于目标系统的文件权限:

  • 低危:读取应用配置文件(如.env
  • 中危:获取数据库凭证(如config/database.yml
  • 高危:执行系统命令(通过写入Webshell文件)
  • 致命:获取服务器SSH密钥等核心资产

二、攻击手法深度剖析

现代攻击者已发展出多种变种攻击技术,开发者需建立立体化防御思维。

2.1 基础目录遍历

通过连续../实现目录跳转,常见于文件下载、图片展示等功能:

  1. // 危险代码示例
  2. $file = $_GET['file'];
  3. $content = file_get_contents("/var/www/uploads/$file");

攻击者可构造?file=../../../../etc/shadow读取系统密码文件。

2.2 编码混淆绕过

利用URL编码、Unicode编码等手段绕过基础过滤:

  1. 原始攻击:../../etc/passwd
  2. 编码变种:%2e%2e%2f%2e%2e%2fetc%2fpasswd
  3. Unicode变种:%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd

2.3 绝对路径攻击

当应用允许绝对路径输入时,攻击者可直接指定系统文件:

  1. 正常输入:/var/www/files/user1.jpg
  2. 恶意输入:/etc/passwd

2.4 参数拼接攻击

在多参数场景下,通过空字节或换行符分割路径:

  1. 正常URL:/download?type=pdf&file=report
  2. 恶意URL:/download?type=pdf&file=../../etc/passwd%00

%00空字节可截断某些语言(如C)的字符串处理。

三、防御体系构建方案

防御路径遍历需采用白名单验证+路径规范化+最小权限的组合策略。

3.1 输入验证白名单

严格限制允许访问的文件类型和目录范围:

  1. # 安全代码示例(Python)
  2. ALLOWED_EXTENSIONS = {'pdf', 'jpg', 'png'}
  3. BASE_DIR = '/var/www/uploads'
  4. def safe_download(filename):
  5. if '.' not in filename:
  6. return False
  7. ext = filename.rsplit('.', 1)[1].lower()
  8. if ext not in ALLOWED_EXTENSIONS:
  9. return False
  10. # 使用os.path.realpath消除相对路径
  11. full_path = os.path.realpath(os.path.join(BASE_DIR, filename))
  12. if not full_path.startswith(BASE_DIR):
  13. return False
  14. # 最终验证
  15. return os.path.isfile(full_path)

3.2 路径规范化处理

使用语言内置的路径处理函数消除特殊字符:

  • Java:Paths.get(userInput).normalize()
  • Python:os.path.abspath() + os.path.realpath()
  • Node.js:path.resolve() + path.normalize()

3.3 文件操作沙箱

限制Web进程的文件系统访问权限:

  1. 使用专用用户运行Web服务(如www-data
  2. 通过chroot将进程限制在特定目录
  3. 配置SELinux/AppArmor强制访问控制

3.4 安全编码实践

  • 禁止直接拼接用户输入到文件路径
  • 使用文件ID代替直接路径访问(如数据库存储文件元信息)
  • 启用内容安全策略(CSP)防止内联脚本执行

四、行业防御最佳实践

主流云服务商和安全组织推荐以下强化措施:

4.1 WAF规则配置

部署Web应用防火墙,配置以下规则:

  • 检测连续../序列(正则:(\.\.\/|\.\\)+
  • 拦截包含/etc//boot/等系统路径的请求
  • 限制文件扩展名白名单

4.2 静态代码分析

集成SAST工具定期扫描:

  • 检测file_get_contents()fopen()等危险函数
  • 识别未经验证的用户输入拼接
  • 检查路径处理函数使用情况

4.3 运行时防护

采用RASP技术实现实时保护:

  1. // 示例:Java RASP钩子函数
  2. @Around("execution(* javax.servlet.http.HttpServlet.service(..))")
  3. public Object protectPathTraversal(ProceedingJoinPoint pjp) throws Throwable {
  4. HttpServletRequest req = getRequestFromArgs(pjp.getArgs());
  5. String path = req.getParameter("file");
  6. if (path != null && containsPathTraversal(path)) {
  7. throw new SecurityException("Detected path traversal attack");
  8. }
  9. return pjp.proceed();
  10. }

4.4 容器化隔离

在容器环境中实施:

  • 使用只读文件系统挂载应用目录
  • 通过--read-only参数启动容器
  • 限制容器内进程的CAP_DAC_OVERRIDE能力

五、应急响应流程

发现漏洞后应立即执行:

  1. 影响评估:确定受影响的功能模块和潜在数据泄露范围
  2. 临时修复:关闭相关功能入口,更新WAF规则
  3. 代码修复:按照防御方案重构文件操作逻辑
  4. 日志审计:分析攻击路径,查找其他潜在漏洞
  5. 渗透测试:使用专业工具验证修复效果

结语

路径遍历漏洞的防御需要开发、安全、运维团队的协同努力。通过实施白名单验证、路径规范化、最小权限原则等核心策略,结合WAF、RASP等安全技术,可构建纵深防御体系。建议定期进行安全培训,保持对新型攻击手法的研究,持续提升系统安全水位。