git泄露漏洞

git泄露漏洞

当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。

危害

攻击者可以利用该漏洞下载git文件夹里的所有内容。如果文件夹内有敏感信息比如站点源码、数据库账户密码等,攻击者可能直接控制服务器。

Git介绍

Git作为大家熟悉的,深受欢迎的版本控制工具,和其他同类工具有很多不同之处:

  • Git始终保存快照而不是文件差异。
  • 任何数据存储前始终使用SHA-1计算校验和,保证内容完整性。
  • 使用分布式仓库设计,让大多数操作都在本地进行,保证了使用效率。几乎所有操作都是向数据库增加数据,提交之后就很难丢失数据。它的本质更像一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面。

Git 有三种状态,你的文件可能处于其中之一:已修改(modified)、已暂存(staged)、已提交(committed)。由此引出三个逻辑区域,他们和文件状态以及部分对应操作的关系如下图。
在这里插入图片描述

Git对象
在Git系统中有四中类型的对象,所有的Git操作都是基于这四种类型的对象。

  • “blob”,这种对象用来保存文件的内容。
  • “tree”,可以理解成一个对象关系树,它管理一些"tree"和“blob”对象。
  • “commit”,指向一个"tree",它用来标记项目某一个特定时间点的状态。它包括以下关于时间点的元数据,如时间戳、最近一次提交的作者、指向上次提交、
  • “tag”,给某个提交增添一个标记。
    git对象之间的个关系如下图

SHA1哈希值
在Git系统中,每个Git对象都通过哈希值来代表这个对象。哈希值是通过SHA1算法计算出来的,长度为40个字符(40-digit)。

.git目录

  • config - 包含一些配置选项
  • description - 仓库的描述信息,主要给gitweb等git托管系统使用
  • HEAD - 指定当前分支,映射到ref引用,能够找到下一次commit的前一次哈希值
  • hooks - 存放可在某些指令前后触发运行的钩子脚本(hook scripts),默认包含一些脚本样例
  • index - 这个文件就是我们前面提到的暂存区(stage),是一个二进制文件
  • info - 存放仓库的信息
  • objects - 存储所有Git的数据对象,对象的SHA1哈希值的前两位是文件夹名称,后38位作为对象文件名
  • refs - 存储各个分支指向的目标提交
  • branches - 还没发现有什么用处

Git基本操作

对照这张图来理解两段提交,工作区(working tree),暂存区(stage/index)和 branch之间的关系
在这里插入图片描述

常用命令:

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 HEAD <file>
git reset --hard HEAD放弃工作区和index的改动,HEAD指针仍然指向当前的commit.

实际操作流程

git init
此命令初始化一个新本地仓库,它在工作目录下数据目录生成一个名为.git的隐藏文件夹。git会将所有的文件,目录,提交等转化为git对象,压缩存储在这个文件夹当中。
git init 命令后面不加参数表示把当前目录变为仓库,如下表示在当前目录下创建test仓库
在这里插入图片描述
git add
创建一个test1.txt文件,git status查看当前状态,此时test.txt文件位于工作目录
在这里插入图片描述
通过
git add
跟踪这个文件,把test.txt文件放到暂存区.(可以使用git rm --cached命令来取消暂存)
在这里插入图片描述
git commit
在暂存区的文件使用git commit提交到版本库(数据目录)中
-m参数表示提交的注释,如果不使用-m参数那么会跳出页面提示主动输入注释
在这里插入图片描述
修改test.txt文件
在这里插入图片描述

修改后,通过查看git status可以看到文件状态被改变了。根据提示知道文件已被修改,但是未提交修改到版本库中。
在这里插入图片描述

git diff,对比工作区和暂存区文件的差异,查看文件被修改的地方
在这里插入图片描述

确认修改无误后提交到版本库的方法和提交初始文件一样,需要先提交到暂存区,然后提交到版本库.
在这里插入图片描述
再修改一次文件
在这里插入图片描述

提交
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0MtGIDS6-1595853273844)(_v_images/20200727191944395_1255481628.png)]
git log 查看下历史记录,HEAD我的理解就是指针,指到最后提交的版本
在这里插入图片描述
git reset --hard,回退版本
回退到上一个版本,gei reset --hard HEAD^
在这里插入图片描述

厉害了,可以看到HEAD指针也指到了第一次修改的版本,第二次修改的版本看不到了
但是我要是因为操作失误怎么追回地二次修改的版本呢,可以使用git reset --hard 版本号追回
git reflog获取版本号,得到第二次修改版本号为5edcc89
在这里插入图片描述

get reset --hard 5edcc89恢复
在这里插入图片描述

我后面测试使用comit后面一串很长的字符,这里理解为对象sha1字符串吧.也可以回退到那个版本
在这里插入图片描述

可以把工作区修改的文件git add提交到暂存区,也可以使用git checkout — test1.txt 把工作区的修改撤销,这样,文件就会回退到上一次提交时的状态。
在这里插入图片描述

Git信息泄露原理

  • 通过泄露的.git文件夹下的文件,还原重建工程源代码
  • 解析.git/index文件,找到工程中所有的(文件名,文件sha1)
  • .git/objects文件夹下下载对应的文件
  • zlib解压文件,按原始的目录结构写入源代码
    (危害:渗透测试人员、攻击者,可以进一步代码审计,挖掘:文件上传,sql注入等安全漏洞)

GitHack工具使用

GitHack会按照上面的原理自动恢复
在这里插入图片描述

参考:https://www.zhihu.com/tardis/sogou/art/30044692