渗透字典实战:精准挖掘框架、备份与配置文件泄露
2026/9/23 12:14:01 网站建设 项目流程

简介:这是一份面向渗透测试初学者与安全从业者的字典资源合集,聚焦框架信息泄露、备份文件泄露与配置文件泄露等常见漏洞场景,可用于目录扫描、子域名枚举、弱口令爆破及备份文件探测等实战环节。压缩包共收录204个文件,以171个txt字典为主体,辅以Python脚本、Markdown说明、CSV与Excel表格等,整体约32.48MB,涵盖目录字典、子域名字典、备份文件名字典、弱口令字典与用户名字典等类别,其中备份文件名字典支持文件名与后缀组合访问,便于加载至Burp等工具进行测试。目前已有51人学习下载。资源还包含Dorks列表、默认口令表与凭据示例等辅助内容,目录结构清晰,适合按模块检索取用,帮助读者在信息收集阶段快速构建测试字典集,提升漏洞发现效率。

1. 渗透字典到底在打什么:从框架泄露到备份文件的那条暗线

很多人第一次拿到一个叫「渗透字典」的压缩包,脑子里想的是爆破后台、跑目录、怼登录口。但真正在一线干活的人都知道,字典的价值不在“量大”,而在“打得准”。你手里那本字典,如果里面塞的是admin123456test这种通用词,那它跟网上随便下的没区别。真正让渗透字典变得值钱的,是它能不能命中目标系统在开发、部署、运维过程中留下的框架信息泄露、备份文件泄露、配置文件泄露这三类痕迹。

这三类泄露有个共同点:它们不是漏洞,而是“习惯”。开发图省事,把.git目录扔在 Web 根目录;运维图方便,把application.ymldatabase.phpconfig.json直接放在可访问路径;备份脚本把www.zipbackup.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.bakconfig.phpconfig.jsonsettings.pyapplication.ymlapplication-dev.properties
  • 版本与调试类composer.jsonpackage.jsonyarn.lockphpinfo.phpdebug.logstorage/logs/laravel.log
  • 源码映射类app.js.mapmain.css.mapvendor.js.mapwebpack.config.js

这些路径不是拍脑袋想的,而是从框架官方文档、默认脚手架、常见部署脚本里提炼出来的。你手里的字典如果只有adminlogin,那框架泄露这块基本是空白。

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指定字典;-uFUZZ是替换位;-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=LaravelDB_PASSWORD=xxx这种,那就是真泄露。如果返回的是 HTML 登录页,那就是假 200,把这条路径从字典里标记为“该目标不适用”,但不要从字典里删掉,换个目标可能就中了。

提示:框架泄露字典不要只放一套。ThinkPHP、Laravel、Spring Boot、Django 的默认路径差异很大,我一般按框架分文件,跑的时候根据指纹选对应字典,命中率比混在一起高很多。

3. 备份文件泄露:字典怎么拼、怎么绕、怎么验证

3.1 备份文件的名字有规律,但规律不止一种

备份文件泄露是三类里最“玄学”的,因为命名习惯太分散。但分散不等于没规律。我把它归纳成四种命名模式:

  • 域名/站名 + 后缀target.com.ziptarget_com.tar.gzwww.target.com.rar
  • 日期 + 后缀20240101.zipbackup-2024-01-01.sqlwww_20240101.tar.gz
  • 固定词 + 后缀backup.zipwww.zipweb.rarsite.tar.gzdb.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里放的是backupwwwwebsitedbdatasqldump这些词。--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-TypeContent-Length。如果Content-Typeapplication/zipapplication/octet-stream,且Content-Length很大,那基本是真的。如果Content-Typetext/html,那可能是假 200。

更稳的方法是下载前几个字节:

curl -s -r 0-100 https://target.com/backup.zip | xxd | head

ZIP 文件头是PK,RAR 是Rar!,GZIP 是1f 8b,SQL 文件通常以--/*开头。看到这些魔数,再决定要不要完整下载。

注意:下载备份文件可能涉及法律边界,只在授权测试或自己拥有的资产上操作。未授权下载可能构成违法行为。

4. 配置文件泄露:字典里最值钱的几行,和最容易忽略的变形

4.1 配置文件泄露的字典要按“语言 + 框架 + 部署方式”三层组织

配置文件泄露比框架泄露更具体,因为它直接对应技术栈。我一般把配置字典分成三层:

  • 语言层php.iniweb.config.htaccessnginx.confhttpd.conf
  • 框架层application.ymlapplication.propertiessettings.pyconfig/database.phpconfig/app.php
  • 部署层.env.env.local.env.productiondocker-compose.ymlDockerfilek8s-deployment.yaml

这三层里,.envapplication.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.EnvConfig.phpCONFIG.PHP
  • 后缀变形.env.bak.env~.env.swp.env.saveconfig.php.bakconfig.php.old
  • 目录变形/config/.env/app/.env/backend/.env/api/.env
  • 编码变形%2e%65%6e%76(即.env的 URL 编码)

这些变形在字典里可以单独成文件,也可以在主字典里加几行。我一般单独放一个config_bypass.txt,在标准字典跑完没结果时再跑。

4.4 命中配置文件后怎么快速提取关键信息

命中.envapplication.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-ByServer头,确认技术栈后再换字典。

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.txtsitemap.xmlcrossdomain.xml,这些文件里有时会泄露备份路径。还可以看 JS 文件里的注释和 API 路径,有时会提到备份目录。

6. 把字典用活:从“跑一遍”到“按目标定制”的进阶习惯

6.1 先指纹,再选字典,不要一套字典打天下

我见过很多人拿一个几万行的字典从头跑到尾,跑完没结果就换目标。效率极低。我的习惯是:先花 30 秒确认目标技术栈。看Server头、X-Powered-BySet-Cookie里的框架特征、HTML 里的generator标签、/favicon.ico的哈希。确认是 Spring Boot 后,只跑 Spring Boot 相关的配置和备份字典;确认是 ThinkPHP 后,只跑 ThinkPHP 的路径。这样字典行数可能从几万降到几百,但命中率反而更高。

6.2 字典要分层:核心字典、扩展字典、变形字典

我一般把字典分成三个文件:

字典类型行数范围用途跑的顺序
核心字典50 到 200 行最高频的框架、备份、配置路径第一轮,必跑
扩展字典500 到 2000 行按框架和语言细分的路径第二轮,根据指纹选跑
变形字典100 到 500 行大小写、后缀、编码变形第三轮,前两轮没结果时跑

核心字典要精,每一条都是血泪经验换来的。扩展字典要全,覆盖主流框架。变形字典要巧,针对 WAF 和权限绕过。

6.3 用响应长度和内容特征做二次过滤

ffuf 和 dirsearch 都支持按响应长度过滤,但长度会变。更稳的方法是抓取响应内容里的关键词。比如配置文件里通常有passwordsecretkeydatabase;备份文件返回的Content-Type通常是application/zipapplication/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,最后才决定要不要下载。这个习惯帮我省了很多时间和流量,也避免了很多无效的“发现”。渗透字典这个东西,说到底不是比谁跑得快,而是比谁看得准。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询