一、Git泄露的原理
Git是一个可以实现有效控制应用版本的系统,在配置不当的情况下,可能会将“.git”文件直接部署到线上环境,就很可能将源代码泄露出去。那么,一旦攻击者或者黑客发现这个问题之后,就可能利用其获取网站的源码、数据库等重要资源信息,进而造成严重的危害。
所以攻击者只要发现有git泄露,我们就可以通过相关工具来得到它所泄露的代码,其中就会有一些关键信息。
我们先来了解一下,git相关的一部分知识点。
1.git结构
.git目录:使用git init初始化git仓库的时候,生成的隐藏目录,git会将所有的文件,目录,提交等转化为git对象,压缩存储在这个文件夹当中。
COMMIT_EDITMSG:保存最新的commit message,Git系统不会用到这个文件,用户一个参考文件
config:Git仓库的配置文件
description:仓库的描述信息,主要给gitweb等git托管系统使用
HEAD:这个文件包含了一个档期分支(branch)的引用,通过这个文件Git可以得到下一次commit的parent
hooks:这个目录存放一些shell脚本,可以设置特定的git命令后触发相应的脚本;在搭建gitweb系统或其他
git托管系统会经常用到hook script(钩子脚本)
index:这个文件就是我们前面提到的暂存区(stage),是一个二进制文件
info:包含仓库的一些信息
logs:保存所有更新的引用记录
objects:所有的Git对象都会存放在这个目录中,对象的SHA1哈希值的前两位是文件夹名称,后38位作为对象文件名
refs:这个目录一般包括三个子文件夹,heads、remotes和tags,heads中的文件标识了项目中的各个分支指向的当前commit
ORIG_HEAD:HEAD指针的前一个状态
2.git常用命令
git init 初始化一个git仓库
git add && git commit //git 添加文件和提交文件
git status 查看当前仓库状态和内存状态
git ls-files -u 显示冲突的文件,-s是显示标记为冲突已解决的文件
git diff 对比工作区和stage文件的差异
git diff -cached 对比stage和branch之间的差异
git ls-files -stage 检查保存在stage的文件
git log 显示到HEAD所指向的commit为止的所有commit记录
git reset -hard HEAD放弃工作区和index的改动,HEAD指针仍然指向当前的commit
3.git中文件的状态
git仓库中的文件存在三种状态:
①Untracked files:文件未被跟踪
②Changes to be commited:文件已暂存,指向下一次提交的内容
③Changes not staged for commit:已跟踪文件的内容发生了变化,但是还没有放到暂存区
4.Git的四种对象
commit:指向一个tree,它用来标记项目某个特定时间点的状态
一般包含以下信息:
①代表commit的哈希值
②指向tree对象的哈希值
③作者
④提交者
⑤注释
tree:可以简单的理解成这是一个对象关系树,用来管理一些tree和blob
一般包含以下信息:
①代表blob的哈希值
②指向tree对象的哈希值
blob:这种对象用来保存文件内容
tag:给某个提交增添的标记
5、哈希值
可以理解为,每一个对象都对应一个哈希值,而我们知道哈希值以后我们就可以通过哈希值来获取对应对象的信息,从而得到flag。
这些对象存储文件都是通过zlib进行压缩的,所以我们可以使用zlib将其解压出来,来看看这个文件里面存储的内容是什么。网站加哈希值就能够解压出来几个对象之间的层次关系,谁更大谁包含谁。
解码代码:
import zlib
import requests
urla = "解压文件地址"
re = requests.get(urla)
ss = re.content
word = zlib.decompress(ss)
print(word)
二:如何判断是否有git泄露
①可以先观察一下站点是否有醒目地指出Git,如果有的话,那就说明站点很大可能是存在这个问题的
②如果站点没有醒目的提示的话,可以利用dirsearch这类扫描工具,如果存在./git泄露的问题的话,会被扫描出来的.
③最直观的方式,就是直接通过网页访问.git目录,如果能访问就说明存在
当确认存在这个漏洞之后,就可以通过工具来下载git泄露的全部源码
三:GitHack以及解题
用来解题的工具,具体怎么下载我就不说了,大家可以去搜搜
Githack简单来说就是使用了以后能够下载出来有git泄露的文件。有这样的文件以后我们再通过命令来实现对其内容的查找,找到我们要的flag。
当大家看到运行出这个界面的时候就证明githack是正常运行的,可以正常使用,
它运行完了以后会发现dist文件里面多出来了以网站为名的新文件
点开看了以后里面什么都没有,注意这里一定要进去到了文件里面以后再打开终端,执行git log,git log 显示到HEAD所指向的commit为止的所有commit记录,简单说来就是可以查看之前版本的记录(删除了的看不见),git reflog和git log功能一样(删除了的也能查看)。
可以看到我们git log以后我们能看到三个版本的哈希值,一个是现在所在的版本(remove flag),一个是前版本(add flag),一个是初始化的版本(init),而我们现在的版本大家也看到的是空白的一个文件。
现在由两个方法可以获得flag,一个是回退到之前的版本,获取之前的信息
回退过后,我们重新打开我们以网站为名的文件,发现里面有新出现的文件,一一打开,里面就有我们所要的flag。
第二个方法就是对比,用现在的版本和之前的版本进行对比。
可以看出来一对比就直接出现了我们所要的flag。
另外是stash的问题,stash 就是隐藏的意思,也就是我们前面的方法无法把它弄出来,我们可以执行git stash pop(从git栈中获取到最近一次stash进去的内容,恢复工作区的内容。获取之后,会删除栈中对应的stash)
把之前隐藏的东西恢复了之后,回到之前的文件也能发现flag。