1. Git泄露漏洞的本质与危害当你访问某个网站时如果发现URL里意外出现了.git目录就像在别人家门口捡到了钥匙——这意味着开发者不小心把版本控制仓库的整个历史记录都暴露在了生产环境。这种情况在CTF比赛中经常被设计成Git泄露题型考察选手对版本控制工具的理解和利用能力。我参与过多次CTF赛事发现约60%的.git泄露漏洞都是由于部署脚本配置错误导致的。常见的情况包括使用cp -r命令直接复制项目目录到服务器Web服务器配置未禁止.git目录访问CI/CD流水线未过滤版本控制文件这些失误会让攻击者获得完整的代码变更历史、敏感配置信息甚至数据库凭证。去年某知名企业的数据泄露事件根源就是.git文件夹暴露了AWS密钥。在CTF比赛中组织者通常会把flag藏在某次历史提交中这就需要我们掌握git log分析技巧。2. 环境侦察与漏洞确认2.1 初步信息收集假设我们拿到这样一个题目http://challenge-b20bc02a1f02c35f.sandbox.ctfhub.com:10080/首先我会用curl做基础检查curl -I http://challenge-b20bc02a1f02c35f.sandbox.ctfhub.com:10080/.git/HEAD如果返回HTTP 200且内容显示ref: refs/heads/master基本确认存在.git泄露。这个HEAD文件就像仓库的身份证正常情况不应该被公开访问。2.2 自动化工具扫描手动检查效率低我习惯先用dirsearch进行目录爆破python3 dirsearch.py -u http://challenge-b20bc02a1f02c35f.sandbox.ctfhub.com:10080/ -e *当看到.git/目录出现在结果中时就可以上GitHack这类专业工具了python GitHack.py -u http://challenge-b20bc02a1f02c35f.sandbox.ctfhub.com:10080/.git/这个工具的工作原理很有意思它会先下载.git/index文件然后根据索引递归下载所有对象文件最后重建完整的项目历史。我建议在本地虚拟机里保存几个这样的工具包比赛时能节省大量时间。3. 历史记录深度分析3.1 查看提交日志成功下载.git目录后第一件事就是查看提交历史git log --oneline典型输出类似这样c9d03e2 (HEAD - master) remove flag 8240595 add flag a1b2c3d initial commit这里有个实用技巧加上-p参数可以直接显示每次提交的差异内容git log -p -1 # 查看最近一次提交的diff3.2 识别关键提交在CTF题目中flag通常出现在两种提交中添加敏感文件的提交如add flag删除敏感内容的提交如remove flag我常用的过滤命令是git log --grepflag --name-status这会显示所有包含flag关键词的提交及其涉及的文件。4. 第一种解法差异比对技术4.1 git diff的核心原理git diff就像代码的时光机能显示两个版本之间的变化。在CTF中我们特别关注git diff commit1 commit2这个命令会输出两个提交之间的所有差异包括新增的文件内容以号标记删除的内容以-号标记修改的行显示前后对比4.2 实战操作步骤假设我们从log中发现两个关键提交8240595 add flag c9d03e2 remove flag执行差异比对git diff 8240595 c9d03e2输出会显示被删除的flag内容通常格式如下- flag: ctfhub{7695df0273bfd39a86c8ecd4}这里有个易错点有些题目会把flag藏在二进制文件里这时需要加上--text参数git diff --text 8240595 c9d03e2 secret.bin5. 第二种解法版本回退技术5.1 git reset的三种模式相比diff的看差异reset是直接穿越时空。它有三种模式--soft仅移动HEAD指针--mixed默认移动HEAD并重置暂存区--hard彻底回退工作目录CTF中我们常用--hard模式git reset --hard 8240595这条命令会让整个仓库回到add flag提交时的状态。5.2 实战注意事项操作前建议先创建分支备份git branch backup回退后查看文件变化git status使用图形化工具辅助查看gitk --all我曾遇到过题目在回退后flag文件权限被修改的情况这时需要chmod 644 flag.txt6. 两种方法的对比与选择6.1 适用场景分析方法优点缺点最佳使用场景git diff非破坏性操作对二进制文件不友好快速查看文本变更git reset可恢复完整文件会丢失后续修改需要完整文件内容时6.2 组合使用技巧高阶玩法是两种方法结合使用先用git log定位关键提交用git diff确认flag位置必要时用git reset恢复特定版本最后用git reflog查看所有操作记录7. 防御措施与比赛技巧虽然我们是作为攻击方利用.git泄露但了解防御措施也很重要在nginx配置中添加location ~ /\.git { deny all; }部署前运行rm -rf .git比赛时的经验之谈遇到500错误可能是GitHack下载不全尝试手动下载缺失文件flag可能被编码记得检查base64、hex等常见编码时间紧迫时优先尝试git log -p直接查看差异