git泄露是常见的ctf题型,来看几个例子
Hello World (i春秋 第二届春秋欢乐赛 web)
这里只说git利用的点

由上可知有git泄露
之后尝试使用常用工具GitHack
https://github.com/BugScanTeam/GitHack

这里应该是通过.git/refs/heads/master中存储的commit的object来提取了master分支

但是这并不够,因为本题的考点原意是.git/logs/HEAD文件的利用,而githack并没有对其中的hash提取,因此遗漏了部分的object,即下图中的部分hash

这里使用JGitHack是可以获取到这些遗漏的object的

之后需要手动提取object
这里使用git的底层命令,cat-file和ls-tree
看一下logs中的提交记录

可以发现有两个commit,并且hash值是不一样的,说明有文件出现改动
于是这里手动查看一下

可见他们的tree的hash也是不一样的,说明其中有文件改变,这里继续看两个tree

由此可见其中的flag.js是变动了,他们的hash值不一样,说明文件不一样,分别是
f2b45f1e5af6dc1a8607c11e4ddc5fd077276c45
04bb09bb63fe48e6cab3e1c72a7ef51dda9634b8
所以flag应该就是在这其中
之后可以使用git cat-file命令提取文件

之后再sublime中diff一下这两个文件

会发现有不同,很明显的区别就是flag了,这前三个差异的字符分别是f,l,a,再往后看便是flag了
到这里,这题做完了,但是过程有些繁琐,而且是可以自动完成的
原先我的想法是使用几个git命令自动完成这个,但发现效率有些低
于是我写了这个工具https://github.com/gakki429/Git_Extract
我们试试这个工具

看下获取到的文件,与之前的对比



之后直接diff其中的flag.js和f2b45f_flag.js就可以了

登录 (百度杯CTF比赛 十月场 web)
前面是注入
最后可以得到用户
username: bctf3dm1n
password: adminqwe123666
登录之后如下

可见.bctfg1t,应该是git泄露
这题的主要考点是.git/refs/stash

stash是一个用于保存git工作进度的文件
之后利用Git_Extract获取
这里获取了master分值,之后也解析了stash中的存的hash的object


由此可获得提示信息

之后打开这个71ec9d5ca5580c58d1872962c596ea71.php
就可以看到flag了

如果这里使用GitHack也是可以完成的


之后我们手动查看stash中的object就可以了

从这个commit中的tree继续获取

Backdoor (百度杯CTF比赛 十月场 web)
依旧是git的logs/HEAD,但是这里的commit有些多

使用Git_Extract会帮助你自动解析提取这些commit


查看这几个flag文件可以发下如下提示,之后继续做就好了

如果使用GitHack也可以完成,但是这些commit需要你手动提取,相当的难受
Git常见的利用
.git/index中会缓存git add的文件,这里在没有commit的情况下,也是存在的
https://github.com/lijiejie/GitHack lijiejie的这个就是获取的这个
.git/refs/heads/master 记录了master的commit的hash,由此可以解析出这个commit的所有文件
.git/logs/HEAD其中存储了git的log信息,可以找到历史的commit项
.git/refs/stash 工作进度的临时保存
最后说一个pack的问题,这个好像还没看见有ctf中考到,这里也做了恢复
.git/info/packs packs文件提取恢复
网友评论
提示,那些文件是不一定有的,应该不碍事,恢复的点有很多,你可以看一下readme的说明,要是两个版本的flag.js都已经复原,就说明git恢复的没问题,有问题再说