路径遍历漏洞与防护
字数 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. 漏洞挖掘方法

  1. 手工测试:在文件参数中尝试输入以下 payload:
    • ../../../etc/passwd
    • ....//....//etc/passwd(双重编码或特殊绕过)
    • 绝对路径(如/etc/passwd
  2. 工具辅助:使用 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参数下载其他用户私有文件。

总结

路径遍历漏洞的核心在于对用户输入过度信任。防护需结合输入验证、路径标准化、最小权限原则等多层措施,确保文件操作严格限制在预期范围内。

路径遍历漏洞与防护 1. 漏洞描述 路径遍历 (Path Traversal,也称目录遍历)是一种利用文件操作接口对非授权目录进行访问的安全漏洞。攻击者通过构造特殊路径(如 ../ )绕过系统限制,读取或写入任意文件(如系统配置文件、日志、源代码等)。常见于文件下载、上传、展示等功能模块。 2. 漏洞原理 关键问题:用户输入未正确过滤 例如,文件下载功能根据用户传入的文件名直接拼接路径: 但如果用户输入 file=../../../etc/passwd ,拼接后可能变为: 系统未对 ../ 进行过滤,导致越权访问。 3. 攻击场景示例 场景1:文件下载功能 假设代码逻辑如下: 攻击者请求: 服务器可能返回敏感文件内容。 场景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() 解析完整路径,并检查是否在允许目录内: 方案2:文件索引映射 不直接使用用户输入的文件名,而是通过数字ID映射到实际文件: 方案3:Web服务器配置 限制访问目录(如Nginx的 root 指令配置为最小权限路径)。 禁用敏感目录的HTTP访问(如 /etc/ )。 方案4:安全编码实践 避免直接拼接路径,使用语言内置的安全函数(如Python的 os.path.join )。 对压缩包解压行为进行路径检查,拒绝包含 ../ 的文件。 6. 漏洞案例 Apache Tomcat CVE-2020-1938 :通过特定请求读取Web应用外任意文件。 某网盘应用路径遍历 :通过修改URL参数下载其他用户私有文件。 总结 路径遍历漏洞的核心在于 对用户输入过度信任 。防护需结合输入验证、路径标准化、最小权限原则等多层措施,确保文件操作严格限制在预期范围内。