渗透测试 | 实战从.Git目录泄露导致信息泄露和任意文件读取
字数 2191 2025-08-20 18:18:11
.Git目录泄露漏洞分析与防护指南
1. Git目录泄露概述
1.1 Git基础概念
.git目录是Git版本控制系统存储项目元数据和对象的隐藏目录- 包含版本控制信息:提交历史、配置选项、分支信息等
- 执行
git init命令时自动创建
1.2 .git目录结构
.git/
├── HEAD # 指向当前分支的指针
├── config # 存储仓库配置信息
├── description # 仓库描述信息(主要用于裸仓库)
├── hooks/ # 客户端/服务器端钩子脚本
├── info/ # 额外配置信息(如排除文件列表)
├── objects/ # 所有数据对象(提交对象、树对象、Blob对象)
└── refs/ # 分支、标签等引用信息
2. Git目录泄露的危害
2.1 直接危害
- 源代码泄露:攻击者可下载完整项目代码
- 敏感信息泄露:可能暴露数据库凭据、API密钥等
- 开发历史分析:攻击者可分析提交日志、分支结构
2.2 间接危害
- 安全漏洞利用:攻击者可分析代码寻找漏洞(SQL注入、XSS等)
- 供应链攻击:通过获取的代码植入后门
- 知识产权侵犯:商业代码可能被窃取
3. Git目录泄露的利用方法
3.1 信息收集
-
访问/.git/config文件
- 获取仓库配置信息
- 可能包含远程仓库地址
- 示例内容:
[core] repositoryformatversion = 0 fileMode = false bare = false logallrefupdates = true [branch "master"] [remote "origin"] url = git@example.com:user/repo.git fetch = +refs/heads/*:refs/remotes/origin/*
-
使用自动化工具
- GitHack:自动下载泄露的源代码
- 工作原理:
- 解析index文件获取文件SHA1值和文件名
- 多线程下载文件
- 根据文件结构还原源代码
- 工作原理:
- GitHack:自动下载泄露的源代码
3.2 敏感信息挖掘
- 搜索历史版本:查找曾经提交后被删除的敏感信息
- 分析配置文件:如config.php、.env等可能包含数据库凭据
- 检查钩子脚本:hooks/目录可能包含敏感操作
4. 从Git泄露到任意文件读取
4.1 漏洞发现流程
- 通过全局搜索发现文件下载接口
- 分析代码发现未过滤的文件参数
- 示例漏洞代码:
<a href="https://example.com/pricelist.php?file=<?php echo $priceLists->name_part_1;?>">
- 示例漏洞代码:
- 尝试目录遍历攻击
4.2 文件读取技巧
- URL编码:使用
%2F代替/ - 多级目录遍历:
../../../../../../../etc/passwd - 系统关键文件:
/etc/passwd:用户账户信息/etc/shadow:密码哈希(需root权限)/etc/ssh/sshd_config:SSH服务器配置/root/.ssh/id_rsa:root用户私钥
4.3 可读取的关键文件列表
4.3.1 系统配置文件
| 文件路径 | 包含信息 |
|---|---|
| /etc/passwd | 系统用户账户信息 |
| /etc/shadow | 用户密码哈希(需root) |
| /etc/sudoers | sudo命令配置 |
| /etc/hosts | 主机名和IP映射 |
4.3.2 SSH相关文件
| 文件路径 | 包含信息 |
|---|---|
| /etc/ssh/sshd_config | SSH服务器配置 |
| /root/.ssh/id_rsa | root用户私钥 |
| /etc/ssh/known_hosts | 已知主机公钥列表 |
| /var/log/auth.log | 认证日志 |
4.3.3 数据库配置文件
| 文件路径 | 包含信息 |
|---|---|
| /etc/mysql/my.cnf | MySQL配置 |
| /var/lib/mysql/mysql/user.MYD | MySQL用户表(可能) |
| .env文件 | 项目环境变量 |
4.3.4 日志文件
| 文件路径 | 包含信息 |
|---|---|
| /var/log/auth.log | 认证日志 |
| /var/log/secure | 安全事件日志 |
| /var/log/apache2/access.log | Web访问日志 |
5. 防护措施
5.1 防止.git目录泄露
-
服务器配置
- Nginx: 添加规则阻止访问.git目录
location ~ /\.git { deny all; } - Apache: 在.htaccess中添加
RedirectMatch 404 /\.git
- Nginx: 添加规则阻止访问.git目录
-
部署实践
- 不要在Web根目录初始化Git仓库
- 使用
git clone --bare部署到生产环境 - 部署前删除.git目录
-
开发规范
- 将.git目录添加到.gitignore
- 使用环境变量存储敏感信息
- 定期扫描历史提交中的敏感信息
5.2 防止任意文件读取
-
输入验证
- 严格过滤文件路径参数
- 禁止目录遍历字符(
../) - 使用白名单限制可访问文件
-
权限控制
- Web服务器使用低权限用户运行
- 限制文件系统访问范围
- 设置适当的文件权限
-
安全编码
- 避免直接使用用户输入作为文件路径
- 使用框架提供的安全文件操作方法
- 定期进行代码审计
6. 应急响应
6.1 泄露发生后的处理
- 立即下线服务:防止进一步数据泄露
- 评估影响范围:确定泄露的数据类型和数量
- 重置凭据:更改所有可能泄露的密码、密钥
- 修复漏洞:实施防护措施防止再次发生
- 法律合规:根据法规要求通知相关方
6.2 取证分析
- 检查访问日志:确定攻击者IP和访问时间
- 分析被下载内容:评估泄露的严重程度
- 监控异常活动:关注可能的后续攻击
7. 总结
.git目录泄露是一个严重但可预防的安全问题。通过理解其危害、利用方式和防护措施,开发者和运维人员可以有效降低风险。关键点包括:
- 永远不要将.git目录暴露在Web可访问位置
- 实施严格的服务器配置阻止.git访问
- 避免在代码中硬编码敏感信息
- 对所有用户输入进行严格验证
- 建立定期安全审计机制
通过综合应用这些措施,可以显著提高Web应用的安全性,保护企业和用户的数据安全。