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