GitHack 工具使用与 .git 泄露利用详解

Jun 2, 2026 分钟阅读

前言

在 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 会依次尝试三种恢复方式:

  1. 直接 Clone:尝试用 git clone 直接克隆仓库
  2. 目录遍历:检测是否支持目录遍历,逐个文件下载
  3. 缓存恢复:从 .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

防御建议

  1. 禁止 Web 访问 .git 目录 Nginx 配置示例:

    1location ~ /\.git {
    2    deny all;
    3    return 403;
    4}
    
  2. 部署前清理 .git 目录 生产环境只部署编译后的产物,不携带 .git 文件夹。

  3. 敏感信息不提交到仓库 使用 .gitignore 忽略配置文件,密码通过环境变量注入。

  4. 定期审计提交历史 使用 git-filter-repo 或 BFG Repo-Cleaner 清理历史中的敏感数据。


总结

利用方式查看命令适用场景
Loggit log / git show找回历史提交中被删除的文件
Stashgit stash list / git stash show -p发现开发者临时藏起来的修改
IndexGitHack 自动恢复 / git ls-files恢复未提交但已 add 的代码

.git 泄露的危害远不止源代码泄露,完整的 commit 历史、stash、index 都可能成为突破口。恢复后务必全面检查这三个区域。