ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

渗透字典实战:精准挖掘框架、备份与配置文件泄露

渗透字典实战:精准挖掘框架、备份与配置文件泄露 简介这是一份面向渗透测试初学者与安全从业者的字典资源合集聚焦框架信息泄露、备份文件泄露与配置文件泄露等常见漏洞场景可用于目录扫描、子域名枚举、弱口令爆破及备份文件探测等实战环节。压缩包共收录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但也可能因为权限返回 403403 本身也说明文件存在-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_NAMELaravel、DB_PASSWORDxxx这种那就是真泄露。如果返回的是 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 \ --timeout8 \ -o backup_round1.txt-e指定扩展名dirsearch 会自动把字典里的词加上这些后缀。backup_common.txt里放的是backup、www、web、site、db、data、sql、dump这些词。--random-agents是随机 UA降低被识别概率。-t 20并发--timeout8超时。第二轮域名相关词。先把域名里的点换成下划线、横线、直接拼接生成几个变体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 \ --timeout8第三轮日期词。这个范围大我一般只跑最近两年按月生成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 文件头是PKRAR 是Rar!GZIP 是1f 8bSQL 文件通常以--或/*开头。看到这些魔数再决定要不要完整下载。注意下载备份文件可能涉及法律边界只在授权测试或自己拥有的资产上操作。未授权下载可能构成违法行为。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 Keyapplication.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.ymlcurl -s https://target.com/application.yml | grep -Ei password|secret|key|url|username|host这样能快速判断泄露的严重程度。如果里面有生产数据库密码那这个点的价值就很高如果只是APP_ENVlocal那价值有限。提示配置文件泄露的字典要定期更新。不同框架版本会新增或改名配置文件比如 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最后才决定要不要下载。这个习惯帮我省了很多时间和流量也避免了很多无效的“发现”。渗透字典这个东西说到底不是比谁跑得快而是比谁看得准。希望帮到你。本文还有配套的精品资源点击获取
返回列表