前言
今天查看站点访问日志,发现有外部 IP 持续批量请求 /.git/objects/xxx 路径,大量 404 日志刷屏。这是互联网上非常常见的自动化扫描行为,目标是探测 Git 源码泄露,一旦成功,攻击者可完整拉取网站源码、配置文件、数据库账号密码、密钥等敏感信息。下面结合日志实例,完整分析攻击行为、风险与加固方案。
攻击日志样本
95.217.169.43 - - [21/Oct/2026:01:38:09 +0800] "GET /.git/objects/8a/e39d7652fe09670610203b22aa480fb845991f HTTP/1.1" 404 23577 "-" "Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0" "-" 0.000 zt.luomor.com
日志拆解
- 请求路径:
/.git/objects/xxx,Git 仓库底层对象存储路径,Git 源码泄露扫描特征路径。 - 状态码 404:本次请求返回 404,代表 Web 根目录下不存在对应的 git 文件,本次扫描未成功获取源码,当前无源码泄露风险。
- 源 IP:
95.217.169.43,自动化扫描节点 IP。 - User-Agent:
Mozilla/5.0 (Windows NT 10.0; rv:78.0),伪造浏览器 UA,并非真实用户访问,是扫描器的伪装手段。
攻击原理
这类扫描工具常见为 Githacker、GitSheriff 等,攻击流程:
- 优先探测
/.git/HEAD、/.git/config。如果返回 200,判定网站存在 Git 仓库暴露; - 读取 commit 哈希,递归遍历所有
/.git/objects/sha1对象文件,批量下载 Git 对象; - 本地还原完整 Git 仓库,拿到全部源码、所有提交记录,检索
.env、数据库配置、API 密钥、后台账号等敏感凭证。
只要 Web 根目录意外上传了完整
.git文件夹,攻击者无需任何权限,就能直接扒取整套代码。
快速自检命令
在服务器或本地终端执行,验证站点是否存在 Git 泄露:
# 检测 .git 核心文件是否可访问
curl -I http://zt.luomor.com/.git/HEAD
curl -I http://zt.luomor.com/.git/config
- ✅ 安全:返回 404 / 403
- ❌ 高危:返回 200,说明.git 目录暴露,需要立刻处理
防护配置
推荐无论是否存在.git 目录,都在 Web 服务层拦截对.git、.svn 这类版本控制目录的访问,作为基础安全基线。
Nginx 配置(推荐,写入 server 块)
# 拦截所有对.git目录的访问
location ~ /\.git {
deny all;
return 403;
}
配置完成后重载 Nginx:nginx -t && nginx -s reload
Apache 配置(.htaccess)
<DirectoryMatch "/\.git">
Require all denied
</DirectoryMatch>
Caddy 配置
@git_leak path_regexp /.git
respond @git_leak 403
临时封禁扫描 IP
注意:封禁单个 IP 仅临时缓解,扫描器 IP 池会轮换,不能根治,仅应急使用。
Nginx 黑名单
deny 95.217.169.43;
Linux iptables
iptables -A INPUT -s 95.217.169.43 -j DROP
长期加固建议
- 部署规范:生产站点发布时,严禁将 .git 目录上传到 Web 根目录,打包部署时排除.git 文件夹。
- 接入 WAF:使用 ModSecurity、Cloudflare 等 WAF,添加规则拦截
/.git、/.svn、/.hg等版本控制目录扫描请求。 - 日志告警:配置日志监控,当出现访问
/.git的请求时触发告警,第一时间发现扫描行为。 - 安全自检:定期使用 githacker、trufflehog 工具自检源码泄露与硬编码密钥泄露问题。
- 限流防护:对单 IP 短时间大量请求做频率限制,减少爬虫 / 扫描器对服务器资源消耗。
总结
.git 目录扫描属于互联网常态化自动化探测,本次日志返回 404,站点暂时安全。但这类扫描是 “广撒网” 行为,一旦某次部署失误,把.git 目录带到线上,就会直接造成源码泄露。建议将拦截版本控制目录作为 Web 服务的基础安全配置,提前做好防护,不要等出事再补救。
正文完
可以使用微信扫码关注公众号(ID:xzluomor)