备份与敏感文件泄露是什么
把数据库导出、站点打包或配置文件放在 Web 根目录下,是最常见的敏感信息泄露来源之一:备份文件名往往是约定俗成的,如数据库名加日期后缀,攻击者按常见命名逐个尝试即可命中。这类文件一旦可下载,等同于直接交出了全量数据或数据库凭据;此外 .env、版本库目录、编辑器临时文件与源码映射文件也常因部署残留而暴露,泄露内容从密钥到源码逻辑都可能包含。治理要同时做三件事:目录治理、访问层拒绝规则与部署流程检查。
基本信息
| 常见文件类型 | sql 与压缩包备份、.env 配置、版本库目录、编辑器临时文件 |
|---|---|
| 常见来源 | 运维手工备份、部署脚本打包残留、本地开发文件误上传 |
| 直接危害 | 全量数据下载、数据库凭据泄露、源码与内部结构暴露 |
| 目录治理 | 备份与配置移出 Web 根目录,存放在带鉴权的下载通道后 |
| 访问层兜底 | 按后缀与目录规则拒绝访问,作为第二道防线 |
| 流程检查 | 部署与上线检查表增加残留文件扫描项 |
典型场景
- 运维为方便恢复,把数据库导出放在站点根目录下
- 部署时把整个项目目录打包上传,包含版本库与本地配置
- 前端构建产物缺少源码映射清理,暴露源码结构
- 编辑站点时产生的临时文件与备份副本未删除
- 多站点共用目录,备份文件落在某个可访问路径下
- 对象存储桶被设为公开读,备份文件可被直接下载
站内自查
站内自查
find /www/wwwroot -type f \( -name '*.sql' -o -name '*.bak' -o -name '*.zip' -o -name '*.tar.gz' -o -name '.env' \) 2>/dev/null
find /www/wwwroot -type d -name '.git' 2>/dev/null
# 同时核对 Web 日志中是否存在对这些路径的请求
# 日志里出现备份文件请求说明可能已被他人尝试获取,需要重点核实访问层兜底(nginx)
访问层兜底(nginx)
location ~* \.(sql|bak|zip|tar|gz|log|env|old|swp)$ {
deny all;
}
location ~ /\.git {
deny all;
}
# 规则要覆盖常见变体:.sql.gz、.tar.gz、.zip、.7z 与备份类后缀
# 访问层拒绝只是兜底,不能替代把文件移出可访问目录排查项与处理动作
| 排查项 | 风险 | 处理动作 |
|---|---|---|
| 备份文件 | 全量数据可下载 | 移出站点目录,改用鉴权下载 |
| 配置文件 | 数据库与接口凭据泄露 | 移出目录并轮换已暴露口令 |
| 版本库目录 | 源码与提交历史泄露 | 删除并调整部署方式 |
| 临时与编辑器文件 | 源码片段泄露 | 清理并加入部署检查项 |
| 源码映射文件 | 前端源码可还原 | 按需保留或限制访问 |
备份文件应存放在 Web 根目录之外,用带鉴权的下载通道获取;访问层拒绝规则只是兜底,不能替代目录治理。
确认文件已暴露后,处置不止是删除文件:泄露过的数据库口令与密钥都应视为已泄露并轮换,同时核查日志判断是否被下载。