从零写一个 Python 目录扫描器学习笔记作者boz-ling项目地址https://github.com/boz-ling/dirbuster前言这篇文章记录我从零开始写一个 Web 目录扫描器的过程。代码已经放到了 GitHubhttps://github.com/boz-ling/dirbuster为什么写目录扫描器目录扫描是渗透测试中信息收集的重要一步。通过爆破常见的目录和文件名可以快速了解目标网站的资产结构发现隐藏的管理后台admin/、manager/找到敏感文件.git/、.env、robots.txt识别备份文件backup.zip、db.sql现成的工具有很多dirb、gobuster、ffuf但自己写一遍才能真正理解它的原理。第一版单线程10 条路径最开始我写了一个极其简单的版本importrequests TARGEThttp://example.comWORDLIST[admin,login,config,backup,phpinfo.php]forpathinWORDLIST:urlTARGET/path rrequests.get(url)print(f[{r.status_code}]{url})就跑通了 10 条路径。这一步虽然简单但让我理解了核心逻辑拼 URL → 发请求 → 看状态码。第二版并发 字典文件10 条路径单线程跑还行但要跑几百上千条就太慢了。我加上了ThreadPoolExecutorfromconcurrent.futuresimportThreadPoolExecutor,as_completedwithThreadPoolExecutor(max_workers20)asexecutor:futures{executor.submit(check_path,path):pathforpathinpaths}forfutureinas_completed(futures):# 处理结果同时把字典从代码里抽出来单独放到common.txt里。我从网上收集了 351 条常见的路径覆盖了后台路径、敏感文件、备份文件、API 端点等。这一版的提升很明显351 条路径20 线程并发跑完不到 2 秒。第三版命令行参数为了让工具更像一个正经的 CLI 工具我加了argparse支持python dirbuster.py-uhttp://target.com-wcommon.txt-t50-oresult.txt参数设计参考了 gobuster 和 dirb 的习惯让用过类似工具的人能立刻上手。这一版我还加了响应大小显示扫描耗时计时进度提示每 200 条输出一次第四版状态码筛选默认情况下工具会显示 200/301/302/401/403/500 等状态码。但有时候我只想看 200 的页面确认可访问或者只看 403 的目录可能隐藏了内容于是加上了-s参数python dirbuster.py-uhttp://target.com-wcommon.txt-s200,403做这一步时遇到了一个小坑302 重定向到登录页的路径要不要显示我最终决定默认显示因为重定向也说明这个路径存在只是需要登录或认证。第五版递归扫描这是最复杂的一版。当扫到一个目录比如admin/、config/时自动把它作为新目标继续往下扫。defis_directory(code,path):# 判断路径是不是目录# 403 或 200 且以 / 结尾 → 可能是目录一开始有个 bug.htaccess返回 403 被当成目录递归了结果多扫了几百次无意义的请求。后来加了文件扩展名黑名单才算修好。第六版异常处理之前的版本有个问题如果目标超时或连接拒绝程序不会提示原因。我加上了详细的错误分类连接超时 vs 读取超时连接拒绝 vs 其他错误SSL 错误CtrlC 优雅中断现在跑完会显示统计信息[*] 扫描结束! 耗时: 2.0s [*] 成功请求: 1404 [*] 超时: 0 [*] 发现路径: 16 个遇到的问题汇总问题原因解决全部报连接拒绝Apache 没启动检查 phpstudy 状态扫出奇怪的路径.htaccess被当成目录加文件扩展名黑名单CSV 格式乱码编码问题统一用 UTF-8线程开太多被封目标有限制加-t参数控制收获写这个工具最大的收获不是代码本身而是对目录扫描这个操作的理解深了一层状态码的意义— 200 不一定安全404 不一定不存在可能有自定义 404 页面并发与效率— 单线程 vs 多线程的区别以及对目标服务器的压力字典的重要性— 工具有多强取决于字典有多好异常处理— 网络安全工具必须能够应对各种网络状况下一步想做的事支持 HTML 报告输出集成 more 字典如 dirb 的 common.txt、big.txt自动识别自定义 404 页面避免误报支持代理配合 BurpSuite代码与链接GitHub: https://github.com/boz-ling/dirbuster字典文件common.txt351 条路径