路径遍历攻击 - 文件上传漏洞

文件上传中的路径遍历:开发者如何创建自己的漏洞利用程序

当文件上传变成文件访问

单个不安全的上传处理程序就可能打开通往完整路径遍历攻击和文件上传漏洞的大门。当开发人员直接将文件名与上传路径连接起来时, 攻击者可以提交恶意文件名 喜欢 ../../etc/passwd 跳转到其他目录并访问敏感文件。 这种路径遍历方式可以将简单的上传 API 变成强大的文件访问漏洞,尤其是在应用程序以提升的权限运行时。

⚠️此示例不安全,仅供学习交流之用。请勿用于生产环境。

// Vulnerable upload handler, file upload vulnerability
[HttpPost("/upload")]
public async Task<IActionResult> Upload(IFormFile file)
{
    var path = Path.Combine("uploads/", file.FileName);  // No validation
    using var stream = new FileStream(path, FileMode.Create);
    await file.CopyToAsync(stream);
    return Ok("File uploaded!");
}

攻击者可以上传一个名为“ ../../web.config 覆盖或读取受限文件,一种经典的路径遍历攻击。

安全版本:

// Safe upload with validation and canonicalization
[HttpPost("/upload")]
public async Task<IActionResult> Upload(IFormFile file)
{
    var fileName = Path.GetFileName(file.FileName); // strip directories
    var targetDir = Path.GetFullPath("uploads/");
    var safePath = Path.Combine(targetDir, fileName);


    if (!safePath.StartsWith(targetDir))
        return BadRequest("Invalid file path");


    using var stream = new FileStream(safePath, FileMode.Create);
    await file.CopyToAsync(stream);
    return Ok("File securely uploaded!");
}

教育说明: 始终使用规范化方法对路径进行规范化。 Path.GetFullPath() 并检查结果是否保留在您的上传目录中。永远不要相信任何第三方。 文件.文件名 直。

导致路径遍历失败的开发者错误

大多数导致路径遍历的文件上传漏洞都源于仓促编写的代码和缺失的验证。常见的开发者错误包括:

  • 将用户输入直接连接到文件系统路径
  • 信任 内容类型 或仅进行扩展验证
  • 保存前跳过路径规范化

跨请求或微服务重用临时文件夹

⚠️此示例不安全,仅供学习交流之用。请勿用于生产环境。

# Flask example vulnerable to path traversal attack
@app.route('/upload', methods=['POST'])
def upload():
    file = request.files['file']
    file.save('uploads/' + file.filename)
    return 'Uploaded'

攻击者可以绕过这种简单的连接来遍历目录(../../app.py)并写入或覆盖任意文件。 安全版本:

# Safe file upload validation
from werkzeug.utils import secure_filename
@app.route('/upload', methods=['POST'])
def upload():
    file = request.files['file']
    name = secure_filename(file.filename)
    path = os.path.join('uploads', name)
    file.save(path)
    return 'Securely uploaded'

教育说明: 使用框架提供的辅助函数,例如 安全文件名 并强制使用已列入允许列表的文件扩展名。切勿手动将输入内容拼接成文件路径。

现实中的剥削 Pipeline和微服务

路径遍历攻击并非只发生在公共端点,它们也经常出现在内部。 CI/CD 管理上传文件的系统、工件存储库或微服务。 例如,构建工件管理器中的文件上传漏洞可能允许攻击者覆盖构建脚本或 向共享运行器注入恶意文件。

⚠️此示例不安全,仅供学习交流之用。请勿用于生产环境。

# Never expose real tokens, credentials, or internal URLs in pipelines
- name: Store build artifact
  run: cp $UPLOAD_PATH/$FILENAME /var/artifacts/$FILENAME

If $文件名 未经验证,精心制作 ../../../etc/passwd 值可以在部署期间覆盖关键系统文件,这是一种现实世界的路径遍历攻击。 安全版本: 

# Safer artifact storage guardrail
- name: Store build artifact securely
  run: |
    SAFE_NAME=$(basename "$FILENAME")
    cp "$UPLOAD_PATH/$SAFE_NAME" /var/artifacts/"$SAFE_NAME"

教育说明: In pipeline对所有动态路径变量进行清理。限制写入操作到受控目录,以防止在构建或部署期间文件系统逃逸。

防止上传逻辑中的路径遍历

缓解路径遍历攻击的关键在于严格的输入验证和隔离。从一开始就应将文件名和路径视为不可信输入,尤其是在处理上传文件时。

最佳实践

  1. 规范化和规范化 使用前请先查看所有路径。
  2. 限制上传 复制到网站根目录之外的专用目录。
  3. 强制执行允许列表 文件扩展名和 MIME 类型。
  4. 切勿重复使用临时文件夹。 会话之间或用户之间。
  5. 使用容器化存储 尽可能对上传的文件进行处理。

迷你预防检查清单

  • 使用以下命令验证每个文件名 Path.GetFileName() 或等价物。
  • 解析完整路径并验证目录边界。
  • 应用扩展名和 MIME 类型允许列表。
  • 每个用户或会话使用单独的上传文件夹。
  • 将上传扫描和验证纳入其中 CI/CD 试验。

教育说明: 每个文件上传处理程序都可能成为路径遍历攻击的入口。通过验证、隔离和扫描所有文件处理代码,构建纵深防御体系。

Xygeni 如何检测和阻止不安全的上传流程

西吉尼 Code Security 扫描 代码库和 pipelines 用于在路径遍历模式到达生产环境之前对其进行检测。 它会在代码和配置文件中标记不安全的路径连接、缺少规范化以及危险的文件操作。 CI/CD 脚本。

功能代码片段,带有控制护栏:

# Secure enforcement with Xygeni
- name: Enforce secure upload and path handling
  run: dotnet xygeni enforce --rules uploads,path,security --fail-on-risk

教育说明: 整合 西吉尼 进入你的 pipeline 确保在构建验证期间自动捕获文件上传漏洞和路径遍历攻击。

缩小差距:防止你的下一次路径遍历攻击

文件上传端点中的单个路径遍历漏洞可能使攻击者能够访问服务器的文件系统。 检查上传处理程序是否存在不安全的拼接操作,规范所有路径,并且永远不要信任用户控制的文件名。 添加 漏洞扫描工具 喜欢 Xygeni Code Security 您的 开发安全 pipeline 在产品发布前检测路径遍历攻击和文件上传漏洞。 在安全领域,每个保存的文件都必须被视为已执行的代码!

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
7-day免费试用
无需信用卡

保护您的软件开发和交付

使用 Xygeni 产品套件