漏洞原理
当前大量开发人员使用 git 进行版本控制 , 对站点自动部署 . 但是如果配置不当 , 可能会将 .git 文件夹直接部署到线上环境 , 这就引起了git泄露漏洞 .
在运行 git init 初始化代码库的时候 , 会在当前目录下面产生一个 .git
隐藏文件 , 用来记录代码的变更记录等等 .
在发布代码的时候 , 如果 /.git/ 这个目录没有删除 , 就直接发布了 , 那么使用这个文件 , 可以用来恢复源代码
GitHack
GitHack 是一个 .git
泄露利用脚本 , 通过泄露的.git
文件夹下的文件 , 重建还原工程源代码
GitHack工作原理
- 解析
./git/index
文件 , 找到工程中所有的文件名和文件sha1 - 然后去
.git/objects
文件夹下载对应的文件 - 通过 zlib 解压文件 , 按照原始的目录结构写入到源代码
GitHack这个脚本本身用法很简单 , 不多说了
Git基本操作
- git init
使用git init
命令可以初始化一个空的Git仓库 - git add && git commit
git add
可以跟踪创建的文件 , 并把文件放入到暂存区 . 通过git commit
提交更新到仓库 , 把暂存区中的所有文件提交更新 - git status
git status
命令可以查看仓库状态 , 列出当前目录所有 还没有被git管理追踪的文件 和 被git管理且修改但还未提交更新的文件 . 仓库中文件一共存在三种状态
> Untracked files : 文件未被追踪
> Changes to be committed : 文件已暂存
> Changes not staged for commit : 已跟踪文件的内容发生变化 , 但是还没有被放到暂存区
Git四大对象
在Git中存在四类对象 , 所有的Git操作都是基于这四种类型的对象的
+ blob : 该对象用来存储文件的内容
+ tree : 是一个关系对象树 , 用于管理一些 tree
和 blob
对象
+ commit : 指向一个tree , 用来标记项目某一个特定时间点的状态 , 它包括很多时间点的元数据 , 包括 : 作者 , 提交者 , 注释 , 指向tree对象的hash , 代表commit的hash
+ tag : 给某个提交添加一个标记
Git中每个对象都是通过 Hash 来代表这个对象 , 这个 Hash 是SHA1计算出来的 , 长度为 40 个字符
下面这个图可以多理解一下
.git目录
通过 git init
初始化git仓库时 , 会生成一个 .git
的隐藏目录 , .git
会将所有的文件 , 目录 , 提交等转换为git对象 , 压缩存储在这个文件夹内
COMMIT_EDITMSG : 保存最新的 commit message , Git系统不会用到这个文件 , 该文件是给用户参考的
config : Git仓库的配置文件
description : Git仓库的描述信息 , 主要给
gitweb
等git托管系统使用HEAD : 这个文件包含了一个档期分支( branch )应用 , 通过这个文件Git可以得到下一次 commit 的 parent
hooks : 这个目录存放一些shell脚本 , 可以设置特定的git命令后触发相应脚本 , 在搭建gitweb系统或者其他git托管系统时会用到 git hooks
index : 这个文件就是暂存区 , 也就是通过
git add
追踪的文件 , 它是一个二进制文件info : 包含仓库的一些信息
logs : 保存所有更新的引用记录
objects : 所有的GIt对象都会存放在这个目录中 , 对象的 SHA1 hash 值的前 2 位是文件夹名称 . 后 38 位作为对象文件名
refs : 这个目录一般包含了三个子文件夹 ,
heads , remotes , tags
, heads中的文件标识了项目中各个分支指向的当前commitORIG_HEAD : HEAD指针的前一个状态