内容纲要

漏洞原理

当前大量开发人员使用 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 : 是一个关系对象树 , 用于管理一些 treeblob 对象
+ commit : 指向一个tree , 用来标记项目某一个特定时间点的状态 , 它包括很多时间点的元数据 , 包括 : 作者 , 提交者 , 注释 , 指向tree对象的hash , 代表commit的hash
+ tag : 给某个提交添加一个标记

Git中每个对象都是通过 Hash 来代表这个对象 , 这个 Hash 是SHA1计算出来的 , 长度为 40 个字符

下面这个图可以多理解一下

git


.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中的文件标识了项目中各个分支指向的当前commit

ORIG_HEAD : HEAD指针的前一个状态


Git泄露存在不少比较复杂的利用方式, 不过这些利用方式归根到底都是找hash然后找源码 , 这些以后遇到了再写吧
最后修改日期:2019年5月19日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。