一、漏洞原理
敏感文件泄露是指 Web 应用由于配置不当、权限错误或运维疏忽,将本应保密的文件暴露在公网,攻击者可以直接访问或下载这些文件,从而获取敏感信息。
核心成因:
- 目录索引功能开启(Directory Listing),攻击者可浏览文件列表
- 备份文件、临时文件未删除
- 版本控制目录(.git、.svn)暴露
- 配置文件未被保护
- Web 服务器解析规则不当,导致源码直接输出而非执行
- 运维管理后台(phpinfo、phpMyAdmin 等)对外暴露
- 日志文件放置在 Web 目录下
与文件读取/文件包含的区别:
- 文件读取:需要利用路径穿越或伪协议主动读取文件
- 文件包含:将文件作为代码执行
- 敏感文件泄露:文件因配置问题直接被暴露,无需绕过,直接访问即可下载
CTF 中的常见目标:
- 源码泄露 → 代码审计发现漏洞
- 配置文件泄露 → 获取数据库密码、密钥
- .git 泄露 → 还原完整源码和历史提交
- 备份文件 → 获取源码或数据库
- 日志文件 → 发现敏感操作或注入点
二、常见的敏感文件泄露类型
2.1 目录浏览(Directory Listing)
Web 服务器(Apache、Nginx、IIS)在未配置默认首页且开启了目录索引时,访问目录会直接显示文件列表。
常见情况:
- 上传目录:
/uploads/、/images/、/files/ - 备份目录:
/backup/、/bak/、/old/ - 管理目录:
/admin/、/manage/ - 日志目录:
/logs/ - 临时目录:
/tmp/、/temp/
利用方式:直接浏览目录,发现敏感文件并下载。
2.2 源码文件泄露
由于配置不当或解析漏洞,.php、.jsp、.asp 等脚本文件没有被解析执行,而是以源码形式直接输出。
常见原因:
- Apache 未加载 PHP 模块,直接返回 PHP 源码
- Nginx 配置错误,某些路径下脚本不解析
- 文件扩展名被修改(如
index.php.bak) - 测试文件残留
CTF 中常见的源码泄露场景:
/index.php.bak/index.php~(vim 临时文件)/index.php.swp(vim 交换文件)/index.php.old/.index.php.swp(隐藏交换文件)
2.3 备份文件泄露
开发人员或运维人员创建备份时,常使用特定后缀,如果这些文件留在 Web 目录下,会被直接下载。
常见备份文件后缀:
| 后缀 | 来源 |
|---|---|
.bak |
通用备份文件 |
.back |
通用备份 |
.old |
旧版本文件 |
.orig |
原始文件 |
.save |
保存的副本 |
.txt |
将代码另存为文本 |
~ |
vim 自动备份 |
.swp |
vim 交换文件(正在编辑时) |
.swo |
vim 交换文件 |
.zip / .tar.gz |
压缩备份整个站点 |
.sql / .dump |
数据库备份 |
.7z / .rar |
压缩备份 |
生成规则:文件名后直接加后缀,或替换扩展名:
index.php.bak
index.php~
index.php.old
index.bak
web.zip
wwwroot.tar.gz
2.4 版本控制文件泄露(.git / .svn / .DS_Store)
(1).git 泄露
开发者将整个 .git 目录部署到生产环境,攻击者可以下载完整的 Git 仓库,还原所有历史版本的源码。
常见访问路径:
/.git/HEAD
/.git/config
/.git/index
/.git/logs/HEAD
/.git/refs/heads/master
/.git/objects/...
利用工具:
-
GitHacker:下载并还原 Git 仓库
bashpython GitHacker.py --url http://target.com/.git/ --output-folder result -
GitHack:
bashpython GitHack.py http://target.com/.git/ -
git-dumper:
bash./git-dumper.py http://target.com/.git/ ./output
还原后可以:
- 查看完整源码
- 查看提交历史,发现曾经存在的漏洞或敏感信息
- 对比历史版本,发现已删除的敏感配置
(2).svn 泄露
SVN 版本控制系统的 .svn 目录泄露,可以还原源代码。
常见访问路径:
/.svn/entries
/.svn/text-base/
/.svn/wc.db
利用工具:
- svnExploit 、Seay SVN 漏洞利用工具
- dvcs-ripper :
rip-svn.pl -u http://target.com/.svn/
(3).DS_Store 泄露
Mac 系统在目录下自动生成的隐藏文件,包含目录结构信息。
常见路径:
/.DS_Store
/uploads/.DS_Store
/images/.DS_Store
利用工具 :ds_store_exp
bash
python ds_store_exp.py http://target.com/.DS_Store
2.5 配置文件泄露
Web 应用或框架的配置文件包含数据库密码、密钥、API Token 等敏感信息,如果不限制访问,会造成严重危害。
常见泄露文件:
| 文件 | 说明 |
|---|---|
.env |
Laravel、Symfony 等框架环境配置,含数据库密码 |
config.php / config.inc.php |
PHP 配置文件 |
web.config |
ASP.NET 配置文件 |
application.properties |
Spring Boot 配置 |
settings.py |
Django 配置文件 |
wp-config.php |
WordPress 配置 |
database.yml |
Ruby on Rails 数据库配置 |
redis.conf |
Redis 配置 |
my.cnf |
MySQL 配置 |
.htaccess |
Apache 目录配置(可能泄露规则) |
.bash_history |
Shell 历史命令 |
.mysql_history |
MySQL 客户端历史 |
id_rsa / id_rsa.pub |
SSH 私钥/公钥 |
known_hosts |
SSH 已知主机列表 |
2.6 日志文件泄露
Web 服务器、应用或系统的日志文件如果放在 Web 目录下,可能被直接访问。
常见日志文件:
/access.log
/error.log
/logs/access.log
/logs/error.log
/log/app.log
/runtime/logs/
/storage/logs/laravel.log
2.7 运维管理后台泄露
常见敏感页面:
phpinfo.php--- PHP 环境信息(路径、配置、版本等)phpmyadmin/--- 数据库管理工具adminer.php--- 单文件数据库管理actuator--- Spring Boot 监控端点/_debugbar/--- Laravel Debugbar/swagger-ui.html--- API 文档/druid/--- 阿里 Druid 监控/server-status--- Apache 服务器状态/nginx_status--- Nginx 服务器状态
2.8 其他常见敏感文件
| 文件 | 说明 |
|---|---|
robots.txt |
可能泄露不想被爬取的敏感路径 |
sitemap.xml |
站点地图,可能泄露后台路径 |
crossdomain.xml |
Flash 跨域策略,可能配置不当 |
clientaccesspolicy.xml |
Silverlight 跨域策略 |
.travis.yml |
CI/CD 配置,可能含密钥 |
Dockerfile |
Docker 构建文件 |
docker-compose.yml |
Docker Compose 配置 |
composer.json |
PHP 依赖信息 |
package.json |
Node.js 项目信息 |
Gemfile |
Ruby 依赖信息 |
CHANGELOG.md |
版本变更记录 |
README.md |
项目说明文档 |
三、CTF 中常见的敏感文件发现方式
3.1 目录扫描(DirBuster / Dirsearch / ffuf)
使用工具批量扫描目录和文件:
bash
# dirsearch
python dirsearch.py -u http://target.com/ -e php,bak,txt,zip,old,swp,~,git,env
# ffuf
ffuf -u http://target.com/FUZZ -w wordlist.txt
# gobuster
gobuster dir -u http://target.com/ -w wordlist.txt -x php,txt,bak,zip
CTF 常用字典:
common.txtdirectory-list-2.3-medium.txt- 包含备份后缀的专项字典
- 包含
.git、.svn的版本控制字典
3.2 手工探测常见路径
针对性地尝试常见备份文件:
index.php.bak
index.php~
index.php.swp
index.php.old
index.php.save
index.bak
.zip
.tar.gz
.sql
尝试版本控制目录:
/.git/
/.svn/
/.DS_Store
尝试配置文件:
/.env
/config.php.bak
/application.properties
/wp-config.php.bak
3.3 robots.txt / sitemap.xml 分析
有时题目在 robots.txt 中故意留下线索:
User-agent: *
Disallow: /admin/
Disallow: /backup/
Disallow: /flag.txt
直接访问这些路径可能会有发现。
四、CTF 实战示例
4.1 场景一:备份文件泄露
题目描述:一个简单的 PHP 网站,只有首页。目标是获取 Flag。
步骤:
-
信息收集
访问首页,查看源代码无异常。尝试访问常见备份文件。
-
探测备份文件
/index.php.bak → 404 /index.php~ → 200,下载到 vim 备份文件 -
查看备份源码
index.php~中包含数据库连接代码和 Flag 验证逻辑:php<?php $flag = 'flag{backup_file_leak}'; // 或者从数据库中查询 $db_pass = 'admin123'; ?> -
拿到 Flag :直接提交
flag{backup_file_leak}。
4.2 场景二:.git 泄露
题目描述:一个网站,页面简单。给出提示"开发者可能忘记了一些事情"。
步骤:
-
探测 .git 目录
访问
/.git/HEAD,返回ref: refs/heads/master,确认存在 .git 泄露。 -
使用工具下载还原
bashpython GitHack.py http://target.com/.git/得到完整源码。
-
分析源码
查看
index.php,发现有一段被注释掉的代码:php// TODO: 删除测试代码 // $flag = 'flag{g1t_l3ak_1s_d4ng3r0us}'; -
查看 Git 提交历史
bashgit log git show <commit-id>在某次历史提交中发现 Flag。
4.3 场景三:.env 泄露
题目描述:Laravel 框架的网站,页面 500 错误。
步骤:
-
探测配置文件
访问
/.env,返回环境配置文件内容:APP_KEY=base64:xxx DB_PASSWORD=supersecret FLAG=flag{env_l3ak_c0nfig} -
直接获得 Flag。
4.4 场景四:源码泄露 + 代码审计
题目描述 :网站存在文件上传功能但做了过滤。目标:Getshell 读取 /flag。
步骤:
-
发现源码泄露
访问
/index.php.bak,下载源码。 -
审计上传逻辑
php$blacklist = ['php', 'phtml', 'pht']; $ext = pathinfo($filename, PATHINFO_EXTENSION); if (in_array($ext, $blacklist)) { die('不允许'); }发现黑名单不包含
.phar和.shtml。 -
绕过上传
上传
shell.phar(内容为<?php system('cat /flag');?>),成功。 -
访问上传文件
http://target.com/uploads/shell.phar,代码执行,获得 Flag。
五、敏感文件泄露的防御措施
-
关闭目录索引 :Apache 中
Options -Indexes,Nginx 中移除autoindex on。 -
删除备份和临时文件 :部署后清理
.bak、~、.swp、.old等文件,建立清理脚本。 -
不部署版本控制目录 :
.git、.svn不应出现在 Web 目录,可通过.htaccess或 Nginx 规则禁止访问:# Apache RewriteRule ^(.*/)?\.git/ - [F,L] # Nginx location ~ /\.git { deny all; } -
配置文件保护:
.env文件放置于 Web 目录之外- 使用
.htaccess禁止访问.*文件 - Nginx 禁止访问隐藏文件:
location ~ /\. { deny all; }
-
运维页面限制 IP 访问 :
phpinfo.php、phpmyadmin等只允许内网访问。 -
日志文件放在 Web 目录之外,或设置正确的权限。
-
最小权限原则:敏感文件的文件权限应设为 Web 用户不可读(如果不需要)。
-
部署检查清单:上线前检查是否遗留在开发过程中的临时文件。
六、总结
- 敏感文件泄露本质是运维疏忽和配置不当,而非代码漏洞,但危害同样严重。
- CTF 中考察的是信息收集能力 和对常见泄露场景的熟悉程度。
- 核心套路:目录扫描 → 备份文件探测 → 版本控制还原 → 配置文件读取 → 源码审计 → 漏洞利用。
.git泄露和.env泄露是 CTF 中最常见的高危泄露场景。- 防御措施简单但容易被忽视,属于"低级错误"类型。