dirsearch 目录扫描实战:从 CTF 卡壳到渗透测试工作流
简介dirsearch-master.zip 是一款基于 Python3 开发的 Web 目录扫描工具源码包面向渗透测试人员、安全研究者及 CTF 参赛选手用于探测服务器上未公开的隐藏目录与敏感文件帮助发现潜在漏洞与关键信息。压缩包共 88 个文件约 194KB以 64 个 py 脚本为核心实现扫描逻辑辅以 md 说明文档、txt 字典与黑名单、yml 工作流配置、conf 与 Dockerfile 部署文件及少量 png 图标资源目录结构清晰涵盖 lib、tests、reports 等模块。目前已有 2011 人学习下载。读者可获得完整可运行的目录扫描工具源码理解多线程扫描、自定义字典、结果导出 CSV/HTML/JSON 等机制并借助内置字典与配置快速投入 CTF 实战或安全评估同时参考文档掌握参数调优与扫描策略提升信息收集效率。1. 从一次 CTF 卡壳说起dirsearch 到底能帮你做什么打 CTF 的时候最让人难受的不是漏洞不会挖而是你连入口在哪都不知道。Web 题给你一个域名首页干干净净源码里没注释robots.txt 也写得规规矩矩这时候很多人就卡住了。我见过太多队伍在这一步耗掉半小时最后发现后台路径是/admin/login.php或者备份文件叫www.zip纯粹是没扫出来。dirsearch 就是干这个的——它是一个用 Python 写的目录与文件扫描工具通过字典爆破的方式把目标站点上可能存在但没被链接暴露的路径找出来。这份dirsearch-master.zip是它的源码包解压即用不需要编译Python 环境跑起来就能开工。它适合谁打 CTF 的、做渗透测试授权的、搞资产梳理的都算。它的核心价值在于字典可换、线程可调、状态码可过滤、结果可导出比手搓 requests 循环靠谱得多。但要注意它只是一个扫描器扫不扫得到取决于你的字典质量和参数配置这一点后面会反复提到。2. 解压之后先别急着扫环境、依赖与目录结构2.1 源码包长什么样哪些文件值得看把dirsearch-master.zip解压后你会看到一个典型的 Python 项目结构。根目录下有dirsearch.py这个入口脚本lib/目录里是核心逻辑db/目录存放字典文件reports/是默认的结果输出位置。很多人解压完直接python dirsearch.py -u xxx就跑了结果报一堆 ModuleNotFoundError然后开始怀疑包有问题。其实先花两分钟看一眼requirements.txt能省掉后面很多麻烦。常见做法是解压后先cd进目录看一眼requirements.txt里列了哪些依赖。通常包括requests、urllib3、charset_normalizer这类网络请求和编码处理库。这些不是标准库必须手动装。我一般会先建一个虚拟环境避免污染系统 Python尤其是你机器上还跑着其他项目的时候。# 解压源码包 unzip dirsearch-master.zip cd dirsearch-master # 创建并激活虚拟环境Linux/macOS python3 -m venv venv source venv/bin/activate # Windows 下激活命令是 venv\Scripts\activate # 安装依赖 pip install -r requirements.txt这段命令的逻辑很直白先解压再进目录然后隔离环境装依赖。参数上唯一需要注意的是 Python 版本建议 3.7 以上太低版本某些语法会报错。虚拟环境不是必须的但如果你不想因为版本冲突把系统环境搞乱这一步值得做。装完依赖后可以用python dirsearch.py -h验证一下是否能正常打印帮助信息能打印就说明环境没问题。2.2 字典文件在哪默认字典够不够用db/目录是 dirsearch 的字典仓库里面通常有dicc.txt这样的默认字典。这个默认字典覆盖了一些常见路径比如admin、login、backup、config等。但说实话默认字典在 CTF 里经常不够用因为出题人会故意用一些偏门路径比如secret_area、fl4g、hint.txt这种。所以真正打比赛的时候我一般会准备几份自己的字典按场景切换。字典的加载方式有两种一种是用-w参数指定自定义字典路径另一种是把字典文件放进db/目录然后用--wordlist引用。常见做法是维护一个自己的字典目录里面按用途分类比如common.txt放通用路径ctf.txt放比赛常见路径backup.txt专门扫备份文件。这样切换起来很快不用每次临时拼。提示字典的编码格式要注意有些字典是 GBK 编码dirsearch 默认按 UTF-8 读遇到乱码会报错。遇到这种情况先用file命令看一下编码必要时用iconv转成 UTF-8。2.3 第一次跑通最小可用命令与输出解读环境装好、字典确认之后就可以跑第一次扫描了。最小可用命令其实很简单# 最基础的扫描命令 python dirsearch.py -u http://example.com -e php,html,js # -u 指定目标 URL # -e 指定要扫描的扩展名不写则只扫目录这条命令的意思是对http://example.com进行扫描除了目录之外还尝试拼接.php、.html、.js这三种扩展名。输出结果里你会看到类似200、301、302、403这样的状态码。200表示存在且可访问301/302表示重定向403表示存在但禁止访问。很多人只盯着200看其实403和301同样有价值403往往意味着目录存在但需要权限301可能指向一个真实目录。第一次跑的时候建议把线程调低一点比如-t 10先看看目标站点的响应情况。有些站点有 WAF线程一高就直接封 IP后面什么都扫不到。等确认稳定了再逐步往上加。输出结果默认只打印在终端如果想保存下来慢慢看加-o参数指定输出文件格式可以是txt、json、html等。3. 参数怎么调线程、超时、状态码过滤与递归3.1 线程与超时扫得快和扫得稳之间的取舍dirsearch 默认线程数是 30这个值在本地测试或者目标响应很快的时候没问题但在真实网络环境里往往偏高。线程越高请求越密集目标服务器压力越大触发 WAF 或限流的概率也越高。我一般会按目标类型分档CTF 比赛环境通常比较宽松可以用-t 30甚至-t 50真实授权测试环境建议从-t 10起步观察响应后再调整。超时参数是--timeout默认是 7.5 秒。这个值在目标响应慢的时候需要调大比如--timeout 15。但调太大也有副作用如果目标挂了每个请求都要等满超时时间整体扫描会变得极慢。常见做法是配合--retries使用比如--retries 2表示失败重试两次这样偶尔的网络抖动不会直接丢掉一个路径。# 保守配置低线程、适中超时、重试两次 python dirsearch.py -u http://example.com -e php -t 10 --timeout 10 --retries 2 # 激进配置高线程、短超时适合 CTF 内网环境 python dirsearch.py -u http://example.com -e php -t 50 --timeout 5参数之间是有关联的线程高的时候超时可以适当调低因为并发请求本身会分摊等待时间线程低的时候超时反而要留足否则容易误判。这个平衡点没有固定公式得根据目标响应情况试。3.2 状态码过滤为什么你扫出一堆 404 和 400默认情况下dirsearch 会把所有状态码的结果都打印出来包括404。但404通常意味着路径不存在打印出来只会淹没真正有价值的结果。所以实际使用中几乎都会加状态码过滤。常见做法是排除404只保留200、301、302、403这些。# 排除 404只关注有意义的状态码 python dirsearch.py -u http://example.com -e php --exclude-status 404 # 也可以只保留特定状态码 python dirsearch.py -u http://example.com -e php --include-status 200,301,302,403这里有个坑有些站点对不存在的路径返回200但页面内容是一个自定义的错误页。这种情况下光看状态码会误判。dirsearch 提供了--exclude-text参数可以按页面内容过滤比如--exclude-text not found把包含这个字符串的响应排除掉。这个参数在遇到“软 404”的时候特别有用。3.3 递归扫描与扩展名策略别让字典白跑递归扫描是-r参数开启后 dirsearch 会对扫到的目录继续往下扫。这个功能很强大但也很容易失控。比如你扫到一个/admin/目录递归进去可能又扫到/admin/user/再递归下去可能没完没了。所以递归一般要配合--recursion-depth限制层数比如--recursion-depth 2只递归两层。扩展名策略是另一个影响命中率的关键。-e参数后面跟的扩展名列表决定了 dirsearch 在扫目录的同时还会尝试拼接哪些后缀。CTF 里常见的后缀包括php、html、js、txt、zip、bak、swp。其中bak和swp是备份文件和编辑器临时文件经常能捡漏。但扩展名加得越多请求量越大扫描时间也越长。我一般会分两轮第一轮只扫目录第二轮针对性地加扩展名。# 第一轮只扫目录快速摸清结构 python dirsearch.py -u http://example.com -t 20 --exclude-status 404 # 第二轮加扩展名重点找备份和源码 python dirsearch.py -u http://example.com -e php,bak,zip,txt -t 20 --exclude-status 404注意-e参数里的扩展名不要带点写php而不是.php否则 dirsearch 会拼成..php扫不到东西。4. 避坑与排查那些让我重扫三次的坑4.1 扫不到任何结果但浏览器能打开现象命令跑完了终端只显示几个404但你在浏览器里手动访问某个路径是能打开的。原因通常有两个一是目标站点对 dirsearch 的 User-Agent 做了拦截返回了假404二是字典里根本没有那个路径。解决办法先用--random-agent随机 UA 试试如果还不行就换字典。我遇到过一种情况目标站点对python-requests这个默认 UA 直接返回403换成浏览器 UA 就正常了。4.2 扫描速度突然变慢大量请求超时现象一开始扫得挺快跑了几百个请求之后突然变慢大量超时。原因一般是目标站点做了限流或者你的线程太高把对方打挂了。解决办法立刻降线程加--timeout并且加--retries。如果确认是限流可以加--delay参数比如--delay 0.5每个请求之间等 0.5 秒。这个参数会拖慢整体速度但能保证扫描不被中断。4.3 结果里出现大量 200但全是同一个页面现象扫出来一堆200点进去发现全是首页或者同一个错误页。原因目标站点配置了“软 404”对所有不存在的路径都返回200加首页内容。解决办法用--exclude-text过滤掉首页的特征字符串或者用--exclude-size按响应大小过滤。常见做法是先手动访问一个肯定不存在的路径比如/thispathnotexist123看返回的页面大小和内容特征然后把这个特征加到过滤参数里。4.4 递归扫描把磁盘写满报告文件巨大现象开了-r递归之后reports/目录下的文件迅速膨胀几分钟就几百 MB。原因递归层数没限制加上状态码没过滤每个404都写进了报告。解决办法递归必须配--recursion-depth同时加--exclude-status 404并且定期清理reports/目录。我一般会在命令里直接加-o /tmp/scan.txt把输出写到临时目录避免占满项目目录。4.5 字典里有中文路径扫出来全是乱码现象字典里包含中文路径比如/管理后台/扫出来的结果全是乱码。原因URL 编码问题中文路径需要先做 URL 编码才能正确请求。解决办法用--encode参数或者在字典里直接把中文路径写成 URL 编码形式。常见做法是维护字典时就用编码后的形式避免运行时再处理。5. 进阶技巧把 dirsearch 塞进你的工作流5.1 用 Python 脚本批量调度 dirsearch单次扫描用命令行就够了但如果你要扫一批目标手动敲命令就太慢了。我一般会写一个简单的 Python 脚本读取目标列表循环调用 dirsearch并把结果按目标名分别保存。这样跑一晚上第二天直接看报告。import subprocess import os # 目标列表每行一个 URL targets [ http://target1.example.com, http://target2.example.com, ] # 输出目录 output_dir scan_results os.makedirs(output_dir, exist_okTrue) for target in targets: # 从 URL 中提取一个安全的文件名 name target.replace(http://, ).replace(https://, ).replace(/, _) output_file os.path.join(output_dir, f{name}.txt) # 构造 dirsearch 命令 cmd [ python, dirsearch.py, -u, target, -e, php,html,js,bak,zip, -t, 15, --timeout, 10, --exclude-status, 404, -o, output_file, ] # 执行命令 print(f[*] Scanning {target} ...) subprocess.run(cmd, checkFalse) print([*] All scans finished.)这段脚本的逻辑是遍历目标列表为每个目标生成一个输出文件名然后调用 dirsearch 并传入固定参数。参数上-t 15和--timeout 10是保守配置适合批量扫描时避免触发限流。checkFalse表示即使某个目标扫描失败脚本也会继续跑下一个不会中断。跑完之后scan_results/目录下就是每个目标对应的报告文件。5.2 结果二次处理从报告里快速提取高价值路径dirsearch 输出的报告是纯文本直接看没问题但如果目标多、结果多就需要二次过滤。我一般会用grep快速筛出200和403的路径然后按目录层级排序优先看浅层路径。# 从报告中提取状态码为 200 或 403 的行 grep -E 200|403 scan_results/target1.txt | sort # 只看目录以 / 结尾的路径 grep -E 200|403 scan_results/target1.txt | grep /$ | sort这两条命令的作用是第一条把所有有意义的状态码行筛出来并排序第二条进一步只保留目录路径。实际用的时候我会先看目录因为目录往往意味着更大的攻击面然后再看具体文件。这个习惯帮我省了很多时间尤其是在结果几百条的时候。5.3 字典维护把每次扫到的新路径沉淀下来最后说一个我坚持了很久的习惯每次扫到新的、有价值的路径就把它追加到自己的字典里。比如某次扫到一个/api/v2/internal/下次遇到类似目标这个路径就可能直接命中。字典不是下载来就完事的它是需要养的。我一般会按目标类型分几个字典文件每次扫完花两分钟把新路径归类追加进去。时间长了这份字典的命中率会明显高于任何默认字典。从那以后我每次拿到新目标都强制先跑一轮低线程扫描摸结构再根据结果决定要不要加扩展名和递归。这个顺序看起来慢实际上比一上来就高线程猛扫要快得多因为少了很多无效请求和封 IP 的后悔药。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

基于PJ85718DM与STM32F427ZI的本地+远程双路温度监测系统设计与实现

基于PJ85718DM与STM32F427ZI的本地+远程双路温度监测系统设计与实现

1. 项目缘起与整体设计思路嵌入式温度监测这个方向,看起来简单,实际上坑特别多。我最早接触这类需求是在一个HVAC控制柜的项目里,当时的需求很朴素:本地要能看到机房回风温度,远程中控室也要能实时拿到数据&#xff0c…

2026/10/11 2:15:55 阅读更多 →
PJ85718DM与PIC18F4550在HVAC温控系统中的工业级协同设计

PJ85718DM与PIC18F4550在HVAC温控系统中的工业级协同设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 2:15:55 阅读更多 →
MFC可拖动菜单栏实现:CControlBar派生与停靠系统深度解析

MFC可拖动菜单栏实现:CControlBar派生与停靠系统深度解析

简介:本资源是一个基于VC开发的可拖动工具栏菜单实现示例,面向Windows桌面应用初学者与界面开发实践者,解决传统静态工具栏缺乏交互灵活性的问题。代码支持将含图标按钮和菜单的工具栏从主窗口中拖出,自由悬浮于屏幕任意位置&…

2026/10/11 2:15:55 阅读更多 →

最新新闻

数据可用性与代码仓库声明也要双版本烟测:三列表 + A/B 验收表

数据可用性与代码仓库声明也要双版本烟测:三列表 + A/B 验收表

千笔-AIWritePaper https://www.aiwritepaper.com 「数据可应要求提供」「代码见附件」在抽查时经常落空。本文用三列表把声明钉到可打开的产物,并做 A/B 与伪 B 烟测。示例全部使用本地假仓库路径,不放公网 URL(_w/data-avail-ab/fake_repo…

2026/10/11 3:06:23 阅读更多 →
MySQL驱动配置与连接池调优指南:从超时风暴到生产级排查

MySQL驱动配置与连接池调优指南:从超时风暴到生产级排查

最近在维护一个订单系统的时候,半夜被监控告警吵醒——数据库连接池突然被打满,业务接口大面积超时。重启应用后恢复了十几分钟,又被打满。翻了一宿日志和监控之后,发现根子不在SQL,也不在数据库负载,而是出…

2026/10/11 3:06:22 阅读更多 →
RAG 在 Agent 中的作用:从向量检索到 Coding Agent 的代码理解

RAG 在 Agent 中的作用:从向量检索到 Coding Agent 的代码理解

RAG 在 Agent 中的作用:从向量检索到 Coding Agent 的代码理解 1. 前言 前面几篇分别学习了: Agent Harness:Agent 为什么需要外围控制机制?Agent Loop:Agent 如何不断执行任务?Tool Calling:LL…

2026/10/11 3:06:22 阅读更多 →
基于PJ85718DM与STM32F405RG的远程温度采集方案设计与实现

基于PJ85718DM与STM32F405RG的远程温度采集方案设计与实现

1. 从一个温度采集需求说起:为什么选 PJ85718DM 加 STM32F405RG嵌入式温度监测这个方向,看起来简单,真做起来坑不少。我前后做过好几个环境监测类的项目,从最早的 NTC 热敏电阻加分压电阻直接进 ADC,到后来用专用温度传…

2026/10/11 3:06:22 阅读更多 →
MoE 遇上消费级显卡:动态路由专家权重,12GB 怎么装下 125B 不爆显存

MoE 遇上消费级显卡:动态路由专家权重,12GB 怎么装下 125B 不爆显存

MoE 遇上消费级显卡:动态路由专家权重,12GB 怎么装下 125B 不爆显存 【免费下载链接】Strata Qwen3.8-Flash-Next on any consumer hardware: one-click install for Windows / Linux. Strata inference engine, OpenAI/Anthropic API on localhost, opt…

2026/10/11 3:06:22 阅读更多 →
云智变AI问卷设计实测:你需要的不是一个“扩写器”,而是一台“翻译器”

云智变AI问卷设计实测:你需要的不是一个“扩写器”,而是一台“翻译器”

先说一个你可能经历过的场景 导师看完你的问卷,沉默了三秒,然后问了一句:“你确定受访者看得懂这道题在问什么?” 你当时点头了。等问卷收回来200份,发现有一半的答案全是“C”——不是受访者敷衍,是你那…

2026/10/11 3:05:22 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →