简介:这是一份面向渗透测试初学者与安全从业者的字典资源合集,聚焦框架信息泄露、备份文件泄露与配置文件泄露等常见漏洞场景,可用于目录扫描、子域名枚举、弱口令爆破及备份文件探测等实战环节。压缩包共收录204个文件,以171个txt字典为主体,辅以Python脚本、Markdown说明、CSV与Excel表格等,整体约32.48MB,涵盖目录字典、子域名字典、备份文件名字典、弱口令字典与用户名字典等类别,其中备份文件名字典支持文件名与后缀组合访问,便于加载至Burp等工具进行测试。目前已有51人学习下载。资源还包含Dorks列表、默认口令表与凭据示例等辅助内容,目录结构清晰,适合按模块检索取用,帮助读者在信息收集阶段快速构建测试字典集,提升漏洞发现效率。
1. 渗透字典到底在打什么:从框架泄露到备份文件的那条暗线
很多人第一次拿到一个叫「渗透字典」的压缩包,脑子里想的是爆破后台、跑目录、怼登录口。但真正在一线干活的人都知道,字典的价值不在“量大”,而在“打得准”。你手里那本字典,如果里面塞的是admin、123456、test这种通用词,那它跟网上随便下的没区别。真正让渗透字典变得值钱的,是它能不能命中目标系统在开发、部署、运维过程中留下的框架信息泄露、备份文件泄露、配置文件泄露这三类痕迹。
这三类泄露有个共同点:它们不是漏洞,而是“习惯”。开发图省事,把.git目录扔在 Web 根目录;运维图方便,把application.yml、database.php、config.json直接放在可访问路径;备份脚本把www.zip、backup.tar.gz生成在站点目录下忘了删。这些文件不会主动喊“我在这里”,但字典可以帮你把它们翻出来。所以这篇不是讲怎么“爆破”,而是讲怎么用一本结构合理的渗透字典,把这三类泄露从“碰运气”变成“可复现的排查流程”。适合谁看?适合已经会跑 dirsearch、ffuf,但命中率忽高忽低,想搞清楚字典该怎么组织、路径该怎么拼、响应该怎么判的人。
2. 框架信息泄露:字典里该放哪些路径,怎么读响应
2.1 框架泄露的本质是“默认路径没清”
框架信息泄露不是框架本身的漏洞,而是框架在初始化、调试、打包时留下的默认文件和目录。比如 Laravel 的.env、ThinkPHP 的application/config.php、Spring Boot 的application.properties、Django 的settings.py备份、Vue/React 打包后的js/app.js.map。这些文件如果被 Web 服务器直接返回,攻击者就能拿到数据库账号、密钥、内网地址,甚至直接连上生产库。
我一般把框架泄露分成三类来建字典条目:
- 配置文件类:
.env、.env.bak、config.php、config.json、settings.py、application.yml、application-dev.properties - 版本与调试类:
composer.json、package.json、yarn.lock、phpinfo.php、debug.log、storage/logs/laravel.log - 源码映射类:
app.js.map、main.css.map、vendor.js.map、webpack.config.js
这些路径不是拍脑袋想的,而是从框架官方文档、默认脚手架、常见部署脚本里提炼出来的。你手里的字典如果只有admin、login,那框架泄露这块基本是空白。
2.2 用 ffuf 跑框架路径的最小命令
下面这条命令是我在确认目标用了某个框架后,专门跑框架泄露路径的。字典文件假设叫framework_leak.txt,里面每行一个路径,不带域名。
ffuf -w framework_leak.txt \ -u https://target.com/FUZZ \ -mc 200,301,302,403 \ -fc 404 \ -t 30 \ -timeout 8 \ -o framework_result.json \ -of json逻辑说明:-w指定字典;-u里FUZZ是替换位;-mc只保留这些状态码,因为框架泄露文件往往返回 200,但也可能因为权限返回 403,403 本身也说明文件存在;-fc过滤掉 404,减少噪音;-t 30是并发,内网可以拉到 50,公网建议 20 到 30,避免被 WAF 封;-timeout 8是单请求超时,框架文件有时响应慢,给 8 秒比较稳;-o和-of输出 JSON,方便后面用 jq 过滤。
参数怎么改:如果目标有 CDN,-t降到 10 到 15;如果返回大量 302 到登录页,把-mc里的 302 去掉,只看 200 和 403;如果字典里路径很多,加-rate 100限制每秒请求数。
2.3 响应里怎么判断“真泄露”而不是“假 200”
很多站点会配置自定义 404 页面,返回 200 但内容是“页面不存在”。这时候只看状态码会翻车。我一般会做两件事:
第一,先请求一个绝对不存在的路径,比如/this_should_not_exist_12345,记录它的响应长度和内容特征。然后在 ffuf 里加-fs过滤掉这个长度。比如:
ffuf -w framework_leak.txt \ -u https://target.com/FUZZ \ -mc 200 \ -fs 1234 \ -t 20这里的1234就是那个不存在路径的响应字节数。如果框架泄露文件返回的字节数明显不同,就会被保留下来。
第二,对命中结果手动验证。比如命中/.env,直接 curl 看内容:
curl -s https://target.com/.env | head -50如果返回的是APP_NAME=Laravel、DB_PASSWORD=xxx这种,那就是真泄露。如果返回的是 HTML 登录页,那就是假 200,把这条路径从字典里标记为“该目标不适用”,但不要从字典里删掉,换个目标可能就中了。
提示:框架泄露字典不要只放一套。ThinkPHP、Laravel、Spring Boot、Django 的默认路径差异很大,我一般按框架分文件,跑的时候根据指纹选对应字典,命中率比混在一起高很多。
3. 备份文件泄露:字典怎么拼、怎么绕、怎么验证
3.1 备份文件的名字有规律,但规律不止一种
备份文件泄露是三类里最“玄学”的,因为命名习惯太分散。但分散不等于没规律。我把它归纳成四种命名模式:
- 域名/站名 + 后缀:
target.com.zip、target_com.tar.gz、www.target.com.rar - 日期 + 后缀:
20240101.zip、backup-2024-01-01.sql、www_20240101.tar.gz - 固定词 + 后缀:
backup.zip、www.zip、web.rar、site.tar.gz、db.sql - 路径变形:
/backup/、/bak/、/old/、/.backup/、/temp/下的上述文件名
字典如果只写backup.zip,那只能命中最低级的配置。真正好用的备份字典,是把“前缀词 × 后缀词 × 目录词”做组合。但组合爆炸会拖慢扫描,所以我的做法是:先跑高频固定词,再跑域名相关词,最后跑日期词。
3.2 用 dirsearch 跑备份文件的分层命令
dirsearch 对备份文件的支持比较顺手,因为它自带一些备份扩展名。但我一般会自定义字典,分三轮跑。
第一轮,高频固定词:
dirsearch -u https://target.com \ -e zip,rar,tar.gz,sql,bak,7z \ -w backup_common.txt \ --random-agents \ -t 20 \ --timeout=8 \ -o backup_round1.txt-e指定扩展名,dirsearch 会自动把字典里的词加上这些后缀。backup_common.txt里放的是backup、www、web、site、db、data、sql、dump这些词。--random-agents是随机 UA,降低被识别概率。-t 20并发,--timeout=8超时。
第二轮,域名相关词。先把域名里的点换成下划线、横线、直接拼接,生成几个变体:
echo "target.com" | sed 's/\./_/g' > domain_variants.txt echo "target.com" | sed 's/\./-/g' >> domain_variants.txt echo "target.com" | sed 's/\.//g' >> domain_variants.txt然后把这些变体作为字典跑:
dirsearch -u https://target.com \ -e zip,rar,tar.gz,sql \ -w domain_variants.txt \ -t 15 \ --timeout=8第三轮,日期词。这个范围大,我一般只跑最近两年,按月生成:
for y in 2023 2024; do for m in 01 02 03 04 05 06 07 08 09 10 11 12; do echo "${y}${m}" echo "${y}-${m}" echo "${y}_${m}" done done > date_variants.txt然后用这个字典配合扩展名跑。日期词命中率不高,但一旦命中就是完整的数据库或源码包,值得花时间。
3.3 备份文件验证:不要只看状态码,要看文件头
备份文件经常返回 200,但内容可能是 HTML 错误页。验证方法是看文件头。比如:
curl -s -I https://target.com/backup.zip看Content-Type和Content-Length。如果Content-Type是application/zip或application/octet-stream,且Content-Length很大,那基本是真的。如果Content-Type是text/html,那可能是假 200。
更稳的方法是下载前几个字节:
curl -s -r 0-100 https://target.com/backup.zip | xxd | headZIP 文件头是PK,RAR 是Rar!,GZIP 是1f 8b,SQL 文件通常以--或/*开头。看到这些魔数,再决定要不要完整下载。
注意:下载备份文件可能涉及法律边界,只在授权测试或自己拥有的资产上操作。未授权下载可能构成违法行为。
4. 配置文件泄露:字典里最值钱的几行,和最容易忽略的变形
4.1 配置文件泄露的字典要按“语言 + 框架 + 部署方式”三层组织
配置文件泄露比框架泄露更具体,因为它直接对应技术栈。我一般把配置字典分成三层:
- 语言层:
php.ini、web.config、.htaccess、nginx.conf、httpd.conf - 框架层:
application.yml、application.properties、settings.py、config/database.php、config/app.php - 部署层:
.env、.env.local、.env.production、docker-compose.yml、Dockerfile、k8s-deployment.yaml
这三层里,.env和application.yml是命中率最高、危害最大的。.env里通常有数据库密码、Redis 密码、API Key;application.yml里可能有数据库连接串、第三方服务密钥。
4.2 用 ffuf 跑配置文件字典,并处理 403 和 302
配置文件经常因为权限配置返回 403,但 403 不代表不存在。我跑的时候会把 403 也保留,然后手动验证。
ffuf -w config_leak.txt \ -u https://target.com/FUZZ \ -mc 200,403 \ -fc 404 \ -t 25 \ -timeout 10 \ -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \ -o config_result.json \ -of json-H加一个常见 UA,有些 WAF 对空 UA 或 curl 默认 UA 直接拦。-mc 200,403保留 403,因为 403 说明路径存在但被拒绝,可以尝试路径变形或大小写变形。
4.3 配置文件泄露的路径变形:大小写、后缀、目录穿越
配置文件字典不能只写标准路径。我一般会加这些变形:
- 大小写变形:
.ENV、.Env、Config.php、CONFIG.PHP - 后缀变形:
.env.bak、.env~、.env.swp、.env.save、config.php.bak、config.php.old - 目录变形:
/config/.env、/app/.env、/backend/.env、/api/.env - 编码变形:
%2e%65%6e%76(即.env的 URL 编码)
这些变形在字典里可以单独成文件,也可以在主字典里加几行。我一般单独放一个config_bypass.txt,在标准字典跑完没结果时再跑。
4.4 命中配置文件后怎么快速提取关键信息
命中.env或application.yml后,不要急着全量下载。先用 grep 提取关键字段:
curl -s https://target.com/.env | grep -Ei "pass|secret|key|token|db_|redis|mysql|host"如果是application.yml:
curl -s https://target.com/application.yml | grep -Ei "password|secret|key|url|username|host"这样能快速判断泄露的严重程度。如果里面有生产数据库密码,那这个点的价值就很高;如果只是APP_ENV=local,那价值有限。
提示:配置文件泄露的字典要定期更新。不同框架版本会新增或改名配置文件,比如 Spring Boot 2.4 之后
bootstrap.yml的使用方式变了,字典里最好把新旧都放上。
5. 避坑与排查:字典跑得动,但结果不对的 5 个常见原因
5.1 现象:字典跑了几万条,一个 200 都没有
原因:目标用了自定义 404,所有路径都返回 200,但 ffuf 默认只显示 200,你看到的“没有结果”其实是过滤条件设错了。或者目标有 WAF,所有请求被拦,返回 403 或 302,但你把 403 过滤掉了。
解决:先跑一个不存在的路径,看返回什么状态码和长度。如果返回 200,用-fs过滤长度;如果返回 403,把-mc加上 403;如果返回 302,看 302 跳到哪里,如果是登录页,把 302 也保留,手动验证。
5.2 现象:命中了.env,但内容是 HTML
原因:目标配置了伪静态或重写规则,所有请求都转发到index.php,返回首页 HTML。这时候状态码是 200,但内容不是配置文件。
解决:用curl -s看内容前几行,如果是<!DOCTYPE html>或<html>,就是假命中。把这条路径标记为“该目标不适用”,但不要从字典删掉。同时检查是否有X-Powered-By或Server头,确认技术栈后再换字典。
5.3 现象:备份文件下载到一半断了
原因:文件太大,或者服务器限制了下载速度,或者 WAF 检测到大量下载行为后中断连接。
解决:用curl -C -断点续传,或者用wget -c。如果还是断,用-r分片下载,每次下 1MB,合并。但要注意,分片下载可能触发更多告警,授权测试里要控制频率。
5.4 现象:配置文件字典跑到了 403,但手动访问却返回 200
原因:ffuf 的并发太高,触发了服务器的速率限制,返回 403。手动访问时频率低,所以返回 200。
解决:降低-t到 5 到 10,加-rate 20限制每秒请求数,加-p 0.5每个请求之间暂停 0.5 秒。如果还不行,换 IP 或换时间段。
5.5 现象:字典里明明有backup.zip,但就是跑不出来
原因:备份文件不在 Web 根目录,而在子目录里,比如/static/backup.zip、/uploads/backup.zip。或者备份文件被重命名为随机字符串,字典里没有。
解决:先跑目录字典,找到可疑目录,再在目录下跑备份文件字典。另外,检查robots.txt、sitemap.xml、crossdomain.xml,这些文件里有时会泄露备份路径。还可以看 JS 文件里的注释和 API 路径,有时会提到备份目录。
6. 把字典用活:从“跑一遍”到“按目标定制”的进阶习惯
6.1 先指纹,再选字典,不要一套字典打天下
我见过很多人拿一个几万行的字典从头跑到尾,跑完没结果就换目标。效率极低。我的习惯是:先花 30 秒确认目标技术栈。看Server头、X-Powered-By、Set-Cookie里的框架特征、HTML 里的generator标签、/favicon.ico的哈希。确认是 Spring Boot 后,只跑 Spring Boot 相关的配置和备份字典;确认是 ThinkPHP 后,只跑 ThinkPHP 的路径。这样字典行数可能从几万降到几百,但命中率反而更高。
6.2 字典要分层:核心字典、扩展字典、变形字典
我一般把字典分成三个文件:
| 字典类型 | 行数范围 | 用途 | 跑的顺序 |
|---|---|---|---|
| 核心字典 | 50 到 200 行 | 最高频的框架、备份、配置路径 | 第一轮,必跑 |
| 扩展字典 | 500 到 2000 行 | 按框架和语言细分的路径 | 第二轮,根据指纹选跑 |
| 变形字典 | 100 到 500 行 | 大小写、后缀、编码变形 | 第三轮,前两轮没结果时跑 |
核心字典要精,每一条都是血泪经验换来的。扩展字典要全,覆盖主流框架。变形字典要巧,针对 WAF 和权限绕过。
6.3 用响应长度和内容特征做二次过滤
ffuf 和 dirsearch 都支持按响应长度过滤,但长度会变。更稳的方法是抓取响应内容里的关键词。比如配置文件里通常有password、secret、key、database;备份文件返回的Content-Type通常是application/zip或application/octet-stream。我一般会在跑完后用脚本二次过滤:
cat config_result.json | jq -r '.results[] | select(.length > 500) | .url' > filtered_urls.txt然后用curl逐个检查内容特征。这一步能过滤掉 80% 的假阳性。
6.4 记录每个目标的“字典命中档案”
这是我自己的习惯:每测一个目标,记录哪些字典条目命中了、哪些没命中、哪些返回了异常状态码。下次遇到同类目标,直接把命中过的条目提到核心字典,把没命中的降权。时间长了,你的核心字典会越来越准,跑一个目标可能只需要几十个请求就能找到泄露点。
提示:字典不是越大越好。一个 200 行的精准字典,比一个 20000 行的通用字典更值得投入时间维护。
6.5 最后说一个我踩过的坑
早期我跑备份文件,看到backup.zip返回 200 就兴奋,直接下载,结果下载下来是一个 1KB 的 HTML 文件,里面写着“Access Denied”。后来我养成了一个习惯:任何命中,先看文件头,再看 Content-Type,最后才决定要不要下载。这个习惯帮我省了很多时间和流量,也避免了很多无效的“发现”。渗透字典这个东西,说到底不是比谁跑得快,而是比谁看得准。希望帮到你。
本文还有配套的精品资源,点击获取