.git 暴露意味着什么
部署时把版本库目录一起发布到 Web 根目录,攻击者可以逐个读取 .git/HEAD、.git/config、.git/index,再顺着对象文件还原源码,甚至从历史提交里找到已删除的凭据。核查目标只是确认这些路径是否可达,不需要把内容拉回本地——把整个仓库下载下来本身就会构成泄密。
基本信息
| 适用平台 | 使用 Git 部署的 Web 站点(Nginx/Apache/Tomcat/IIS 均可能) |
|---|---|
| 核查路径 | /.git/HEAD、/.git/config、/.git/index、/.git/logs/HEAD |
| 判定标准 | 返回 200 或可下载内容即视为暴露 |
| 修复位置 | Web 服务器层拦截 + 构建产物排除版本库 |
典型使用场景
- 上线前检查构建产物是否混入版本库目录
- 渗透测试信息收集阶段快速判断源码泄露风险
- 排查“网站根目录直接 git clone”这类不规范部署
- 核查备份文件、临时目录是否同样暴露历史源码
- 为持续交付流水线补充产物检查环节
可达性检查示例
可达性检查示例
curl -s -o /dev/null -w '%{http_code}\n' https://target.example/.git/HEAD # 可达即记录,内容不下载
curl -s -o /dev/null -w '%{http_code}\n' https://target.example/.git/config
curl -s -o /dev/null -w '%{http_code}\n' https://target.example/.git/logs/HEAD
# 命中后只记录状态码与响应长度;不要使用批量抓取工具把对象文件拉回本地路径与含义
| 路径 | 含义 | 命中后果 |
|---|---|---|
| /.git/HEAD | 当前分支指针 | 确认仓库结构可读 |
| /.git/config | 远程地址与分支配置 | 可能暴露内部代码托管地址 |
| /.git/index | 暂存区文件清单 | 可直接列出全部源码文件名 |
| /.git/logs/HEAD | 引用变更日志 | 暴露提交者信息与时间线 |
| /.git/objects/ | 对象存储目录 | 可据此还原源码与历史版本 |
使用 git-dumper 一类工具把整个仓库下载到本地属于超范围的数据获取行为,除客户明确书面同意外不要执行;核查结论有状态码与响应长度即可支撑。
修复示例(Nginx):location ~ /\.git { deny all; return 404; };Apache 可在 .htaccess 用 RedirectMatch 拦截。同时从构建产物与自动化发布流程中排除版本库目录,避免下次发布再次带出。