常见漏洞验证121 条

.git 目录暴露检查

部署时带出的版本库目录可被逐文件读取;核查 /.git/ 下关键路径可达性,评估源码泄露程度。

.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 拦截。同时从构建产物与自动化发布流程中排除版本库目录,避免下次发布再次带出。

易错点

  • 用自动化工具把整个仓库拉回本地“做证据”,构成实质性数据泄露事件
  • 只检查 HEAD 一个路径就下结论,漏掉 config、index 与日志这些更敏感的入口
  • 未识别软 404:站点对任意路径都返回 200,需要比对响应体特征或用已知不存在路径做对照
  • 只在生产入口检查,忽略备份域、测试域名与 CDN 回源地址上的同一站点
  • 修复只做 Web 层拦截,构建产物中仍带版本库目录,换一台服务器即复发

数据来源与参考

  • 通用部署安全实践
  • OWASP WSTG WSTG-CONF-04
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌