路径遍历漏洞与防护
字数 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 探测潜在入口

  1. 识别文件操作参数:观察URL中如filepathfilename等参数。
  2. 测试基础Payload
    • 使用../尝试跳转目录:file=../../../etc/passwd
    • 编码绕过:URL编码(..%2F)、双重编码(..%252F)、Unicode编码(..%c0%af)。

3.2 绕过常见防护

  1. 过滤../:尝试....//(过滤后变为../)或..././
  2. 绝对路径拼接:若基础路径为/var/www/,输入/etc/passwd可能直接访问系统根目录。
  3. 操作系统差异
    • Windows下使用..\....\,路径分隔符可为/\
    • 空字节截断(PHP 5.3.4前):file=../../../etc/passwd%00.jpg

4. 防护方案

4.1 输入校验与规范化

  1. 白名单校验:仅允许预期内的文件名或字符(如字母、数字、短横线)。
    import os
    allowed_files = ["report.pdf", "data.csv"]
    if file_input not in allowed_files:
        raise InvalidInputError("非法文件名")
    
  2. 路径规范化后校验
    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映射机制,彻底解耦用户输入与物理路径。

通过以上步骤,可系统掌握路径遍历漏洞的成因、利用手法及防护要点。

路径遍历漏洞与防护 1. 漏洞描述 路径遍历(Path Traversal)是一种通过构造特殊输入绕过系统对文件路径的合法校验,从而访问或操作本应受限的文件或目录的安全漏洞。攻击者利用此漏洞可读取敏感文件(如系统配置文件、日志、密码文件),甚至写入恶意文件。常见于文件下载、上传、预览等功能模块。 2. 漏洞原理与攻击场景 2.1 核心问题 应用程序未对用户输入的文件路径进行规范化或严格校验,直接将其拼接至基础路径中。例如: 系统解析路径时, ../ 会向上跳转目录,导致访问 /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 。 4. 防护方案 4.1 输入校验与规范化 白名单校验 :仅允许预期内的文件名或字符(如字母、数字、短横线)。 路径规范化后校验 : 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映射机制,彻底解耦用户输入与物理路径。 通过以上步骤,可系统掌握路径遍历漏洞的成因、利用手法及防护要点。